ad604

Vivado Logic Analyzer的使用

0
阅读(5945)

chipscope中,通常有两种方法设置需要捕获的信号。
1.添加cdc文件,然后在网表中寻找并添加信号
2.添加ICON、ILA和VIO的IP Core

 

第一种方法,代码的修改量小,适当的保留设计的层级和网线名,图形化界面便于找到 
需要捕获的信号。

第二种方法,对代码的改动量大一些,同时需要熟悉相关IP的设置,优点是,可以控制 
ICON,并调用VIO。 

 

与之类似,Vivado也有着两种方法进行设置。
1.在综合后的网表中寻找相关信号,右键点开菜单,然后设置mark debug

2.添加ILA,VIO的IP Core

 

第一种方法与chipscope的第一种方法极为类似:
1.都需要综合后才能设置;
2.都需要保留一定的设计层级或者网线名来便于寻找信号;
3.并非所有信号都可以被捕获,不能捕获的信号,chipscope中是显示为灰色,vivado 
中是没有mark debug的选项在右键菜单中; 

 

第二种方法就更为类似了,vivado可以兼容ISE的IP,所以可以直接调用chipscope的相 
关IP,调试时也只是用Chipscope,另外可以使用Vivado自己的ILA IP,来进行设计, 
但最大的问题是Vivado不提供ICON的IP以供选择,进一步埋没了ICON的地位。 

 

另外,早起的Vivado IP Catalog提供ChipscopeICONILAVIO IP Core可以选择,目前已经取消了这些IP,只支持Vivado自己的ILA/VIO IP Core

这里提供一个非常简单的设计代码,用于Vivado Logic Analyzer的研究。

`timescale 1ns / 1ps

module Nexy_4 (
    input                   I_CLK,
    output      [3:0]       O_ST_COUNTER,
    output                  O_TIMECOUNTER_OUTPUT
    
);
    wire            CLK_100;
    
    clk_wiz_0 CLK_UNIT
    (
        .clk_in1    (I_CLK),      
        .clk_out1   (CLK_100),   
        .locked     ()
    );  
    
    
    reg     [7:0]   startup_counter = 'b0;

    always @ (posedge CLK_100)begin
        if(startup_counter == 8'b11111111)begin
            startup_counter <= 8'b00000011;
        end else begin
            startup_counter <= startup_counter + 8'b1;
        end
    end
    
    assign O_ST_COUNTER = startup_counter[7:4];
    
    wire     [47:0]  TimeCounter_Result_wire        ;
    reg      [47:0]  TimeCounter_Result_reg = 'b0   ;
    reg              TimeCounter_Output ;
    always @ (posedge CLK_100)begin
        TimeCounter_Result_reg <= TimeCounter_Result_wire;
    end
    TimeCounter TimeCounter_Unit (
        .CLK    (   CLK_100                  ),  // input wire CLK
        .A      (   2'b01                    ),      // input wire [1 : 0] A
        .C      (   TimeCounter_Result_reg   ),      // input wire [47 : 0] C
        .P      (   TimeCounter_Result_wire  )       // output wire [47 : 0] P
    );
    always @ ( posedge  CLK_100 )begin
        TimeCounter_Output <= TimeCounter_Result_reg[47];
    end
    assign O_TIMECOUNTER_OUTPUT = TimeCounter_Output ;
endmodule