同步FIFO


引言

同步FIFO在數據緩沖中起到重要作用。相比於異步FIFO而言,同步FIFO結構更簡單,是單個時鍾域下的同步電路。

下文主要介紹同步FIFO的rtl設計。

RTL代碼

端口

輸入時鍾,復位,8位數據,寫使能讀使能。

輸出8位數據,空滿標志。

內部變量

包括一個存儲變量ram位寬為8(ram變量名前的[7:0]),深度為8(ram變量名后的[7:0])。

讀寫指針wrptr rdptr,用於標志讀寫ram的地址。

計數變量cnt用於產生空滿標志,注意這里對於深度為8的ram,位寬為3最多記到十進制數字7,但是wrptr指代下一個寫入的地址,當對滿信號進行判斷時是判斷cnt是否達到8,因此必須要4位的計數器。

整數i用於后續的ram初始化。

空滿標志

計數器記到8代表寫滿,計數器為0時表示讀空。

 計數器

第一個邏輯判斷是同時讀寫且FIFO處在非滿和非空狀態時,cnt保持不變。

第二個邏輯判斷是寫,計數器加一。

第三個邏輯判斷是讀,計數器減一。

讀寫指針

寫指針當寫使能有效且非滿狀態時,地址加一。當寫指針為7,也就是寫滿時,下一個要寫的地址跳轉回0地址。讀指針同理。

 RAM讀寫

 ram的初始化這里使用for循環,因為存儲類變量不能操作單獨的位,需要對每一行存儲單元(每一行位寬為8)進行初始化,因此使用邏輯復制操作。

 TestBench文件

 1 `timescale 1ns/1ps
 2 module tb_syncfifo();
 3 
 4 reg clk;
 5 reg rst;
 6 reg [7:0]data_in;
 7 reg wr_en,rd_en;
 8 wire [7:0] data_out;
 9 wire full,empty;
10 
11 initial begin
12     clk=0;
13     rst=0;
14     data_in=0;
15     wr_en=0;
16     rd_en=0;
17     #10
18     rst=1;
19     #10
20     rst=0;
21 end
22 
23 always #10 clk = ~clk;
24 
25 task gen_data;
26     integer i;
27     begin
28     @(negedge rst);
29     #10;
30     @(posedge clk);
31     for(i=0;i<10;i=i+1)begin
32         wr_en=1;
33         data_in=i[7:0];
34         if(i>2)begin
35             rd_en=1;
36         end
37         @(posedge clk);
38     end
39     wr_en=0;
40     data_in=0;
41     end
42 endtask
43 
44 initial begin
45         gen_data();
46 end
47 
48     syncfifo inst_syncfifo
49         (
50             .clk      (clk),
51             .rst      (rst),
52             .data_in  (data_in),
53             .wr_en    (wr_en),
54             .rd_en    (rd_en),
55             .data_out (data_out),
56             .full     (full),
57             .empty    (empty)
58         );
59 
60 
61 
62 endmodule
tb

仿真結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM