在线逻辑分析仪借用了传统逻辑分析仪的理念以及大部分的功能,并利用 FPGA 中的逻辑资源,将这些功能植入到 FPGA 的设计当中。一般地,在线逻辑分析仪的应用原理框图如下图所示:
待测设计(Design Under Test,DUT)就是用户逻辑,它和片内的在线逻辑分析仪都位于 FPGA中。在线逻辑分析仪通过一个或多个探针(Probe)来采集希望观察的信号,然后通过片内的 JTAG 硬核组件,来将捕获到的数据传送给下载器,进而上传到 Vivado IDE 以供用户查看。Vivado IDE 也能够按照上述数据路径,反向地向 FPGA 中的在线逻辑分析仪传送一些控制信息。
在 Vivado 中,在线逻辑分析仪的功能被称为“集成逻辑分析器(Integrated Logic Analyzer,ILA)”,它以 IP 核的形式来加入到用户设计中。。Vivado 提供了三种具有不同集成层次的插入 ILA 方法,主要为以下两种:
第一种方法是直接在 HDL 代码中例化一个 ILA IP 核,也被称为“HDL 实例化调试探针流程”,这是集成层次最高的方法。ILA IP 核可以在 IP Catalog(IP 目录)中找到,并对其进行配置,以符合所需的调试需求。这是最直接的方法,但其灵活性也较差。在调试工作完毕之后,还需要在 HDL 源代码中删除 ILA IP核,然后重新综合并实现,以生成最终的比特流。
第二种方法是在综合后的网表中,分别标记要进行调试观察的各个信号,然后通过一个简单的“Setup Debug”向导来设置各个探针和 ILA IP 核的工作参数,然后工具会根据用户设置的参数,自动地生成各个ILA IP 核。这个方法也被称为“网表插入调试探针流程”。在此流程中,用户不需要修改 HDL 源代码,并且能够单独控制每个 ILA IP 核以及每个探针,这样就提供了很大的灵活性。用户设置的调试信息会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中,在实现阶段,Vivado 会读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户就可以在综合后的网表中删除 ILA IP 核,或者在XDC 文件中删除调试命令,然后再对设计进行实现,以生成最终的比特流。
“HDL 实例化调试探针流程”需要在 HDL 源代码中实例化 ILA IP 核,点击“IP Catalog”按钮,搜索栏中输入“ILA”,这时 Vivado 会自动根据关键词搜索出相应的结果,我们双击“ILA(Integrated Logic Analyzer)”,如下图所示:
下来会弹出“ILA IP”核的配置页面,如下图所示:
|
|
IP 核的配置包含两个子页面,分别是“General Options”和“Probe_Ports(0…0)”, “General Options” 页面用于设置 ILA IP 核的总体设置,“Probe_Ports(0…0)”页面用于对每个探针的参数进行设置。
在“General Options”页面中,“Number of Probes”一栏用于设置所需的探针数量,一般地,一个探针用于连接一个待测信号。“Sample Data Depth”用于设置采样深度,在每个采样时钟下,ILA 都会将捕获到的探针信号的值送入RAM 中。
在“Probe_Ports(0…0)”页面中,用于设置每个探针的参数,一般我们只需设置探针宽度“Probe Width [1…4096]”一栏即可。
点击“Generate”即可,此时Vivado 就开始对该 ILA IP 核进行 OOC 综合了。
Vivado 的 OOC(Out-of-Context)综合,它们独立于顶层设计而单独综合,OOC 模块只会在综合顶层之前被综合一次,这样在顶层的设计迭代过程中,OOC 模块就不必跟随顶层模块,而一次次的产生相同结果的多余综合了。所以,OOC 流程减少了设计的周期,并消除了设计迭代,使您可以保存和重用综合结果。
将图中的红色方框中的模板代码复制并粘贴到 led_twinkle.v 顶层 HDL 代码中,并将 ILA 的时钟和探针信号连接到顶层设计中,例化 ILA IP 核的代码如下:
ila_0 u_ila_0 (
.clk(sys_clk), // input wire clk
.probe0(sys_rst_n), // input wire [0:0] probe0
.probe1(led), // input wire [1:0] probe1
.probe2(cnt) // input wire [25:0] probe2
);
保存源文件之后就可以直接综合并实现设计,最后生成比特流。至此,我们就成功地使用“HDL 实例化调试探针流程”将 ILA IP 核添加到了设计中。接下来就可以将比特流下载到 FPGA 中,并对信号进行在线观察。
生成比特流之后,我们打开 Hardware Manager,连接到开发板,并下载比特流。在弹出的窗口中,Vivado 会自动识别比特流文件和具有调试探针信息的.ltx 文件。
.ltx 文件存储了调试探针的信息,用来传递给 Vivado IDE,它是从我们的设计中被提取出来的。若实现后的设计中包含了ILA IP 核,则在下载比特流时,Vivado 会自动识别出.ltx 文件。
直接点击“Program”,此时 Vivado 会自动打开 ILA 的调试窗口,如下图所示:
下面开始触发条件的设置,在这里简要介绍一个触发的概念。前面我们介绍过,ILA 会将所采集到的探针数据存放在 RAM 中,然后通过 JTAG 和下载器上传到 Vivado。那么触发就是决定 ILA 会在什么时候将 RAM 中的探针值数据上传到 Vivado,当 ILA 检测到触发条件得到满足时,就会把 RAM 中的探针值数据上载到 Vivado,然后 Vivado 将探针数据的波形显示出来。
然后我们就可以开始进行触发动作了。在波形窗口中有 4 个触发动作,如下图所示
从左至右依次是:(1)自动触发开关、(2)开始触发、(3)立即触发、(4)停止触发。
我们这里直接点击“开始触发”按钮,而不打开“自动触发”开关。然后由于 cnt 计数器每隔 500ms就会计数到 25_000_000,所以我们几乎马上就可以看到波形窗口中出现了波形,如下图所示:
添加复位信号,设置为下降沿触发,等待复位信号
复位键按下,立即更新窗口信息
网表插入调试探针流程需要在综合后的网表中,将要进行调试观察的各个信号标记“mark_debug”属性,然后通过“Setup Debug”向导来设置 ILA IP 核的参数,最后工具会根据参数来自动创建 ILA IP 核。
可以在综合之后的网表中手动选择网络并点击“mark_debug”按钮;也可以在综合之前在 HDL 代码中为想要观察的 reg 或 wire 信号添加“Mark Debug”综合属性,例如:
(* mark_debug = “true” *)reg [25:0] cnt ;
(* mark_debug = “true” )” 必须紧挨在变量声明的前面。这样,在综合完成之后并打开综合后的设计时,cnt 信号就自动被标记了“Mark Debug”属性。此外,被添加了(mark_debug = “true” )属性的 reg或 wire 信号不会被工具优化掉。
|
|
在“Debug”子窗口中的“Debug Cores”选项卡中,可以看到 Vivado已经添加了 ILA IP 核。
在“网表插入调试探针流程”中,用户设置的调试信息最终会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中。Vivado 会从 XDC 约束文件中读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。
至此,我们就成功地使用“网表插入调试探针流程”将 ILA IP 核添加到了设计中。接下来就可以实现设计并生成比特流,最后将比特流下载到 FPGA 中,以对信号进行在线观察。
操作方法和“HDL 实例化调试探针”的观察波形信号一样,没有任何区别.