從0搭建一個FIFO模組-02(系統架構)bL

ocenwimtaegrad發表於2024-11-22

合集 - 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),那麼就是寫滿。
image

因此,可以總結:
當最高位相同,其餘位相同認為是讀空
當最高位不同,其餘位相同認為是寫滿

4. 針對問題二:兩級暫存器同步 + 格雷碼

我們將讀寫指標編碼為Gray碼並打兩拍進行同步。採用Gray碼的原因可參考上一篇部落格,簡單來說就是Gray碼相鄰兩個編碼之間只存在一個bit變化,避免多個bit同時跳變的問題。再進行兩拍同步就可以將讀寫指標進行非同步時鐘同步化了。

5. 由於問題二,採用Gray碼,導致我們判斷讀空及寫滿的邏輯需要稍微改變下了:

我們觀察一下基於gray碼的讀空、寫滿的情況:
image

因此,用格雷碼判斷是否為讀空或寫滿時應看最高位和次高位是否相等:即:
當最高位和次高位相同,其餘位相同認為是讀空
當最高位和次高位不同,其餘位相同認為是寫滿

二、非同步FIFO架構

根據上述討論,我們可以總結一個非同步FIFO的架構包括以下幾個部分:

  1. 雙埠RAM,作為FIFO的儲存體。可以採用硬體描述的方式描述一個RAM,也可以採用IP核、原語的方式。
  2. FIFO寫模組,用於產生寫地址,寫使能,寫滿等訊號
  3. FIFO讀模組,用於產生讀地址,讀使能、讀空等訊號。
  4. Gray碼轉換模組,用於自然二進位制與Gray碼轉換
  5. 時鐘同步,用於將讀寫指標打拍同步。
    結構框架如下:
    image

三、reference

《Simulation and Synthesis Techniques for Asynchronous FIFO Design》Clifford E. Cummings, Sunburst Design, Inc.
cliffc@sunburst-design.com

本部落格參考飛數機場。轉載請註明出處!

相關文章