首页 > 编程知识 正文

vivado里的srio核不可用,vivado封装后没有ila

时间:2023-05-05 08:15:53 阅读:161867 作者:736

一、先把程序写上:

模块adv 7391 (

input sys_clk_p,

input sys_clk_n,

//input wire en_clk,//27MHz

//input reset_ok,

输入wire rst _ n,

//输出wire m reset,

输出wire SCL,

output wire SDA,

输出wire led 2

);

/* * * * * * * frequency * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * frequency cy * * * * * * * * * * * * * * * * * * * * *

reg [9:0] cnt_delay1;

reg [2:0]cnt;

reg mreset_r;

reg reset1;

reg [31:0] Mdelay;

wire en_clk;

IBUFDS# (

. diff_term(false ),

. ibuf_low_PWR('ture ' ),

. io标准(default ) ) )。

) IBUFDS_INST (

. o(en_clk )为、

. I(sys_clk_p ),

. IB(sys_clk_n ) )

);

//assign mreset=mreset_r;

always @ (posedge en _ clkornegedgerst _ n ) begin

//Always@(* ) begin//27000/400=67.5300/4=75300/1=300

if () rst_n==0) ) begin

Mdelay=0;

mreset_r=1'b0;

reset1=1'b0;

end else begin

if(mdelay=(32 ) d27_000_000*8) ) begin //延迟? s

Mdelay=Mdelay 1;

mreset_r=1'b0;

if(mdelay==(32 ) D27_000_000*4) ) reset1=0;

else reset1=1'b1;

end else begin

mreset_r=1'b1;

reset1=1'b1;

结束

结束

结束

Always@(posedgeen_clk ) begin//27000/400=67.5300/4=75300/1=300

if(reset1==0) begin

cnt_delay1=10'd0;

结束

//elseif(CNT_Delay=9'd125 ) cnt_delay=9'd0; //SCL=400KHZ; T=10us

ELSEif(CNT_Delay1=10'D299 ) cnt_delay1=10'd0; //SCL=100KHZ; T=

else cnt_delay1=cnt_delay1 1'b1;

结束

Always@(Posedgeen_clk ) begin

//always @ (posedgeclkornegedgerst _ n ) begin

if(reset1==0) cnt=3'd5;

else begin

case(CNT_delay1) ) ) )。

//9'd20: cnt=3'd2; //SCL高电平中间采样点

//9'd40: cnt=3'd0; //SCL下降沿

//9'd80:

cnt <= 3'd3;                     //SCL低电平中间采样点,用于数据的变化
              // 9'd0:   cnt <= 3'd1;                     //SCL上升沿
               10'd75:  cnt <= 3'd1;                     //SCL高电平中间采样点 
               10'd150:  cnt <= 3'd2;                     //SCL下降沿
               10'd225: cnt <= 3'd3;                     //SCL低电平中间采样点,用于数据的变化
               10'd299:   cnt <= 3'd0;                     //SCL上升沿
               
             default : cnt <= 3'd5;
      endcase
     end             
end

`define  SCL_POS  (cnt==3'd0)
`define  SCL_HIG  (cnt==3'd1)
`define  SCL_NEG  (cnt==3'd2)
`define  SCL_LOW  (cnt==3'd3)


 reg scl_r; //定义SCL的时序脉冲,1为高电平,0为低电平

always @ (posedge en_clk) begin 
//always @ (posedge CLK or negedge RST_N) begin 
//if (reset1==0) scl_r <= 1'b0;
//    else if(cnt == 3'd1)  scl_r<= 1'b1;       //40个时钟周期
//    else if(cnt == 3'd0)  scl_r<= 1'b0;       //85个时钟周期
   if (reset1==0) scl_r <= 1'b1;
    else if(cnt == 3'd0)  scl_r<= 1'b1;       //40个时钟周期
    else if(cnt == 3'd2)  scl_r<= 1'b0;       //85个时钟周期
end

assign SDA = en_clk;        //本来后面给它赋值的,删除后面的,暂赋值en_clk
assign SCL = scl_r;

    reg led2_t;
    assign led2 = led2_t;    
    reg[31:0] timer_cnt2;

always @ (posedge en_clk)  //27000/400=67.5  300/4=75   300/1 = 300
    if (reset1==0) begin 
      // cnt_delay1 <= 10'd0;               //这时一个错误,cnt_delay1在两个地方赋值了
    end
    else begin       
      if(timer_cnt2 >=(32'd13_500_000))  //模拟1S时间     30MHz=30_000_000Hz  
      begin
        // timer_cntx <= timer_cntx+1;
        led2_t<=~led2_t;
        timer_cnt2<=32'd0;
      end
      else
      begin
        //timer_cntx <= timer_cntx;
        led2_t<=led2_t;
        timer_cnt2<=timer_cnt2+32'd1;
      end 
   end


ila_0 your_instance_name2 (               //这是后加的
    .clk(en_clk), // input wire clk


    .probe0(cnt_delay1), // input wire [8:0]  probe1  
    .probe1(cnt), // input wire [2:0]  probe0  
    .probe2(mreset_r), // input wire [8:0]  probe1
    .probe3(reset1), // input wire [8:0]  probe1
    .probe4(rst_n) // input wire [8:0]  probe1
);
endmodule
 

二、加ILA

 

 

 

 

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

 直接拷贝下来到 Verilog 源码下面去,并将信号对应上:如一中最后一小段。

本来应该搞定了,可由于  cnt_delay1 <= 10'd0;               //这时一个错误,cnt_delay1在两个地方赋值了,这个错误结果在wave里看不到cnt_deay1,相反有10个const0--9个,由于这个原因cnt_delay1总是0,所以我的程序scl和sda不能运行。

 然后我把cnt_delay换成cnt_delay1才查到它。这是一个深刻的教训,永远牢记。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。