仿真中的Xilinx FIFO IP模块输出

时间:2019-01-04 07:26:46

标签: verilog

我在玩Xilinx FIFO IP模块,在以下输出中有些事情我无法解释:

Simulation Diagram 测试基准代码:

`define wrclk_period 20 ;
`define rdclk_period 10 ;

module testbench;
reg rst;
reg wr_clk ;
reg rd_clk ;
reg [7:0] din ; 
reg wr_en ;
reg rd_en ;
wire [7:0] dout ;
wire full ; 
wire empty ;

fifo_generator_0 FG0(rst,wr_clk,rd_clk,din,wr_en,rd_en,dout,full,empty) ;


initial wr_clk = 1 ;
always #10 wr_clk = ~wr_clk ;

initial rd_clk = 1 ;
always #5 rd_clk = ~rd_clk ;




integer i,j ;

initial begin 
rst = 1 ; 
#10
   din = 0 ;
   wr_en = 0 ;
   rd_en = 0 ;
   rst = 0 ;
   #`wrclk_period ;
   rst = 1 ;
   #`wrclk_period ;
   rst = 0 ;
   #60;


   for(i= 0 ; i<=5 ; i = i+1  ) begin 
     wr_en = 1 ;
     din = i ;
     #`wrclk_period ;
   end 

   wr_en = 0 ;
   #`wrclk_period ;

   #`rdclk_period ;

   for( j= 0 ; j<=5 ; j = j+1  ) begin 
        rd_en = 1 ;
        #`rdclk_period ;
    end

      rd_en = 0 ;
      #`rdclk_period ;

      $stop ;
   end
endmodule

1)问题1:输出变量full在开始时为高。为什么会这样呢?

2)问题2:为什么我们错过了dout中的数据1?我可以看到2,3,4,5,但没有出现1。

3)在将rd_en设置为1之后,从3到4的圆点变化需要2个时钟周期,而从2到3的圆点变化发生在紧接读时钟的下一个时钟?

1 个答案:

答案 0 :(得分:1)

很抱歉在评论中有此内容,但空间严重用完了。

我对IP并不熟悉,但是可以做出一些有根据的猜测。

1 /我怀疑重置后必须等待更长的时间才能开始使用FIFO。也许到那个时候满标志就变低了。
“满”标志的问题可能是因为复位后,FIFO级别必须经过需要几个周期的时钟域交叉。为了预防起见,设计人员将其设置为“已满”,因为这是故障安全状态。

2 /我还怀疑未写入值0x01,因为FIFO仍然认为它已满。

3 /更仔细地研究波形:2-> 3是一个时钟,3-> 4是一个时钟,但是当FIFO为空时您正在读取! FIFO不再为空之后。

通常,如果您是第一次测试这样的块,则使您的时间更长。因此,复位后要等待更长的时间才能写入,写入后要等待更长的时间才能读取。

最后评论:您的 <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView" /> 似乎是 struct B { int hh; int ii; }; struct A { B b_memberVar; void *p_data; }; struct C { A array[13]; int bb; int cc; int dd; int ee; int ff; int gg; }; struct D { C c_memberVar; int aa; }; class XYZ { XYZ(); D m_DMemberVar; int zz; } XYZ::XYZ(): m_DMemberVar( ({{{ {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr}, {{0,0},nullptr} },0,0,0,0,0,0},0}), zz(0) ){} 罚款的上升沿,没问题。但是您的rd_en信号在wr_clk的下降沿或rd_clk的上升沿运行。如果是后者,那就错了!