引言
同步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
仿真結果