国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【FIFO】異步 FIFO 設計

這篇具有很好參考價值的文章主要介紹了【FIFO】異步 FIFO 設計。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

?文章來源地址http://www.zghlxwxcb.cn/news/detail-434331.html

寫在前面

簡介

傳遞多個異步信號

同步 FIFO 指針

異步FIFO指針

二進制 FIFO 指針注意事項

FIFO測試問題

格雷碼計數(shù)器 ? 樣式 #1

格雷碼模式

格雷碼計數(shù)器基礎

額外的格雷碼計數(shù)器注意事項

格雷碼計數(shù)器 ? 樣式 #2

處理滿空情況

產(chǎn)生空標志

產(chǎn)生滿標志

不同的時鐘速度

悲觀的滿空

滿空“準確”設置

多位異步復位

將滿將空信號


?

寫在前面

FIFO 通常用于將數(shù)據(jù)從一個時鐘域安全地傳遞到另一個異步時鐘域。使用 FIFO 將數(shù)據(jù)從一個時鐘域傳遞到另一個時鐘域需要多異步時鐘設計技術。有許多方法可以正確設計 FIFO,但仍然難以正確綜合和分析設計。

簡介

異步 FIFO 指一種 FIFO 設計,其中數(shù)據(jù)值從一個時鐘域?qū)懭?FIFO 緩沖區(qū),而數(shù)據(jù)值從另一個時鐘域的同一 FIFO 緩沖區(qū)讀取,其中兩個時鐘域彼此異步。異步 FIFO 用于將數(shù)據(jù)從一個時鐘域安全地傳遞到另一個時鐘域。本文討論了一種 FIFO 設計風格以及在進行異步 FIFO 設計時必須考慮的重要細節(jié)。

傳遞多個異步信號

試圖將來自一個時鐘域的多個變化信號同步到一個新時鐘域并確保所有變化信號同步到新時鐘域中的同一時鐘周期已被證明是有問題的。 FIFO 在設計中用于安全地將多位數(shù)據(jù)字從一個時鐘域傳遞到另一個時鐘域。

通過一個時鐘域中的控制信號將數(shù)據(jù)字放入 FIFO 緩沖存儲器陣列中,并且通過來自第二時鐘域的控制信號從同一 FIFO 緩沖存儲器陣列的另一個端口移除數(shù)據(jù)字。從概念上講,使用這些假設設計 FIFO 的任務似乎很容易。

與進行 FIFO 設計相關的困難與生成 FIFO 指針和找到可靠的方法來確定 FIFO 上的滿和空狀態(tài)有關。

同步 FIFO 指針

對于同步 FIFO 設計(寫入和讀取 FIFO 緩沖區(qū)在同一時鐘域中進行的 FIFO),一種實現(xiàn)計算寫入和讀取 FIFO 緩沖區(qū)的次數(shù)以遞增(在 FIFO 寫入時,但沒有讀取)、遞減(在 FIFO 讀取但不寫入)或保持(不寫入和讀取,或同時寫入和讀取操作)FIFO 緩沖區(qū)的當前填充值。當 FIFO 計數(shù)器達到預定的滿值時,F(xiàn)IFO 是滿的,而當 FIFO 計數(shù)器為零時,F(xiàn)IFO 是空的。

但是對于異步 FIFO 設計,不能使用遞增遞減 FIFO 填充計數(shù)器,因為需要兩個不同的異步時鐘來控制計數(shù)器。要確定異步 FIFO設計的滿和空狀態(tài),必須比較寫和讀指針。

異步FIFO指針

為了理解 FIFO 設計,需要了解 FIFO 指針是如何工作的。寫指針總是指向下一個要寫的字;因此,在復位時,兩個指針都設置為零,這也恰好是要寫入的下一個 FIFO 字位置。在 FIFO 寫入操作中,寫入指針指向的內(nèi)存位置被寫入,然后寫入指針遞增以指向下一個要寫入的位置。

類似地,讀指針始終指向要讀取的當前 FIFO 字。再次復位時,兩個指針都復位為零,F(xiàn)IFO 為空且讀取指針指向無效數(shù)據(jù)(因為 FIFO 為空且空標志置位)。第一個數(shù)據(jù)字寫入 FIFO 后,寫指針遞增,清空標志,仍在尋址第一個 FIFO 存儲器字內(nèi)容的讀指針立即將第一個有效字驅(qū)動到 FIFO數(shù)據(jù)輸出端口,由接收邏輯讀取。讀取指針始終指向下一個要讀取的 FIFO 字這一事實意味著接收器邏輯不必使用兩個時鐘周期來讀取數(shù)據(jù)字。如果接收器在讀取 FIFO 數(shù)據(jù)之前首先必須增加讀取指針字,接收器將計時一次以從 FIFO 輸出數(shù)據(jù)字,然后再計時一次以將數(shù)據(jù)字捕獲到接收器中。那將是不必要的低效。

當讀寫指針相等時,F(xiàn)IFO 為空。這種情況發(fā)生在復位操作期間兩個指針都復位為零時,或者當讀指針趕上寫指針時,已經(jīng)從 FIFO 中讀取了最后一個字。

當指針再次相等時,即當寫指針回繞并趕上讀指針時,F(xiàn)IFO 已滿。這是個問題。當指針相等時,F(xiàn)IFO 要么是空的,要么是滿的,但是哪個?

用于區(qū)分滿和空的一種設計技術是向每個指針添加一個額外的位。當寫指針遞增超過最終 FIFO 地址時,寫指針將遞增未使用的 MSB,同時將其余位設置回零,如圖所示(FIFO 已包裝并切換指針 MSB)。讀取指針也是如此。如果兩個指針的 MSB 不同,則表示寫指針比讀指針多繞了一圈。如果兩個指針的 MSB 相同,則表示兩個指針的回繞次數(shù)相同。

【FIFO】異步 FIFO 設計

使用 n 位指針,其中 (n?1) 是訪問整個 FIFO 內(nèi)存緩沖區(qū)所需的地址位數(shù),當兩個指針(包括 MSB)相等時,F(xiàn)IFO 為空。當兩個指針(除了 MSB 相等)時,F(xiàn)IFO 已滿。

二進制 FIFO 指針注意事項

嘗試將二進制計數(shù)值從一個時鐘域同步到另一個是有問題的,因為 n 位計數(shù)器的每個位都可以同時更改(例如 7?>8 二進制數(shù)是 0111?>1000,所有位都已更改)。解決該問題的一種方法是在保持寄存器中采樣和保持周期性二進制計數(shù)值,并將同步就緒信號傳遞到新時鐘域。當就緒信號被識別時,接收時鐘域向發(fā)送時鐘域發(fā)送回一個同步的確認信號。在接收到來自接收時鐘域的確認信號之前,采樣指針不得改變。使用這種技術可以將具有多個變化位的計數(shù)值安全地傳輸?shù)叫碌臅r鐘域。接收到確認信號后,發(fā)送時鐘域有權(quán)清除就緒信號并重新采樣二進制計數(shù)值。

相當于是握手機制,接收方接收完成后發(fā)給發(fā)送方以ready信號,表示數(shù)據(jù)正確接收到了,可以再發(fā)送下一次的數(shù)據(jù)。

使用這種技術,二進制計數(shù)器值被定期采樣,并不是所有的二進制計數(shù)器值都可以傳遞到新的時鐘域。問題是我們是否需要關注二進制計數(shù)器可能繼續(xù)遞增和溢出的情況或采樣計數(shù)器值之間的FIFO下溢?答案是否定的。

  • 當寫指針趕上同步和采樣的讀指針時,F(xiàn)IFO 已滿。同步和采樣的讀指針可能不會反映實際讀指針的當前值,但寫指針不會嘗試超出同步讀指針值的計數(shù)。不會發(fā)生溢出。
  • 當讀指針趕上同步和采樣的寫指針時,F(xiàn)IFO 為空。同步和采樣的寫指針可能不會反映實際寫指針的當前值,但讀指針不會嘗試計數(shù)超過同步的寫指針值。不會發(fā)生下溢。

FIFO 計數(shù)器指針的一種常見方法是使用格雷碼計數(shù)器。格雷碼只允許每次時鐘轉(zhuǎn)換改變一位,從而消除了與嘗試在同一時鐘邊沿同步多個變化信號相關的問題。

FIFO測試問題

測試 FIFO 設計的細微設計問題幾乎是不可能的。問題的根源在于 RTL 模擬中的 FIFO 指針表現(xiàn)理想,即使如果實施不正確,如果在實際設計中使用它們可能會導致災難性故障。

在 RTL 仿真中,如果設計中包含二進制計數(shù) FIFO 指針,則所有 FIFO 指針位將同時改變;沒有機會觀察同步和比較問題。在沒有反向注釋延遲的門級仿真中,如果上升沿和下降沿信號的門轉(zhuǎn)換不同,則只有很小的機會觀察到問題,即使那樣,也必須幸運并具有正確的序列位在時鐘上升沿之前和之后發(fā)生變化。對于更高速度的設計,上升沿和下降沿信號之間的延遲差異會減小,并且檢測到問題的可能性也會減小。對于具有反向注釋延遲的門級設計來說,發(fā)現(xiàn)實際的 FIFO 設計問題是最大的,但即使進行這種類型的仿真,也很難找到問題,并且隨著信號傳播延遲的減少,再次觀察到設計問題的幾率也會降低。

以下模塊準確地確定何時應設置 FIFO 滿和空狀態(tài)位,并可用于確定應存儲到工作 FIFO 中的數(shù)據(jù)值。但不適用于綜合!

module beh_fifo (rdata, wfull, rempty,
       wdata, winc, wclk, wrst_n,
       rinc, rclk, rrst_n);

parameter   DSIZE     =  8;
parameter   ASIZE     =  4;
parameter   MEMDEPTH  =  1<<ASIZE;

output [DSIZE-1:0]      rdata;
output                  wfull;
output                  rempty;
input  [DSIZE-1:0]      wdata;
input                   winc, wclk, wrst_n;
input                   rinc, rclk, rrst_n;

reg    [ASIZE:0]        wptr;  
reg    [ASIZE:0]        rptr;  
reg    [ASIZE:0]        wrptr1;
reg    [ASIZE:0]        rwptr1;
reg    [ASIZE:0]        wrptr2;
reg    [ASIZE:0]        rwptr2;
reg    [ASIZE:0]        wrptr3;  
reg    [ASIZE:0]        rwptr3;  

reg    [DSIZE-1:0]      ex_mem  [0:MEMDEPTH-1];

always @(posedge wclk or negedge wrst_n) begin
	if (!wrst_n) 
		wptr <= 0;
	else if (winc && !wfull) begin
		ex_mem[wptr[ASIZE-1:0]] <= wdata;
		wptr <= wptr+1;
	end	
end

always @(posedge wclk or negedge wrst_n) begin
	if (!wrst_n) begin
		{wrptr3,wrptr2,wrptr1} <= 0;		
	end
	else begin
		{wrptr3,wrptr2,wrptr1} <= {wrptr2,wrptr1,rptr};	
	end
end

always @(posedge rclk or negedge rrst_n) begin
	if (!rrst_n) begin
		rptr <= 0;
	end	
	else if (rinc && !rempty) begin
		rptr <= rptr+1;
	end 
end

always @(posedge rclk or negedge rrst_n) begin
	if (!rrst_n) begin
		{rwptr3,rwptr2,rwptr1} <= 0;
	end	
	else begin
		{rwptr3,rwptr2,rwptr1} <= {rwptr2,rwptr1,wptr};	
	end 	
end

assign rdata   =  ex_mem[rptr[ASIZE-1:0]];
assign rempty  =  (rptr == rwptr3);
assign wfull   =  ((wptr[ASIZE-1:0]==wrptr3[ASIZE-1:0])&&(wptr[ASIZE]!=wrptr3[ASIZE]));

endmodule

格雷碼計數(shù)器 ? 樣式 #1

格雷碼是以 1953 年最初獲得該代碼專利的人 Frank Gray 的名字命名的。有多種方法可以設計格雷碼計數(shù)器。本節(jié)詳細介紹了一種簡單直接的設計方法。本文中描述的技術僅使用一組觸發(fā)器作為格雷碼計數(shù)器。使用兩組觸發(fā)器來實現(xiàn)更高速度的第二種方法在后面中詳細介紹。

格雷碼模式

由于稍后將描述的原因,希望同時創(chuàng)建一個n位格雷碼計數(shù)器和一個(n?1)位格雷碼計數(shù)器。單獨創(chuàng)建兩個計數(shù)器當然很容易,但是創(chuàng)建一個通用的 n 位格雷碼計數(shù)器然后修改第2 個MSB 以形成一個共享的 (n?1) 位格雷碼計數(shù)器也很容易和高效LSB。在本文中,這將被稱為“雙 n 位格雷碼計數(shù)器”。

【FIFO】異步 FIFO 設計

?

為了更好地理解將 n 位格雷碼轉(zhuǎn)換為 (n?1) 位格雷碼的問題,請考慮創(chuàng)建雙 4 位和 3 位格雷碼計數(shù)器的示例,如上圖所示。

如圖所示,最常見的格雷碼是一種反射碼,其中除 MSB 之外的任何列中的位都關于序列中點對稱。這意味著 4 位格雷碼的后半部分是前半部分的鏡像,其中 MSB 反轉(zhuǎn)。

要將 4 位轉(zhuǎn)換為 3 位格雷碼,我們不希望 4 位序列后半部分的 LSB 是前半部分 LSB 的鏡像,而是希望后半部分的 LSB后半部分重復前半部分的 4 位 LSB 序列。

經(jīng)過仔細檢查,很明顯,將 4 位格雷碼的后半部分的第二個 MSB 反轉(zhuǎn)將在 4 位序列的三個 LSB 中產(chǎn)生所需的 3 位格雷碼序列。唯一的另一個問題是具有額外 MSB 的 3 位格雷碼不再是真正的格雷碼,因為當序列從 7 (Gray 0100) 變?yōu)?8 (~Gray 1000) 并再次從 15 (~Gray 1100) 變?yōu)?(灰色 0000),兩位正在改變,而不僅僅是一位。真正的格雷碼在計數(shù)之間只改變一位。

格雷碼計數(shù)器基礎

關于格雷碼,要記住的第一個事實是任何兩個相鄰數(shù)之間的編碼距離僅為 1(只有一位可以從一個格雷計數(shù)更改為下一位)。關于格雷碼計數(shù)器要記住的第二個事實是,最有用的格雷碼計數(shù)器在序列中必須有 2 次冪計數(shù)。可以制作一個格雷碼計數(shù)器來計算偶數(shù)個序列,但是與這些序列的轉(zhuǎn)換通常不像標準格雷碼那樣簡單。另請注意,沒有奇數(shù)長度的格雷碼序列,因此無法制作 23 深度的格雷碼。這意味著本文中描述的技術用于制作深度為2^n的 FIFO。

下圖是雙 n 位格雷碼計數(shù)器的框圖。格雷碼計數(shù)器假定寄存器位的輸出是格雷碼值本身(ptr,wptr或rptr )。格雷碼輸出然后被傳遞給一個格雷到二進制轉(zhuǎn)換器(bin),它被傳遞給一個條件二進制值增量器以生成下一個二進制計數(shù)值(bnext),它被傳遞給一個二進制到格雷碼轉(zhuǎn)換器,生成下一個格雷碼數(shù)值(gnext),該值被傳遞到寄存器輸入??驁D的上半部分顯示了所描述的邏輯流程,而下半部分顯示了與第二個格雷碼計數(shù)器相關的邏輯。

【FIFO】異步 FIFO 設計

?

額外的格雷碼計數(shù)器注意事項

如上圖所示,二進制值遞增器以“if not full”或“if not empty”測試為條件,以確保適當?shù)?FIFO 指針不會在 FIFO 滿或 FIFO 空情況下遞增FIFO緩沖區(qū)的上溢或下溢。

如果在斷言 FIFO 滿狀態(tài)時,向 FIFO 發(fā)送數(shù)據(jù)的邏輯塊可靠地停止發(fā)送數(shù)據(jù),則可以通過從 FIFO 寫指針中刪除滿測試邏輯來簡化 FIFO設計。

FIFO 指針本身并不能保護 FIFO 緩沖區(qū)不被覆蓋,但可以向 FIFO 內(nèi)存緩沖區(qū)添加額外的調(diào)節(jié)邏輯,以確保在 FIFO 滿狀態(tài)期間不會激活 write_enable 信號。

額外的“粘滯”狀態(tài)位,ovf(上溢)或 unf(下溢),可以添加到指針設計中,以指示在滿時發(fā)生了額外的 FIFO 寫操作,或者在空時發(fā)生了額外的 FIFO 讀操作,以指示錯誤情況只能在復位期間清除。

總結(jié):應該設置滿狀態(tài)、空狀態(tài)響應來激活write_enable 信號和read_enable 信號,以及上溢出和下溢出的指示信號,避免過寫和過讀。

格雷碼計數(shù)器 ? 樣式 #2

FIFO 實現(xiàn)使用格雷碼計數(shù)器樣式#2,它實際上使用了兩組寄存器來消除將格雷指針值轉(zhuǎn)換為二進制值的需要。第二組寄存器(二進制寄存器)也可用于直接尋址 FIFO 存儲器,無需將存儲器地址轉(zhuǎn)換為格雷碼。仍需要 n 位格雷碼指針將指針同步到相反的時鐘域,但 n-1 位二進制指針可用于直接尋址存儲器。如果需要,二進制指針還可以更輕松地運行計算以生成“幾乎滿”和“幾乎空”位.

【FIFO】異步 FIFO 設計

?

FIFO 模塊劃分圖

【FIFO】異步 FIFO 設計

?

為了便于對 FIFO 設計進行靜態(tài)時序分析,將設計分為以下六個

具有以下功能和時鐘域的 Verilog 模塊:

fifo1.v --這是包含所有時鐘的頂層模塊。頂層模塊僅用作包裝器,用于例化設計中使用的所有其他 FIFO 模塊。如果將此 FIFO 用作更大 ASIC 或 FPGA 設計的一部分,則可能會去掉這個頂層模塊,以允許將其他 FIFO 模塊分組到它們各自的時鐘域中,以改進綜合和靜態(tài)時序分析。

fifomem.v --這是寫入和讀取時鐘域都可以訪問的 FIFO 內(nèi)存緩沖區(qū)。這個緩沖區(qū)很可能是一個實例化的同步雙端口 RAM。其他存儲器樣式可以調(diào)整為 FIFO 緩沖器。

sync_r2w.v --這是一個同步器模塊,用于將讀指針同步到寫時鐘域。 wptr_full模塊將使用同步讀取指針來生成 FIFO 滿狀態(tài)。該模塊僅包含與寫時鐘同步的觸發(fā)器。此模塊中不包含其他邏輯。

sync_w2r.v --這是一個同步器模塊,用于將寫指針同步到讀時鐘域。 rptr_empty模塊將使用同步的寫指針來生成 FIFO 空條件。該模塊僅包含與讀取時鐘同步的觸發(fā)器。此模塊中不包含其他邏輯。

rptr_empty.v--該模塊與讀時鐘完全同步域并包含 FIFO 讀指針和空標志邏輯。

wptr_full.v --該模塊與寫時鐘完全同步域并包含 FIFO 寫指針和滿標志邏輯。

為了使用這種 FIFO 樣式執(zhí)行 FIFO 滿和 FIFO 空測試,必須將讀取和寫入指針傳遞到相反的時鐘域以進行指針比較。

與其他 FIFO 設計一樣,由于兩個指針是從兩個不同的時鐘域生成的,因此需要將指針“安全地”傳遞到相反的時鐘域。本文展示的技術是同步格雷碼指針,以確保一次只能更改一個指針位。

處理滿空情況

FIFO full 和 FIFO empty 的具體實現(xiàn)方式取決于設計。

本文中的 FIFO 設計假設空標志將在讀時鐘域產(chǎn)生,以確保當 FIFO 緩沖區(qū)為空時,即讀指針趕上寫時立即檢測到空標志指針(包括指針 MSB)。

本文中的 FIFO 設計假設在寫時鐘域中會產(chǎn)生滿標志,以確保在 FIFO 緩沖區(qū)滿時立即檢測到滿標志,即寫指針趕上讀的那一刻指針(不同的指針 MSB 除外)。

產(chǎn)生空標志

當讀指針和同步寫指針相等時,F(xiàn)IFO 為空??毡容^很容易做到。使用比尋址 FIFO 內(nèi)存緩沖區(qū)所需的指針大一位的指針。如果兩個指針的額外位(指針的 MSB)相等,則指針的回繞次數(shù)相同,如果讀指針的其余部分等于同步的寫指針,則 FIFO 為空。

格雷碼寫指針必須通過 sync_w2r 模塊中的一對同步器寄存器同步到讀時鐘域。由于使用格雷碼指針一次只更改一位,因此在時鐘域之間同步多位轉(zhuǎn)換沒有問題。

為了有效地寄存 rempty 輸出(會延時一個時鐘周期),同步的寫指針實際上與 rgraynext (將寄存到 rptr 中的下一個格雷碼)進行比較(這樣就可以在同一個時刻里比較讀、寫指針值)。

產(chǎn)生滿標志

由于在寫時鐘域中通過運行寫指針和讀指針之間的比較來生成滿標志,因此進行 FIFO 設計的一種安全技術要求在進行指針比較之前將讀指針同步到寫時鐘域。

完全比較不像空比較那么簡單。比尋址 FIFO 內(nèi)存緩沖區(qū)所需的指針大一位的指針仍用于比較,但簡單地使用帶有額外位的格雷碼計數(shù)器進行比較對于確定滿狀態(tài)是無效的。問題是格雷碼是對稱碼,除了MSB。

【FIFO】異步 FIFO 設計

?

考慮上圖中所示的 8 深度 FIFO 示例。在此示例中,使用 3 位格雷碼指針來尋址存儲器,并添加一個額外位(4 位格雷碼的 MSB)來測試滿和空情況。如果允許 FIFO 填充前七個位置(字 0?6),然后如果通過讀回相同的七個字來清空 FIFO,則兩個指針將相等并指向地址 Gray?7(FIFO 為空)。在下一次寫操作時,寫指針將遞增 4 位格雷碼指針(請記住,只有 3 個 LSB 用于尋址存儲器),使 4 位指針的 MSB 不同,但寫指針的其余部分位將與讀取指針位匹配,因此 FIFO 已滿標志將被置位。這是錯誤的!不僅 FIFO未滿,而且 3 個 LSB 也沒有改變,這意味著尋址的內(nèi)存位置將覆蓋最后寫入的 FIFO 內(nèi)存位置。這也是錯誤的!

這是使用雙 n 位格雷碼計數(shù)器的原因之一。

執(zhí)行完整比較的正確方法是通過將 rptr 同步到 wclk 域中來完成,三個條件都是 FIFO 已滿所必需的:

(1) wptr 和同步的 rptr MSB 不相等(因為 wptr 必須比 rptr 多回繞一次)。

(2) wptr 的最高位MSB 和同步的 rptr 次高位 MSB 不相等(因為一個指針的倒置的次高位 MSB 必須針對來自另一個指針的未倒置的次高位 MSB 進行測試,如果 MSB 也是彼此的倒置,這是必需的)。

(3) 所有其他 wptr 和同步 rptr 位必須相等。

為了有效寄存 wfull 輸出(延時一個時鐘周期輸出),同步讀取指針實際上與 wgnext (將在wptr 中寄存的下一個格雷碼)進行比較(這樣就可以在同一個時刻里比較讀、寫指針值)。

不同的時鐘速度

由于異步 FIFO 的時鐘來自兩個不同的時鐘域,顯然這些時鐘以不同的速度運行。當將較快的時鐘同步到較慢的時鐘域時,由于較快的時鐘將在較慢的時鐘邊沿之間半周期性地遞增兩次,因此會跳過一些計數(shù)值。這引發(fā)了對以下兩個問題的討論:

第一個問題。請注意,遞增兩次但僅采樣一次的同步格雷碼將顯示同步值的多位變化,這會導致多位同步問題嗎?

答案是不會。僅當多個位在同步時鐘的上升沿附近發(fā)生變化時,同步多位變化才是一個問題。格雷碼計數(shù)器可以在較慢的同步時鐘邊沿之間增加兩次(或更多)的事實意味著第一次格雷碼變化將在較慢時鐘的上升沿之前發(fā)生,并且只有第二次格雷碼轉(zhuǎn)換可能會在上升時鐘附近發(fā)生變化邊緣。格雷碼計數(shù)器不存在多位同步問題。

第二個問題。再次注意到較快的格雷碼計數(shù)器可能在較慢時鐘信號的上升沿之間增加不止一次,來自較快時鐘域的格雷碼計數(shù)器是否有可能增加到滿狀態(tài)更多的值,導致 FIFO 溢出而不識別 FIFO 曾經(jīng)滿?(這個問題同樣適用于 FIFO empty)。

同樣,答案是否定的,使用本文中描述的實現(xiàn)。首先考慮 FIFO full 的生成。當寫指針趕上同步讀指針并且在寫時鐘域中檢測到 FIFO 滿狀態(tài)時,F(xiàn)IFO 變滿。如果wclk?domain 比rclk?domain 快,寫指針最終會趕上同步讀指針,F(xiàn)IFO 將滿, wfull位將被設置,F(xiàn)IFO 將退出寫操作,直到同步讀指針前進再次。寫指針不能超過wclk 域中的同步讀指針。

對空標志的類似檢查表明,當讀指針趕上同步寫指針并且在讀時鐘域中檢測到 FIFO 空狀態(tài)時,F(xiàn)IFO 變?yōu)榭?。如?rclk?domain 比 wclk?domain 快,讀指針最終會趕上同步寫指針,F(xiàn)IFO 將為空, rempty位將被設置,F(xiàn)IFO 將退出讀操作,直到同步寫指針前進再次。讀指針不能超過 rclk 域中的同步寫指針。

悲觀的滿空

本文描述的 FIFO 使用“悲觀”方法實現(xiàn)了全刪除和空刪除。也就是說,“full”和“empty”都準確地按時斷言,但刪除較晚。

由于寫時鐘用于生成 FIFO?full 狀態(tài),并且當寫指針趕上同步讀指針時發(fā)生 FIFO?full,因此完全檢測是“準確的”和即時的。移除“完整”狀態(tài)是悲觀的,因為“完整”比較是通過同步讀指針完成的。當讀指針增加時,F(xiàn)IFO 不再滿,但在兩個 wclk 上升沿將更新的 rptr 同步到wclk域之前,全生成邏輯不會檢測到變化。這通常不是問題,因為這意味著數(shù)據(jù)發(fā)送硬件正在“延遲”或通知 FIFO 仍然滿了幾個額外的 wclk 邊沿。

重要的細節(jié)是確保 FIFO 不會溢出。發(fā)信號通知數(shù)據(jù)發(fā)送方不要在幾個額外的wclk邊沿發(fā)送更多數(shù)據(jù),這只會給 FIFO 時間騰出空間來接收更多數(shù)據(jù)。

類似地,由于讀取時鐘用于生成 FIFO?empty 狀態(tài),并且當讀取指針趕上同步寫入指針時發(fā)生 FIFO?empty,因此空檢測是“準確的”和即時的。刪除“空”狀態(tài)是悲觀的,因為“空”比較是使用同步的寫指針完成的。當寫指針確實增加時,F(xiàn)IFO 不再為空,但空生成邏輯將不會檢測到更改,直到兩個rclk上升沿將更新的wptr同步到rclk域。這通常不是問題,因為這意味著數(shù)據(jù)接收邏輯被“推遲”或通知 FIFO 對于幾個額外的rclk邊沿仍然是空的。重要的細節(jié)是確保 FIFO 不會下溢。向數(shù)據(jù)接收器發(fā)出信號以停止從 FIFO 中刪除數(shù)據(jù)以獲得幾個額外的rclk邊沿,這只是為 FIFO 提供了時間來填充更多數(shù)據(jù)。

滿空“準確”設置

請注意,如果兩個指針同時遞增,則設置完整標志或空標志可能不太準確。例如,如果寫指針趕上同步讀指針,將設置滿標志,但如果讀指針與寫指針同時遞增,則滿標志將提前設置,因為 FIFO 是由于讀操作與“寫滿”操作同時發(fā)生,因此讀操作并未真正滿,但讀指針尚未同步到寫時鐘域。全旗的設置有點太早了,有點悲觀。這不是設計問題。

多位異步復位

已經(jīng)非常注意確保 FIFO 指針一次只改變一位。問題是,是否會出現(xiàn)與異步復位相關的問題,這通常會導致多個指針位同時更改?

答案是不會。復位表示 FIFO 也已復位,并且 FIFO 中沒有有效數(shù)據(jù)。在復位斷言時,所有同步寄存器、 wclk 域邏輯(包括已寄存的完整標志)和rclk 域邏輯同時異步復位。注冊的空標志也同時設置。更重要的問題涉及到復位信號的有序移除。

將滿將空信號

許多設計需要通過生成“幾乎滿”和“幾乎空”狀態(tài)位來通知待處理的滿或空狀態(tài)。有很多方法可以實現(xiàn)這兩個狀態(tài)位,每種實現(xiàn)都取決于指定的設計要求。

一些 FIFO 設計需要可編程的 FIFO?full 和 FIFO?empty 差值,這樣當兩個指針之間的差值小于編程差值時,相應的幾乎滿或幾乎空位被斷言。其他 FIFO 可以以固定差異實現(xiàn),以生成幾乎滿或空。當 FIFO 指針的 MSB 接近時,其他 FIFO 可能會滿足于松散地生成幾乎滿和空。而其他設計可能只需要知道 FIFO 何時多于或少于半滿。

記住當 wptr 趕上同步的rptr 時 FIFO 已滿,幾乎滿的情況可以描述為(wptr+4)趕上同步的rptr 時的情況。 ( wptr+4) 值可以在格雷碼指針邏輯中生成。

【FIFO】異步 FIFO 設計

?

上圖通過在 Gray?to?binary 組合邏輯之后放置第二個加法器來將四加到二進制值并記錄結(jié)果。這個寄存的值在被轉(zhuǎn)換為 wclk 域中的二進制值后,將用于對同步的 rptr 進行減法運算,如果差值小于 4,則可以設置一個 almost_full 位。當wptr在追趕同步 rptr 的 0?4 個計數(shù)范圍內(nèi)時,小于操作可確保將 almost_full 位設置為全范圍??梢栽趓clk 域中使用類似的邏輯來生成 almost_empty 標志。

?

到了這里,關于【FIFO】異步 FIFO 設計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 可綜合的異步FIFO的設計與仿真

    可綜合的異步FIFO的設計與仿真

    目錄 綜述 同步FIFO 異步FIFO 格雷碼與二進制計數(shù)器 二進制計數(shù)器 格雷碼 二進制雙向箭頭?格雷碼之間的相互轉(zhuǎn)換 異步FIFO的代碼實現(xiàn) 整體框圖 格雷碼做多bit信號同步 空滿生成模塊 存儲器模塊 讀寫指針同步模塊 頂層模塊 仿真 仿真情景1:寫滿 仿真情景2:讀空 仿真情景3:

    2024年02月05日
    瀏覽(18)
  • FPGA的Verilog設計(二)——異步FIFO

    FPGA的Verilog設計(二)——異步FIFO

    閱讀本文前,建議先閱讀下面幾篇文章: 同步FIFO 二進制轉(zhuǎn)格雷碼的實現(xiàn) ??在上篇文章同步FIFO中簡要介紹了FIFO的基本概念以及同步FIFO的實現(xiàn)。本篇文章將重點介紹異步FIFO的工作原理以及硬件實現(xiàn)。 ??異步FIFO的讀寫時鐘不同,F(xiàn)IFO的讀寫需要進行異步處理, 異步FIFO常用

    2024年02月04日
    瀏覽(23)
  • 關于異步FIFO設計,這7點你必須要搞清楚

    關于異步FIFO設計,這7點你必須要搞清楚

    ? ? ? ? 在這篇文章,默認您已經(jīng)對異步FIFO的設計方法有了基本的了解。 ????????如果不了解異步FIFO設計的基本方法,可參考:異步FIFO的Verilg實現(xiàn)方法 ????????格雷碼是美國學者Frank Gray于1947年提出的一種二進制編碼方式,后面這種編碼方式就以他的名字命名。實際

    2024年02月07日
    瀏覽(26)
  • 【Python】函數(shù)進階 ① ( 函數(shù)返回多個返回值 | 函數(shù)參數(shù)傳遞類型簡介 | 位置參數(shù) | 關鍵字參數(shù) )

    在函數(shù)中 , 如果要 返回 多個返回值 , 可以 在 return 語句中 , 設置多個返回值 , 這些返回值之間使用 逗號 隔開 , 這些返回值的類型是 元組 tuple 類型的 ; 在下面的代碼中 , 返回了 3 個返回值 , 其 本質(zhì)上是返回了一個包含 3 個元素的 元組 數(shù)據(jù)容器 , 可以使用多重賦值將返回的

    2024年02月11日
    瀏覽(24)
  • 異步FIFO(Verilog)

    異步FIFO(Verilog)

    簡介: ? ? ? ?FIFO(First In First Out)是異步數(shù)據(jù)傳輸時經(jīng)常使用的存儲器。該存儲器的特點是數(shù)據(jù)先進先出(后進后出)。其實,多位寬數(shù)據(jù)的異步傳輸問題,無論是從快時鐘到慢時鐘域,還是從慢時鐘到快時鐘域,都可以使用 FIFO 處理。異步FIFO 是指讀寫時鐘不一致,讀寫

    2024年02月08日
    瀏覽(22)
  • 基于異步FIFO的串口回環(huán)測試

    基于異步FIFO的串口回環(huán)測試

    ??當涉及到串口通信的硬件設計和軟件開發(fā)時,進行有效的測試是至關重要的。串口回環(huán)測試是一種常見的測試方法,用于驗證串口通信的功能和穩(wěn)定性。在許多應用中,為了確保串口通信的正常運行,往往需要使用緩沖區(qū)或FIFO來管理數(shù)據(jù)的傳輸和接收。 ??基于異步F

    2024年02月16日
    瀏覽(25)
  • 【小白入門】Verilog實現(xiàn)異步FIFO

    【小白入門】Verilog實現(xiàn)異步FIFO

    ? ?之前也在CSDN上面寫過兩個FIFO相關的文章,不過代碼看起來比較復雜,且注釋也比較少,不利于新手入門。很多時候都沒有耐心繼續(xù)看下去。 http://t.csdn.cn/0dPX6 http://t.csdn.cn/lYvoY? 因為自己本身是一個初學者,就從初學者的視角來看待并學習FIFO。 為什么選擇學習FIFO? 在學

    2024年02月09日
    瀏覽(26)
  • 跨時鐘域方法(同步器、異步FIFO、邊沿檢測器、脈沖同步器、同步FIFO)

    跨時鐘域方法(同步器、異步FIFO、邊沿檢測器、脈沖同步器、同步FIFO)

    目錄 1、跨時鐘域方法的原因 2、跨時鐘處理的兩種思路 3、跨時鐘域分類——單比特信號跨時鐘 3.1.1慢時鐘———快時鐘。(滿足三邊沿準則,有效事件可以被安全采樣) 3.1.2慢時鐘———快時鐘。(不滿足三邊沿準則,有效事件可以被安全采樣) 3.2.1有效事件傳輸背景下確

    2024年02月12日
    瀏覽(52)
  • <FPGA>異步FIFO的Verilg實現(xiàn)方法

    <FPGA>異步FIFO的Verilg實現(xiàn)方法

    ? ? ? ? 在上篇文章:同步FIFO的兩種Verilog設計方法(計數(shù)器法、高位擴展法)中我們介紹了FIFO的基本概念,并對同步FIFO的兩種實現(xiàn)方法進行了仿真驗證。而異步FIFO因為讀寫時鐘不一致,顯然無法直接套用同步FIFO的實現(xiàn)方法,所以在本文我們將用Verilog實現(xiàn)異步FIFO的設計。

    2024年02月07日
    瀏覽(23)
  • Android 在TextView前面添加多個任意View且不影響換行

    Android 在TextView前面添加多個任意View且不影響換行

    實現(xiàn)效果如下: 如上,將頭像后面的東西看作一個整體,因為不能影響后面內(nèi)容的換行,且前面控件的長度是可變的,所以采用自定義View的方法來實現(xiàn): 使用舉例 :? (??抱歉啊使用這邊沒有用Java寫,不會Kotlin的應該也能看懂啥意思) activity_main.xml: la: dataListType的 0,1,

    2024年02月09日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包