FIFO (First Input First Output),中文名為先入先出存儲器。顧名思義,FIFO 的數據進出方式為先入先出。FIFO 常用用在兩個不同步的信號接口之間作為數據緩沖器。理想情況下 FIFO 的讀寫應該是兩個時鍾驅動的獨立的信號。要實現這樣的功能必須用到雙口 RAM。但 FPGA 不同於 ASIC,雙口 RAM 無法實現。所以這里的 FIFO是一個單端口的同步 FIFO,約定 FIFO 位寬為 8 bit,長度為 16。
Altera Cyclone IV FPGA 內部提供了雙口 RAM 的 IP 核,具體實現方式應該是內嵌的硬核。調用 IP 核的方式不利於學習,也不利於程序的移植,本篇暫不做討論。
FIFO 的讀寫方式如下圖所示:
可以看出幾個需要注意的問題:
- 讀寫指針都是獨立的。
- 讀寫指針都是循環的,滿 16 歸零。
- 當讀寫指針都在 0 位置的時候,要注意區分滿和空這兩種截然不同的狀態。
要實現 FIFO,首先要實現的是寄存器組。一個8 * 16 位的寄存器組。
代碼如下:
這個邏輯比較簡單,在時鍾的上升沿存儲數據到對應的端口,接下來編寫測試代碼來測試這個寄存器組:
測試激勵代碼截圖((⊙﹏⊙) TestBench這個我寫的不太好):
下面是仿真結果:
Quartus 在調用 Modelsim 的時候總是自作主張的添加信號到波形窗口,然而總是掉了那么幾個,視頻中刪掉原來的信號信息,增加需要的信號到波形窗口,並重新仿真一次。
有了寄存器組,那么FIFO 就呼之欲出了。
下面是 FIFO 的代碼:
這里使用波形仿真,仿真的結果如下:
好了,FIFO 部分到此結束,(●'◡'●)。