ISE下的FIFO IP核有Standard FIFO和First-word-Fall-Through两种模式,相对于标准模式FWFT(First-word-Fall-Through)可以不需要读命令,自动的将最新数据放在dout上。
接下来分别对两种模式下的FIFO进行仿真,testbench如下
1 module fifo_test;
2
3 // Inputs
4 reg rst;
5 reg wr_clk;
6 reg rd_clk;
7 reg [15:0] din;
8 reg wr_en;
9 reg rd_en;
10
11 // Outputs
12 wire [7:0] dout;
13 wire full;
14 wire empty;
15 wire [13:0] rd_data_count;
16
17 // Instantiate the Unit Under Test (UUT)
18 write_fifo uut (
19 .rst(rst),
20 .wr_clk(wr_clk),
21 .rd_clk(rd_clk),
22 .din(din),
23 .wr_en(wr_en),
24 .rd_en(rd_en),
25 .dout(dout),
26 .full(full),
27 .empty(empty),
28 .rd_data_count(rd_data_count)
29 );
30
31 always #5 wr_clk = ~wr_clk;
32 always #5 rd_clk = ~rd_clk;
33
34
35 initial begin
36 // Initialize Inputs
37 rst = 0;
38 wr_clk = 0;
39 rd_clk = 0;
40 din = 0;
41 wr_en = 0;
42 rd_en = 0;
43
44 // Wait 100 ns for global reset to finish
45 #100;
46 din = 8193;
47 wr_en = 1;
48 repeat(8192)
49 #10 din = din - 1;
50 #10
51 wr_en = 0;
52 #100
53 rd_en = 1;
54 #163840
55 rd_en = 0;
56 #10;
57 $stop;
58
59
60 // Add stimulus here
61
62 end
63
64 endmodule
两次仿真FIFO的配置都一样,写位宽为16,写深度为8192,读位宽为8,读深度为16384.
图一为标准FIFO的仿真截图,图二为FWFT模式的仿真截图
图二中在读信号有效之前,dout即输出了最新的数据。
另外需要注意的有:
1,FIFO的实际有效深度为理论深度减。。
2,FIFO中的rd_data_count信号指示的是FIFO前几拍时的状态,即在连续写入2个数据时,rd_data_count依然为0.