对于已经通过了功能仿真的 Verilog HDL 电路,Download 到板端后,可以通过 Vivado 的 ILA 核进行在线调试,观察波形。ILA 核相当于在线的逻辑分析仪,ISE 上叫做 Chipscope,Vivado 下叫 ILA;

添加 ILA 核的方式比较简单,首先在 Vivado 集成环境中添加 ILA IP Core:

1、点击 IP Catalog,搜索 ila 核,双击 ILA 的 IP

这里,Verilog 源文件用一个简单的 LED 灯作为例子,源文件如下:

module pl_led(
    input sys_clk,
    input rst_n,
    output reg [3:0] led
    );
    parameter max_cnt = 32'd49999999;
    reg [31:0] timer_cnt;

    always @ (posedge sys_clk or negedge rst_n)
    begin
        if(!rst_n)
        begin
            timer_cnt <= 32'd0;
        end
        else
        begin
            if (timer_cnt < max_cnt) timer_cnt <= timer_cnt + 32'd1;
            else timer_cnt <= 32'd0;
        end
    end

    always @ (posedge sys_clk or negedge rst_n)
    begin
        if(!rst_n)
        begin
            led <= 4'b0000;
        end
        else
        begin
            if(timer_cnt == max_cnt) led <= ~led;
            else led <= led;
        end
    end

endmodule

一个 32bit 的 counter 计数器,50MHz 的外部时钟,LED 一秒钟亮,灭;

比如我们需要观察两个信号,一个是 counter 信号,另一个是 led 信号(led[3:0]),所以在双击 ILA IP Core 后,做如下配置:

使用两个 probe (即,探针),一个 probe 0 为查看 counter 计数器的值,另一个 probe 1 为 4bit 位宽的 led 的值;

点击 OK 后,在点击生成:

此刻在资源地方就可以看到这个 IP 了:

然后打开这个 ila 里面的 template 例化的例子:

直接拷贝下来到 Verilog 源码下面去,并将信号对应上:

module pl_led(
    input sys_clk,
    input rst_n,
    output reg [3:0] led
    );
    parameter max_cnt = 32'd49999999;
    reg [31:0] timer_cnt;

    always @ (posedge sys_clk or negedge rst_n)
    begin
        if(!rst_n)
        begin
            timer_cnt <= 32'd0;
        end
        else
        begin
            if (timer_cnt < max_cnt) timer_cnt <= timer_cnt + 32'd1;
            else timer_cnt <= 32'd0;
        end
    end

    always @ (posedge sys_clk or negedge rst_n)
    begin
        if(!rst_n)
        begin
            led <= 4'b0000;
        end
        else
        begin
            if(timer_cnt == max_cnt) led <= ~led;
            else led <= led;
        end
    end

// Add ILA Here
// Instant ila in source code
ila ila_inst(
    .clk(sys_clk),
    .probe0(timer_cnt),
    .probe1(led)
);

endmodule

OK,搞定,重新 Generate 生成 Bit Stream;

单板上电,打开 Open Hardware Manager 然后扫描 Target:

这里我用的是 ZYNQ-7000 的 7020 ;选择 xc7z020_1,右键 Program Device:

点击 Program 下载完毕后,出现在线调试的窗口:

点击左上的三角形,便开始采集波形,当然可以在右下角的窗口设置 Trigger ,这里我将 Trigger 设置成为 timer_cnt 等于 49999999 即,LED 翻转的时刻,设置好后,点击左上角的 RUN:

红色的 T,代表 Trigger ,即,timer_cnt 满足设置的条件

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐