ILA(Integrated Logic Analyzer)IP Core 是 vivado 的调试核,具体如何创建、调用就不详说了。这里主要记录一个 ILA 的使用技巧,可以大大提高调试效率。
在 Program Device 后,如果添加了 ILA 核,则会出现以下的调试界面
在界面右下方的 Trigger 界面,可以设置触发点,‘+’、‘-’ 分别可以增加、删除触发信号,当满足触发条件时,ILA 会将触发点前后一段的数据抓取并显示。
默认情况下,对于深度为 Length 的 ILA 核,触发点会在 Length/2 处,前后分别抓取 Length/2 个数据,这对于大部分的时序分析已经足够了。
然而对于一些变化缓慢的信号,Quartus 中的 Signal Tap 可以使用对应的缓慢时钟取抓取,但在 vivado 中 ILA 时钟必须是自由时钟(即外接晶振的时钟)或者由 PLL IP 输出的时钟(PLL 最低可以输出 5M),而不能使用用户计数分频产生的衍生时钟。这样一来,如何抓取缓变信号(例如以 UART 传输的数据报的内容),就成为一个问题。
所以重点来了(敲黑板),在 ILA 调试界面的左下 Settings 窗口中,如下图
可以看到几个设置项,Number of windows 项是设置采样窗口的数量(比如这里设为 10 个窗口),Window data depth 设置每个采样窗口的长度(我这里设为了 512),Trigger position in window 是设置在每个窗口中触发点的位置(比如我这里设为 255,对应第 256 个采样点(这个值是从 0 开始的)),则在运行一次 ILA 抓取后,可以看到生成了 10 个黑灰相间的窗口,每个窗口长 512,每个窗口中的触发点(T 红色竖线)都位于当前窗口的第 256 个采样点处。
如此,抓取缓变信号就很简单了,比如要抓取 UART 传输的数据报内容,就可以把 UART_rx_done 信号作为触发信号,然后设置合适的采样窗口数和窗长,监控 UART_rddat[7:0],这样在执行一次 ILA 后,就可以获得整个报文的字节内容了。