FIFO读写ILA在线调试

yummy 阅读:498 2022-04-30 16:29:21 评论:0

一、实验目的

    实现在线调试FPGA的IP核ILA,在FPGA运行的时候抓取逻辑信号波形做分析。

二、ZYNQ工程建立

image.png

三、新建Verilog文档

image.png

  1. 搜索 IP Catalog

    image.png

  2. 调用一个FIFO的IP

    image.png

  3. 双击,进行FIFO配置,BASIC保持不变

    image.png

  4. Native Ports 修改如下,点击OK,生成IP

    image.png

    5. 点击OK

      image.png

   6. 点击generate

     image.png

  7. 点击OK

    image.png

  8. 我们点击IP核左边的箭头展开, 找到IP顶层文件双击打开,可以看到,这个FIFO的顶层代码为VHDL。

   image.png

  9. 接着我们添加ILA逻辑分析模块。点击IP Catalog,Search输入ILA,然后双击打开进行ILA 的配置工作

  image.png

10 . General Option配置

     image.png

11 . Probe配置,我们需要采样大概十几个信号线信号,所以写入25个,然后点击OK,点击Generate生成IP输出文件。

   image.png

12 . Sources 窗口中的ila_0 IP就被添加进来了。点击ila_0 IP核左边箭头展开,等待展开完成,可以看到一 个顶层ila_0.v文件,打开即可看到模块接口信号。我们将它例化到fifo_ila_debug模块中。

image.png

13.代码

 

//////////////////////////////////////////////////////////////////////////////////

// Company: 

// Engineer: yu meng ya

// 

// Create Date: 2022/04/30 16:38:46

// Design Name: FIFO读写ILA调试

// Module Name: fifo_ila_debug

// Project Name: 

// Target Devices: 

// Tool Versions: 

// Description: 

// 

// Dependencies: 

// 

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

// 

//////////////////////////////////////////////////////////////////////////////////


module fifo_ila_debug(

    input wire clk,

    input wire rstn

    );

    parameter STATE_IDLE='d0;

    parameter STATE_WRITE='d1;

    parameter STATE_READ='d2;

    

    parameter CLK_FREQ=50000000;//input clk 50m

    

    reg [31:0]counter_reg;

    reg [3:0]system_state_reg;

    reg [9:0]state_timeout_reg;

    

    reg [7:0]write_data_reg;

    wire[7:0] read_data;

    wire [7:0]write_data;

    reg read_en_reg;

    reg write_en_reg;

    wire is_write_read_flag;

    wire fifo_full;

    wire fifo_empty;


    wire [24:0]ila_probe0;

    wire read_en;

    wire write_en;

    wire [3:0]system_state;

    

    assign read_en=read_en_reg;

    assign write_en=write_en_reg;

    assign system_state=system_state_reg;

    assign write_data[7:0]=write_data_reg[7:0];

    assign is_write_read_flag=(system_state[3:0]==STATE_IDLE)?'b0:'b1;

    

    assign  ila_probe0[0]=is_write_read_flag;

    assign  ila_probe0[1]=write_en;

    assign  ila_probe0[2]=read_en;

    assign  ila_probe0[3]=fifo_full;

    assign  ila_probe0[4]=fifo_empty;   

    assign  ila_probe0[12:5]=write_data[7:0];

    assign  ila_probe0[20:13]=read_data[7:0];

    assign  ila_probe0[24:21]=system_state[3:0];

    //always block ,1s triger onece to read write

    always@(posedge clk or negedge rstn)begin

        if(rstn=='b0)begin

            counter_reg<='b0;

        end

        else begin

            if(counter_reg<(CLK_FREQ-'b1))counter_reg<=counter_reg+'b1;

            else counter_reg<='b0; 

        end

    end

   //state machine

    always@(posedge clk or negedge rstn)begin

        if(rstn=='b0)begin

            system_state_reg<='b0;

            state_timeout_reg<='b0;

        end

        else begin

           if(counter_reg==(CLK_FREQ-'b1))begin

                system_state_reg<=STATE_WRITE;

                state_timeout_reg<='b0;

           end

           else begin

                if(system_state_reg==STATE_WRITE)begin//write fifo state

                    if(state_timeout_reg<'d256)state_timeout_reg<=state_timeout_reg+'b1;

                    else begin

                         state_timeout_reg<='b0;

                         system_state_reg<=STATE_READ;

                    end

                end

                else  if(system_state_reg==STATE_READ)begin//read fifo state

                    if(state_timeout_reg<'d256)state_timeout_reg<=state_timeout_reg+'b1;

                    else begin

                         state_timeout_reg<='b0;

                         system_state_reg<=STATE_IDLE;

                    end

                end

           end

        end

    end   

   //write read logic generate

    always@(posedge clk or negedge rstn)begin

        if(rstn=='b0)begin

            write_data_reg<='b0;

        end

        else begin

            if(system_state_reg==STATE_WRITE)begin

                write_data_reg<=write_data_reg+'b1;

                read_en_reg='b0;

                write_en_reg<='b1;

            end

            else  if(system_state_reg==STATE_READ)begin

                write_data_reg<='b0;

                read_en_reg='b1;

                write_en_reg='b0;

            end

            else if(system_state_reg==STATE_IDLE)begin

                write_data_reg<='b0;

                read_en_reg='b0;

                write_en_reg='b0;

            end

        end

    end

    

    fifo_generator_0 fifo_generator_0_inst

    (

    .clk(clk),

    .srst(~rstn),

    .din(write_data),

    .wr_en(write_en),

    .rd_en(read_en),

    .dout(read_data),

    .full(fifo_full),

    .empty(fifo_empty)

    );

    

    ila_0 ila_0_inst

    (

    .clk(clk),

    .probe0(ila_probe0)

    );

endmodule

14.引脚绑定,点击open Elaborated Design

image.png

15.点击Auto Connect

 image.png

16.连接完成之后我们可以看到,Hardware下面找到了稳定芯片,已经连接上。

image.png

17.PROGRAM AND DEBUG下面的Program Device可以用了。我们点击Program Device,弹出右边的xc7010_1,点击它进行下载

image.png

18.点击Run synthesis进行综合,然后点击Generate Bitstream

image.png

19.我们点击Program Device,弹出右边的xc7010_1,点击它进行下载

然后,弹出对话框我们可以看到其实下载包含了两个文件。第一个文件是我们的比特文 件。第二个文件是我们的dug文件,由于调用了ILA模块,系统自动生成一个debug文件,如 果debug结束,不需要在线调试,将ILA模块删掉,这个下载对话框去掉debug文件,不用即可。我们点击program进行下载。


image.png

20.点击program

image.png

21.下载完成后就会弹出一个在线调试界面

image.png

22.接下来我们要对这些信号进行抓取。首先,信号抓取,需要一个触发条件。触发条件可以是某个状态,比如根信号是0还是1,即可马上开始触发采样,也可以是一个电平跳变,上升沿、下降沿等。我们分析代码可以知道,每隔一秒,状态机触发一次读写操作。我们有个信号,is_write_read_flag。这个逻辑当状态机处于读写操作时为1,而这个信号从0变成1的上升沿即代表开始写状态,写完256个时钟周期变为读状态,一共维持了512个周期。而我们ILA采样深度为1024,完全足够抓取到整个操作。首先我们来设置触发条件,点击Dashboard options 打开左边隐藏界面。

image.png

23. 然后,我们点击中间的+号添加触发信号

image.png

24.选择is_write_read_flag,点击OK

image.png

25.我们将value栏下拉,可以看到很多触发条件。我们选则R(0- to-1transition)这一项,代表这个信号上升沿跳变触发采样。

image.png

26. Settings窗口保持默认,triger position inwindow是指采样出来的触发 条件发生时刻在窗口的位置,我们默在中间,512,方便查看波形。Refresh rate默认500,指 的是波形刷新率。

image.png

27.点击图标,已经抓取到了波形

image.png


本文 zblog模板 原创,转载保留链接!网址:https://www.xn--zqqs03dbu6a.cn/?id=44

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。