使用Vivado软件进行硬件调试

文章目录

  • 前言
  • 一、例化ILA IP核调试
  • 二、在网表中添加探针调试
  • 总结


前言

本文的主要内容是使用Vivado软件进行硬件的调试,介绍例化ILA IP核和在网表中添加探针这两种硬件调试的方法,重点是集成逻辑分析仪(ILA,Integrated Logic Analyzer)的使用,本文是在上一篇文章:Vivado软件的使用——以led的交替闪烁为例 的基础上进行的。


一、例化ILA IP核调试

首先打开LED交替闪烁的工程文件夹led_twinkle,并且双击led_twinkle.xpr文件直接打开Vivado软件。
使用Vivado软件进行硬件调试_第1张图片
在打开Vivado软件的过程中会在该工程文件夹下生成以下几个新文件。
使用Vivado软件进行硬件调试_第2张图片
软件打开以后先点击IP Catalog(IP目录),然后在对应的搜索框内输入ILA,选中Debug下的ILA(Integrated Logic Analyzer),双击即可。
使用Vivado软件进行硬件调试_第3张图片
接着就跳转到了ILA的配置界面。
使用Vivado软件进行硬件调试_第4张图片
探针数量根据代码以及自身需求自己设置,这个例子中包括复位信号、LED灯和时钟计数器,所以这里的探针数量设置为3。采样深度在探针数量较少时设置的大一点,在探针数量较多时设置的小一点,否则可能导致片上存储器的数量不够用,因此这里的采样深度应当灵活设置。该界面中其他参数保持默认即可。
接下来对各个探针的宽度进行设置,这里的探针宽度应与代码中的宽度保持一致。
使用Vivado软件进行硬件调试_第5张图片
对应的Verilog代码部分如下:

module led_twinkle(
    input  sys_clk,  //系统时钟
    input  sys_rst_n,  //系统复位,低电平有效 1位
    output  [1:0]  led   //LED灯 2位
);
reg  [25:0]  cnt ;  //时钟计数器 26位

以上部分设置好以后直接点击OK即可,在弹出的下面对话框中,综合选项一般选择Out of context per IP,这样耗时较少。如果选择Global,在每次生成比特流文件时都会对IP核进行编译,耗时较长。在运行设置中,数量选择所能显示的最大。
使用Vivado软件进行硬件调试_第6张图片
然后点击Generate等待生成即可,这个过程耗时较长,判断该过程完成与否要看底部Design Runs中的ila_0_synth_1的状态,不能看右上角,这里即使是完成了也一直在转。
使用Vivado软件进行硬件调试_第7张图片
接下来例化IP核,按照下图中序号依次操作,复制模板代码到led_twinkle.v文件中。
使用Vivado软件进行硬件调试_第8张图片
添加后led_twinkle.v中的代码如下:

//该代码来自正点原子
module led_twinkle(
    input          sys_clk  ,  //系统时钟
    input          sys_rst_n,  //系统复位,低电平有效
    output  [1:0]  led         //LED灯
);
//reg define
reg  [25:0]  cnt ;
//*****************************************************
//**                    main code
//*****************************************************
//对计数器的值进行判断,以输出LED的状态
assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
//assign led = (cnt < 26'd5)         ? 2'b01 : 2'b10 ;  //仅用于仿真
//计数器在0~5000_000之间进行计数
always @ (posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt <= 26'd0;
    else if(cnt < 26'd5000_0000)
//  else if(cnt < 26'd10)  //仅用于仿真
        cnt <= cnt + 1'b1;
    else
        cnt <= 26'd0;
end

ila_0 your_instance_name (
	.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
);
endmodule

保存后点击Generate Bitstream来生成比特流文件,这个过程较长,耐心等待其完成即可。
使用Vivado软件进行硬件调试_第9张图片
接下来需要连接开发板,并给其上电,将比特流文件以及包含探针的调试文件下载到开发板。其中led_twinkle.bit是比特流文件,led_twinkle.ltx文件是调试探针的文件,里面包含了用于调试的探针信息。
使用Vivado软件进行硬件调试_第10张图片
注意下载程序这里与上一篇文章相比,多了一个调试探针文件led_twinkle.ltx。
下载成功以后,开发板的运行结果如下图所示。

在Vivado软件中出现了hw_ila_1文件,这个文件就是我们用来观察波形的文件。
使用Vivado软件进行硬件调试_第11张图片
图中圈中的 + 号可以添加想要观察的信号, 在选中某个信号的前提下 - 号可以将其移除。
在这里插入图片描述
上图中从左至右依次为:连续触发、开始触发、立即触发、停止触发。
点击开始触发按钮,然后按加号放大。
使用Vivado软件进行硬件调试_第12张图片
如何调整进制呢,如下图,选中所有信号,并且右击依次选择Radix—>Unsigned Decimal使信号以无符号的十进制显示。
使用Vivado软件进行硬件调试_第13张图片
调整为无符号的十进制之后的波形如下图所示。
使用Vivado软件进行硬件调试_第14张图片
led的值为2,说明是10,即led1为1,led0为0,即在捕捉的瞬间,led1亮,led2灭。
如果先按连续触发按钮,再按开始触发按钮,则波形每隔一段时间就会自动触发一次,要想其不再连续触发,需要先按停止触发,再按连续触发按钮结束连续触发。
如果要观察led在跳转的一瞬间各值的变化情况,需要先将cnt信号拖到右下方的框中,设置其值为0000000,然后点击开始触发按钮,缩小图直至红线出现,将游标拖动到红线位置处再放大图,可以看到,在led跳转的一瞬间,计数器从50000000跳转为0,led的值由2变为1,即从10变为01,实现了led的交替闪烁。最终的呈现图如下。
使用Vivado软件进行硬件调试_第15张图片
也可以将复位信号拖进来,并设置为下降沿触发(F),点击开始触发按钮,ILA的状态显示为等待触发。再按下开发板上的复位按键,查看波形即可。
使用Vivado软件进行硬件调试_第16张图片
调试完成后,右击PROGRAM AND DEBUG,点击close即可。
使用Vivado软件进行硬件调试_第17张图片
右击ila_0,选择Remove File from Project…,在弹出的框中勾选从磁盘中删除选项,点击OK即可。
使用Vivado软件进行硬件调试_第18张图片
在Verilog代码中删除掉用于调试的部分,如下图所示。
使用Vivado软件进行硬件调试_第19张图片
保存后再次点击Generate Bitstream来生成比特流文件,等待完成后再次下载,显示如下错误提示没有找到led_twinkle.ltx文件。
使用Vivado软件进行硬件调试_第20张图片
解决办法:在下载时删除掉Debug中的文件使其保持空白即可,如下图所示,点击clear按钮即可清除该文件。
使用Vivado软件进行硬件调试_第21张图片
再次下载就没有问题了,开发板的结果仍然为两个led灯交替闪烁,结果可参考前面的动图。
添加调试代码后的资源使用情况如下图所示。
使用Vivado软件进行硬件调试_第22张图片
移除掉调试代码后的资源使用情况如下图所示。
使用Vivado软件进行硬件调试_第23张图片
对比两个图可知,在有调试代码时的资源消耗比较大,因此,我们在以后调试完成后需要将调试代码删除掉再分析综合生成比特流文件,这样才会占用或消耗更少的资源。
通过例化ILA IP核进行硬件调试的内容到这里就结束了。


二、在网表中添加探针调试

程序在综合后点击Open Synthesized Design打开网表。(因为生成比特流文件时已经综合过了,所以这里不再重复进行相应的操作,如果是新的工程,需要先综合再打开网表)
使用Vivado软件进行硬件调试_第24张图片
打开后在右上角选择Debug选项。
使用Vivado软件进行硬件调试_第25张图片
这里就出现了原理图文件,如下图所示。
使用Vivado软件进行硬件调试_第26张图片
依次找到复位信号,led信号,选中右键,Mark Debug添加到下方的Debug框内。
使用Vivado软件进行硬件调试_第27张图片
添加完成的结果如下图,但是我们在代码中定义的时钟计数器cnt为26位,而这里只有20位,这是因为Vivado软件为了节省资源而对我们的代码进行了优化,这里显示的就是优化后的。
使用Vivado软件进行硬件调试_第28张图片
为了防止软件自动优化,可以在Verilog代码中添加如下语句。

(*mark_debug = "true"*) reg  [25:0]  cnt ;

因为这里只是对cnt优化了,所以只改这一行代码即可,其他的代码不变,保存后重新综合。
在综合过程中,弹出的对话框一律选择蓝色按钮即可,等待其综合完成。
使用Vivado软件进行硬件调试_第29张图片
综合完成后重新打开网表,可以看到,cnt信号已经被自动加到Debug框中了(代码中添加的mark_debug就代表调试属性),位数为26位,没有被优化。
点击Set Up Debug,一直Next到最后Finish即可。
使用Vivado软件进行硬件调试_第30张图片
完成后Ctrl+S保存,点击OK,如下图所示。
使用Vivado软件进行硬件调试_第31张图片
保存之后,右击SYNTHESIS,close即可。
使用Vivado软件进行硬件调试_第32张图片
Constraints下的led_twinkle.xdc文件中除了最先分配的管脚信息外,还有许多其他的调试信息就是在刚才综合过程中所生成的。led_twinkle.xdc中的代码如下。

set_property PACKAGE_PIN M14 [get_ports {led[1]}]
set_property PACKAGE_PIN M15 [get_ports {led[0]}]
set_property PACKAGE_PIN U18 [get_ports sys_clk]
set_property PACKAGE_PIN N16 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]

set_property MARK_DEBUG true [get_nets {led_OBUF[0]}]
set_property MARK_DEBUG true [get_nets {led_OBUF[1]}]
set_property MARK_DEBUG true [get_nets sys_rst_n_IBUF]

create_debug_core u_ila_0 ila
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
set_property port_width 1 [get_debug_ports u_ila_0/clk]
connect_debug_port u_ila_0/clk [get_nets [list sys_clk_IBUF_BUFG]]
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
set_property port_width 26 [get_debug_ports u_ila_0/probe0]
connect_debug_port u_ila_0/probe0 [get_nets [list {cnt[0]} {cnt[1]} {cnt[2]} {cnt[3]} {cnt[4]} {cnt[5]} {cnt[6]} {cnt[7]} {cnt[8]} {cnt[9]} {cnt[10]} {cnt[11]} {cnt[12]} {cnt[13]} {cnt[14]} {cnt[15]} {cnt[16]} {cnt[17]} {cnt[18]} {cnt[19]} {cnt[20]} {cnt[21]} {cnt[22]} {cnt[23]} {cnt[24]} {cnt[25]}]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
set_property port_width 2 [get_debug_ports u_ila_0/probe1]
connect_debug_port u_ila_0/probe1 [get_nets [list {led_OBUF[0]} {led_OBUF[1]}]]
create_debug_port u_ila_0 probe
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
set_property port_width 1 [get_debug_ports u_ila_0/probe2]
connect_debug_port u_ila_0/probe2 [get_nets [list sys_rst_n_IBUF]]
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
connect_debug_port dbg_hub/clk [get_nets sys_clk_IBUF_BUFG]

接下来点击Generate Bitstream来生成比特流文件,下载到开发板。
使用Vivado软件进行硬件调试_第33张图片
到这里就和前面例化ILA IP核调试的方法一致了,这里不再赘述。
添加调试信息后的资源消耗情况如下图所示。
使用Vivado软件进行硬件调试_第34张图片
调试完成后,删除掉led_twinkle.v文件和led_twinkle.xdc文件中和调试有关的代码,保存后重新生成比特流文件。
删除掉调试代码后的资源消耗情况如下图所示。
使用Vivado软件进行硬件调试_第35张图片
通过在网表中添加探针进行调试的内容到这里就结束了。


总结

以上就是使用Vivado软件进行硬件调试的所有内容了,本文介绍了例化ILA IP核和在网表中添加探针进行硬件调试这两种方法,其中,在网表中添加探针进行硬件调试这种方法对源代码的改动较小,较之例化ILA IP核的方法操作更为简单。本文参考视频为:https://www.bilibili.com/video/BV1hP4y1L73N?p=11 & https://www.bilibili.com/video/BV1hP4y1L73N?p=12。

你可能感兴趣的:(zynq,zynq)