我在玩Xilinx FIFO IP模块,在以下输出中有些事情我无法解释:
`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的圆点变化发生在紧接读时钟的下一个时钟?
答案 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
的上升沿运行。如果是后者,那就错了!