非同步FIFO的設計方法

2021-05-22 16:28:06 字數 3196 閱讀 4411

對於非同步fifo而言,資料是由某乙個時鐘域的控制訊號寫入fifo,而由另乙個時鐘域的控制訊號將資料讀出fifo。也就是說,讀寫指標的變化動作是由不同的時鐘產生的。因此,對fifo空或滿的判斷是跨時鐘域的。如何根據非同步的指標訊號對fifo的滿狀態或空狀態進行正確的判斷是本文研究的重點。此外,設計過程中的一些細節問題也將在文中涉及到。

1 指標以及滿空訊號的產生

為了更好地說明問題,先**一下同步fifo指標移動以及滿空訊號的產生過程。對於同步fifo,讀寫指標都指向乙個記憶體的初始位置,每進行一次讀寫操作,相應的指標就遞增一次,指向下乙個記憶體位置。當指標移動到了記憶體的最後乙個位置時,它又重新跳回初始位置。在fifo非滿或非空的情況下,這個過程將隨著讀寫控制訊號的變化一直進行下去。如果fifo處於空的狀態,下乙個讀動作將會導致向下溢位(underflow),乙個無效的資料被讀人;同樣,對於乙個滿了的fifo,進行寫動作將會導致向上溢位(overflow),乙個有用的資料被新寫入的資料覆蓋。這兩種情況都屬於誤動作,因此需要設定滿和空兩個訊號,對滿訊號置位表示fifo處於滿狀態,對滿訊號復位表示fifo非滿,還有空間可以寫入資料;對空訊號置位表示fifo處於空狀態,對空訊號復位表示fifo非空,還有有效的資料可以讀出。

當讀指標和寫指標相等也就是指向同乙個記憶體位置的時候,fifo可能處於滿或空兩種狀態。可以通過不同的方法判斷或區分fifo究竟是處於滿狀態還是空狀態,也就是究竟是寫指標從後趕上了讀指標,還是讀指標從後趕上了寫指標。本文所應用的方法是設定乙個額外的狀態位,指標由它的位址位以及狀態位組成。位址位隨著相應的操作遞增,指標由記憶體的最後位置返回到初始位置的時候狀態位取反。因此,當讀寫指標的位址位和狀態位全部吻合的時候,讀寫指標經歷了相同次數的迴圈移動,也就是說,fifo處於空狀態(圖1(a));如果讀寫指標的位址位相同而狀態位相反,寫指標比讀指標多迴圈一次,標誌fifo處於滿狀態(圖1(b))。

2 二進位制指標和格雷碼指標的同步

二進位制指標是由一位狀態位和若干位二進位制編碼的位址位組成的(例如由三位位址和一位狀態位構成的指標的變化:0000→0001→0010→0011→0100→0101→0110→0111→1000→1001→1010→1011→1100→1101→1110→1111)。如果在不同的時鐘域內直接同步二進位制指標,有可能產生問題。例如,當讀指標從0111向1000變化的時侯,指標所有的位都要變化,如果寫時鐘恰好在讀指標的變化時刻取樣,寫者得到的讀指標值有可能是從0000到1111中的任何乙個。所以二進位制指標不宜被直接同步,但可以通過一對握手訊號同步二進位制指標。

例如,讀指標被讀者存人乙個暫存器時,讀者就發出乙個就緒訊號。當寫者看到就緒訊號時,讀取讀指標,發出乙個收到資料的確認訊號。當讀者看到確認訊號時,就收回就緒訊號,然後用當前的讀指標值重新整理暫存器(圖2)。在收到確認訊號前,存放讀指標的暫存器內容保持不變,確保了被讀取的指標的正確性。

為了能夠在不同的時鐘域內直接同步指標,可以對指標使用格雷碼的編碼方式,也就是指標每次移動只變化一位,這樣就避免了由於指標多位同時變化而無法直接同步的問題。圖3表示了乙個三位位址的記憶體用於格雷碼編碼的fifo。n位位址的記憶體需要n+1位的格雷碼。使用最高位(也就是第n-1位)作為狀態位,從第n—2到第0位作為位址的第n-2位到第0位;對狀態位(也就是第n-1位)和第n-2位進行位異或運算產生位址的第n-2位(也就是位址的最高位)。通過對圖3的觀察可以得知,四位格雷碼編碼的指標和三位二進位制加狀態位編碼的指標具有同樣的功能:指標產生的位址迴圈遍歷8個記憶體位址,每一次遍歷後狀態位取反。值得注意的一點,是當指標從0100變化到1100的時候,相應的位址由100變為000,狀態位和一位位址同時發生了變化,所以不能同步由另乙個時鐘域格雷碼指標產生的狀態位和位址位,此時應該直接由另乙個時鐘域同步指標來完成,由同步後的指標產生相應的狀態位和位址位。

3 保守的滿空判斷

對於非同步fifo設計,無論是採用握手還是直接同步的方法來獲取對方時鐘域的指標,對滿空訊號的判斷總是「保守」的。

(1)滿空訊號的復位(滿訊號復位表示fifo非滿,空訊號復位表示fifo非空)和實際fifo的情況相比有一定的延遲。例如,空訊號是由讀者用讀指標與同步或握手後得到的寫指標進行比較產生的。由於同步或握手需要一定的時間,在這段時間,寫者可能向fifo寫入新的資料,寫指標發生了變化,此時fifo已經非空,但此刻空訊號仍然沒有復位。對於寫者而言,滿訊號的復位也會遇到相同的問題。不過,在通常情況下,fifo只要確保不會向下溢位或向上溢位,復位的延遲就不會導致向下溢位或向上溢位,是可以接受的。

(2)滿空訊號的置位(滿訊號置位表示fifo滿,空訊號置位表示fifo空)和fifo的實際情況相比沒有延遲。例如,同樣考慮fifo為空的情況,讀者使用讀指標和同步或握手後的寫指標進行比較,由於fifo為空,寫動作不會發生,相應的寫指標也保持不變,因此讀者獲得的就是當時的寫指標值。這樣就能馬上對空訊號置位。同樣地,在fifo滿的情況下,由於讀指標不發生變化,寫者得到的是當前的讀指標值,能夠馬上判斷fifo為滿。

從以上兩點的討論可以得出結論,fifo滿空判斷是保守的,寫者可能在fifo還有一定空間時停止寫資料,但不會在fifo已經滿了的情況下繼續寫資料;讀者可能在fifo還有一些有效的資料時停止讀資料,但是不會在fifo已經空的情況下繼續讀資料。保守的滿空判斷能夠滿足fifo的功能要求。

4 二進位制指標和格雷碼指標的比較

二進位制指標和格雷碼指標兩者各有優缺點:

(1)由於通過握手同步,指標可以有多位同時變化,二進位制指標每次移動可以跳躍過任意的長度,這樣給fifo的某些功能的實現帶來了方便(例如,硬體直接控制fifo從快取的資料流中丟棄乙個出錯的包);而格雷碼指標一般只能做遞增或遞減的移動。

(2)二進位制指標可以用於任意大小的fifo;格雷碼指標只能用於大小為2的冪的fifo。

(3) 與直接同步相比,通過握手同步需要多時鐘週期,因此二進位制指標的滿空判斷比格雷碼指標的滿空判斷更「保守」;對於設計乙個容量很大且由記憶體構成的fifo來說,由於保守判斷而損失的空間可以忽略;但對於乙個容量較小的fifo而言,這種「保守」可能是無法接受的。例如,乙個由8個暫存器組成的fifo,對於格雷碼編碼的指標,最壞情況下,fifo被寫者判斷為滿時,裡面實際只存有五個資料(使用兩級同步器,可能需要三個週期同步,而在這三個週期內都有讀動作發生);而對與二進位制編碼的指標,fifo被判為滿時,fifo裡可能只有三個資料或更少(使用兩級同步器,最好的情況下,需要五個週期握手,而在這五個週期裡都有讀動作發生)。

設計者在兩種方法的比較選擇上應該考慮到以上的幾點。

本文介紹的非同步fifo的設計方法的兩種不同盡路都能夠實現功能正確的非同步fifo。對這兩種方法設計的fifo的優缺點所做的簡要分析,對fifo的設計具有指導意義。

非同步fifo 同步FIFO設計實現

在學習跨時鐘域處理的時候,有一種方法是用非同步fifo來處理跨時鐘域處理的。那麼在這之前先看看同步fifo實現。所謂同步fifo,就是讀寫時鐘是同乙個時鐘頻率。本次實現是通過計數器的形式來實現滿空標誌。具體實現如下 module fifo sync input clk input rst n inp...

非同步fifo設計(2)

詳見 首先看一下非同步fifo設計的整體框圖 在該設計中會有6個小模組 1 fifo.v這個模組是頂層模組 2 fifomem.v 這個模組是fifo的記憶體緩衝器,該記憶體屬於雙端ram 3 sync r2w.v 這個模組是將讀指標rd ptr同步化到寫的時鐘域 4 sync w2r.v 這個模組...

非同步fifo的設計 FPGA

fifo的本質是ram,先進先出 重要引數 fifo深度 簡單來說就是需要存多少個資料 fifo位寬 每個資料的位寬 fifo有同步和非同步兩種,同步即讀寫時鐘相同,非同步即讀寫時鐘不相同 同步fifo用的少,可以作為資料快取 非同步fifo可以解決跨時鐘域的問題,在應用時需根據實際情況考慮好fif...