合集 - FPGA-從0設計你的FIFO(1)1.從0搭建一個FIFO模組-02(系統架構)11-22收起
一、非同步FIFO需要注意的問題
所謂非同步FIFO,指的是寫時鐘與讀時鐘可以不同步,讀時鐘可以比寫時鐘快,反之亦然。思考一下,這樣會直接地造成兩個問題:
1. 讀滿或者寫滿
由於非同步FIFO的基本儲存單元是雙埠RAM,因此讀寫速率不一致,就會造成讀滿或者寫滿的問題。
2. 跨時鐘域的同步
為了判斷讀滿、寫滿的情況,勢必需要將寫指標(告訴讀模組,寫到哪個位置了,我還可不可以繼續讀?)同步到讀模組,(或者讀指標同步到寫模組,通知寫模組,現在讀到哪裡了,我還能不能繼續寫啦?如果還沒讀,我再寫一輪不就把資料覆蓋了啊?),這樣就會存在跨時鐘域的同步問題。
因此,針對上述問題,我們解決辦法如下:
3. 針對問題一,將讀指標與寫指標進行比較,產生讀空、寫滿標誌。
思考一下如何判斷讀空、寫滿標誌呢,假設有一個深度為8的RAM,那麼其地址線的寬度為3,這裡我們擴充套件一位,讓最高位作為讀空、寫滿標誌,(實際給到RAM的只有[2:0]),其原理如下
假設寫指標寫到了0111,此時讀指標也讀到了0111,意味著讀指標追上了寫寫指標,那麼此時就是讀空了;
假設寫指標寫到了1000(實際上是第二輪的000),此時讀指標讀到了000(第一輪的000),那麼就是寫滿。
因此,可以總結:
當最高位相同,其餘位相同認為是讀空
當最高位不同,其餘位相同認為是寫滿
4. 針對問題二:兩級暫存器同步 + 格雷碼
我們將讀寫指標編碼為Gray碼並打兩拍進行同步。採用Gray碼的原因可參考上一篇部落格,簡單來說就是Gray碼相鄰兩個編碼之間只存在一個bit變化,避免多個bit同時跳變的問題。再進行兩拍同步就可以將讀寫指標進行非同步時鐘同步化了。
5. 由於問題二,採用Gray碼,導致我們判斷讀空及寫滿的邏輯需要稍微改變下了:
我們觀察一下基於gray碼的讀空、寫滿的情況:
因此,用格雷碼判斷是否為讀空或寫滿時應看最高位和次高位是否相等:即:
當最高位和次高位相同,其餘位相同認為是讀空
當最高位和次高位不同,其餘位相同認為是寫滿
二、非同步FIFO架構
根據上述討論,我們可以總結一個非同步FIFO的架構包括以下幾個部分:
- 雙埠RAM,作為FIFO的儲存體。可以採用硬體描述的方式描述一個RAM,也可以採用IP核、原語的方式。
- FIFO寫模組,用於產生寫地址,寫使能,寫滿等訊號
- FIFO讀模組,用於產生讀地址,讀使能、讀空等訊號。
- Gray碼轉換模組,用於自然二進位制與Gray碼轉換
- 時鐘同步,用於將讀寫指標打拍同步。
結構框架如下:
三、reference
《Simulation and Synthesis Techniques for Asynchronous FIFO Design》Clifford E. Cummings, Sunburst Design, Inc.
cliffc@sunburst-design.com
本部落格參考飛數機場。轉載請註明出處!