FPGA FIFO 的實現


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 的讀寫方式如下圖所示:

可以看出幾個需要注意的問題:

  1. 讀寫指針都是獨立的。
  2. 讀寫指針都是循環的,滿 16 歸零。
  3. 當讀寫指針都在 0 位置的時候,要注意區分滿和空這兩種截然不同的狀態。

要實現 FIFO,首先要實現的是寄存器組。一個8 * 16 位的寄存器組。

代碼如下:

這個邏輯比較簡單,在時鍾的上升沿存儲數據到對應的端口,接下來編寫測試代碼來測試這個寄存器組:

測試激勵代碼截圖((⊙﹏⊙) TestBench這個我寫的不太好):

下面是仿真結果:

Quartus 在調用 Modelsim 的時候總是自作主張的添加信號到波形窗口,然而總是掉了那么幾個,視頻中刪掉原來的信號信息,增加需要的信號到波形窗口,並重新仿真一次。

有了寄存器組,那么FIFO 就呼之欲出了。

下面是 FIFO 的代碼:

這里使用波形仿真,仿真的結果如下:

好了,FIFO 部分到此結束,(●'◡'●)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM