異步fifo的設計主要涉及讀寫指針的產生,空滿狀態的判斷
一:簡單講解
重要參數:fifo深度(簡單來說就是需要存多少個數據)
fifo位寬(每個數據的位寬)
FIFO有
同步和
異步兩種,同步即讀寫時鍾相同,異步即讀寫時鍾不相同
同步FIFO用的少,可以作為數據緩存
異步FIFO可以解決跨時鍾域的問題,在應用時需根據實際情況考慮好fifo深度即可
本次要設計一個異步FIFO,深度為8,位寬也是8
二:讀寫指針的產生(格雷碼)
深度為8,如果用二進制表示,3位即可,但這里要考慮空滿狀態。什么是空滿狀態呢?
寫滿,讀空,用一個寫指針控制數據寫入FIFO,讀指針控制讀取數據。當寫指針將FIFO深度寫滿,這時稱為寫滿;當讀指針把數據都讀了出來,這里稱為讀空。
如果
fifo是空的話,意味着該fifo的wr_ptr和rd_ptr的值是相等的。空狀態一般有兩種情況,一種是復位的時候由於wr_ptr和rd_ptr被清0,所以其值相等;另一種情況時rd_ptr的值增加之后追上了wr_ptr 的值,與其相等。
如果fifo是滿的話,也意味着wr_ptr和rd_ptr的值是相等的,但是需要注意的是此時wr_ptr實際上是將rd_ptr套圈之后再一次追上rd_ptr的值與其相等。這樣的話空和滿狀態都意味着wr_ptr和rd_ptr的值是一樣的,那么到底該如何區分是空狀態和滿狀態呢?這就涉及到了異步fifo設計的第一個問題:如何產生fifo的讀寫指針。
這里有兩種解決辦法,一種是增加一個額外的bit來區分;另外一種辦法是利用grey碼。
第一種方法:我們在設計時將指針的位寬設計成 4 位,最高位的作用就是區分是讀空還是寫滿。第一種方法易產生亞穩態等問題,所以不是我們要講述的重點。具體理論 1 如下
當最高位相同,其余位相同認為是讀空
當最高位不同,其余位相同認為是寫滿
注意:理論1試用的是二進制數之間的空滿比較判斷。
第二種方法:grey碼
1:grey碼(貼不了照片,不知道怎么回事)
格雷碼判斷是否為讀空或寫滿時應使用理論 2,看最高位和次高位是否相等,具體如下:
當最高位和次高位相同,其余位相同認為是讀空
當最高位和次高位不同,其余位相同認為是寫滿
可以看出,除了最高位,上圖的格雷碼關於紅線對稱。
格雷碼如何產生呢?
格雷碼可由二進制碼(十進制值同)^ 二進制碼右移一位得到
下面將介紹用到一組flip-flop的設計:這種設計輸出端的寄存器存的是真正的grey碼值(wr_ptr,rd_ptr),grey碼輸出通過Grey-to-binary轉換器得到bin,bin經過一個條件增量器之后產生bnext信號,該值又傳給Binary-to-grey轉換器產生gnext信號。結構圖如下所示:

用到兩組filp-flop的設計:這種設計沒有Grey-to-binary轉換器,並且可以直接映射到fifo內存的地址,也就省去了將fifo內存的地址轉化為grey碼的操作。該設計如下圖所示:

