fifo的本質是ram, 先進先出
重要引數:fifo深度(簡單來說就是需要存多少個資料)
fifo位寬(每個資料的位寬)
fifo有同步和非同步兩種,同步即讀寫時鐘相同,非同步即讀寫時鐘不相同
同步fifo用的少,可以作為資料快取
非同步fifo可以解決跨時鐘域的問題,在應用時需根據實際情況考慮好fifo深度即可
1、讀空訊號如何產生?寫滿訊號如何產生?
讀空訊號:復位的時候,讀指標和寫指標相等,讀空訊號有效(這裡所說的指標其實就是讀位址、寫位址)
當讀指標趕上寫指標的時候,寫指標等於讀指標意味著最後乙個資料被讀完,此時讀空訊號有效
寫滿訊號:當寫指標比讀指標多一圈時,寫指標等於讀指標意味著寫滿了,此時寫滿訊號有效
我們會發現 讀空的條件是寫指標等於讀指標,寫滿的條件也是寫指標等於讀指標,到底如何區分呢?
解決方法:將指標的位寬多定義一位
舉個例子說明:假設要設計深度為 8 的非同步fifo,此時定義讀寫指標只需要 3 位(2^3=8)就夠用了,但是我們在設計時將指標的位寬設計成 4 位,最高位的作用就是區分是讀空還是寫滿,具體理論 1 如下:
當最高位相同,其餘位相同認為是讀空
當最高位不同,其餘位相同認為是寫滿
注意:理論1試用的是二進位制數之間的空滿比較判斷。
但是這篇文章中確不是這樣比較的,而是用的理論2,這裡我解釋一下
由於文章在設計中判斷是讀指標是否等於寫指標的時候,用的是讀寫指標的格雷碼形式(為什麼用格雷碼後面解釋),此時若用上面的理論1就會出問題,
因為格雷碼是映象對稱的,若只根據最高位是否相同來區分是讀空還是寫滿是有問題的,詳情我會慢慢說,請看圖 1
綠色框起來的是0–15的格雷碼,用紅線將格雷碼分為上下兩部分
通過觀察格雷碼相鄰位每次只有1位發生變化,且上下兩部分,除了最高位相反,其餘位全都關於紅線映象對稱,
7 --> 8 ,格雷碼從 0100 --> 1100 ,只有最高位發生變化其餘位相同
6 --> 9 , 格雷碼從 0101 --> 1101 , 只有最高位發生變化其餘位相同
以此類推,為什麼要說映象對稱呢?
試想如果讀指標指向 8,寫指標指向 7 ,我們可以知道此時此刻並不是讀空狀態也不是寫滿狀態
但是如果在此刻套用理論 1 來判斷,看會出現什麼情況,我們來套一下
7的格雷碼與8的格雷碼的最高位不同,其餘位相同,所以判斷出為寫滿。這就出現誤判了,同樣套用在 6 和 9,5 和 10等也會出現誤判。
因此用格雷碼判斷是否為讀空或寫滿時應使用理論 2,看最高位和次高位是否相等,具體如下:
當最高位和次高位相同,其餘位相同認為是讀空
當最高位和次高位不同,其餘位相同認為是寫滿
補:理論2這個判斷方法適用於用格雷碼判斷比較空滿
在實際設計中如果不想用格雷碼比較,就可以利用格雷碼將讀寫位址同步到乙個時鐘域後再將格雷碼再次轉化成二進位制數再用理論1進行比較就好了。。
**:
非同步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的設計方法
對於非同步fifo而言,資料是由某乙個時鐘域的控制訊號寫入fifo,而由另乙個時鐘域的控制訊號將資料讀出fifo。也就是說,讀寫指標的變化動作是由不同的時鐘產生的。因此,對fifo空或滿的判斷是跨時鐘域的。如何根據非同步的指標訊號對fifo的滿狀態或空狀態進行正確的判斷是本文研究的重點。此外,設計過...