2013-04-12 209 views
3

我在網上找到了下面這段代碼,同時尋找好的FIFO設計。從鏈接SVN Code FIFO -Author Clifford E. Cummings。我做了一些研究,但我無法弄清楚爲什麼設計中有三個指針?我可以讀取代碼,但是我錯過了什麼?異步FIFO設計

module sync_r2w #(parameter ADDRSIZE = 4) 
(output reg [ADDRSIZE:0] wq2_rptr, 
input [ADDRSIZE:0] rptr, 
input wclk, wrst_n); 
reg [ADDRSIZE:0] wq1_rptr; 
always @(posedge wclk or negedge wrst_n) 
if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0; 
else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr}; 
endmodule 


module sync_w2r #(parameter ADDRSIZE = 4) 
(output reg [ADDRSIZE:0] rq2_wptr, 
input [ADDRSIZE:0] wptr, 
input rclk, rrst_n); 
reg [ADDRSIZE:0] rq1_wptr; 
always @(posedge rclk or negedge rrst_n) 
if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0; 
else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr}; 
endmodule 

回答

9

你在這裏看到的是所謂的雙等級同步器。如你所說,這是一個異步FIFO。這意味着FIFO的讀取和寫入側不在同一時鐘域。

正如您所知,觸發器需要設置和保持時序要求才能正常工作。當您將信號從一個時鐘域驅動到另一個時鐘域時,在一般情況下無法保證這一要求。

當你違反這些要求時,FF進入所謂的'亞穩定'狀態,其中有一段時間不確定,然後(或多或少)隨機地進入1或0.他們這樣做(和這是很重要的),而不是一個時鐘週期。

這就是爲什麼在這裏兩層觸發器。第一個有一個趨向亞穩定的機會,但應該及時解決,被第二組觸發器乾淨地捕獲。

這是它自己的是不足以跨時鐘域傳遞一個多位值(地址指針)。如果不止一個位同時發生變化,那麼您不能確定轉換在另一側是否乾淨。所以在這些情況下你會經常看到的是FIFO指針將通過灰色編碼。這意味着計數器的每個增量一次最多改變一個位。

例如而不是00-> 01-> 10-> 11-> 00 ...它將是00-> 01-> 11-> 10-> 00 ...

時鐘域交叉是一個深刻而微妙的主題。即使有經驗的設計師也經常在沒有仔細考慮的情況下將其搞亂

順便說一句普通的Verilog仿真不會顯示我剛纔在零延遲模擬中所描述的內容。您需要使用實時時序模型進行帶註釋的SDF模擬。