FIFO的時序和應用——FPGA的個人筆記

FIFO即First in first out.就是先進先出。這種技術其實早已經不是什麼新鮮東西。網上有關它的描述很多,但是還是想說一下自己的理解。本篇博客挖掘的不是太深入,只是介紹了一下FIFO的時序。將重點放在寫空(wrempty)、寫滿(wrfull)、讀空(rdempty)、讀滿(rdfull)等幾個關鍵狀態上。

筆者在用FPGA實現這個功能前,看了看原子哥的教程視頻。有關FIFO的用途原理等,原子哥講的已經很詳細了,其它博客也有關於FIFO的介紹。但筆者覺得在寫空、寫滿、讀空、讀滿時序等細節方面原子哥沒有說的太清楚(很可能是本人愚昧,沒能理解其中的含義),因此寫下了此文。

1.首先畫一個FIFO模塊如下圖所示。在這個FIFO中包含了寫時鐘、讀時鐘、輸入數據、輸出數據、寫請求、讀請求、寫空、讀空、寫滿、讀滿等端口。

2.理解寫空(wrempty)、寫滿(wrfull)、寫請求(wrreq)之間的關係(以下用英文代替這幾個專業術語)。

所謂wrempty,簡單的理解就是FIFO內沒有有效的數據了;wrfull與wrempty對應,意思是FIFO中沒有多餘的存儲空間了當然就是full了。當FIFO在wrfull狀態的時候,很自然地得出結論:當處於“寫滿(wrfull)”狀態時,一定不要讓“寫請求(wrreq)”發出繼續寫入FIFO的信號至於wrempty與wrreq間的關係,我們不用關心,這是因爲:只要不是wrfull狀態,FIFO就有多餘的存儲空間,就有充分的責任歡迎數據的寫入。那麼有意思的問題來了,只要一根線能用兩種狀態(0和1)表示能否向FIFO中寫入,爲啥還需要兩根線呢?這個問題俺也不知道了,希望有了解的大神,看到了幫俺解答一下。下邊還是給出我自己畫的時序圖(Types表示FIFO上的端口類型是輸出,沒標記爲輸入)~

                                                                                        寫時序圖

3.理解讀空(rdempty)、讀滿(rdfull)、讀請求(rdreq)之間的關係(以下用英文代替這幾個專業術語)。

所謂rdempty,簡單的理解就是FIFO內有效數據都被設備讀完了;rdfull與rdempty對應,意思是FIFO中現在沒有多餘的存儲空間了。當FIFO在rdempty狀態的時候,很自然地得出結論:當處於“讀空(rdempty)”狀態時,一定不要讓“讀請求(rdreq)”發出繼續讀出的信號。至於rdfull和rdreq的關係,我們不用關心,這是因爲:只要不是rdempty狀態,FIFO就有數據,有充分的義務向外部設備供應數據。那麼有意思的問題來了,只要一根線能用兩種狀態(0和1)表示能否從FIFO中讀出,爲啥還需要兩根線呢?這個問題俺還是不知道,希望有了解的大神,看到了幫俺解答一下。下邊還是給出我自己畫的時序圖(Types表示FIFO上的端口類型是輸出,沒標記爲輸入)~

                                                                                          讀時序圖(show-ahead模式)

4.仿真驗證。

下邊附上Modelsim的仿真結果,向FIFO中寫入隨機的數據,再從FIFO中讀出來。爲了驗證方便,將wr_clk與rd_clk設置成一模一樣(第一行)。圖中前4個標尺標明瞭在wr_clk上升沿的時候分別將第二行的0x2a,0x5c,0x4d,0x25四個隨機數據寫進了FIFO,第4、5、6、7個標尺標明瞭在rd_clk上升沿時,將FIFO中的數據按順序讀了出來(第三行),也是0x2a,0x5c,0x4d,0x25這四個數據。這證明了上述理解沒有錯誤。FIFO的實現及其仿真的源碼請點擊這裏下載


謝謝閱讀,請各路大神批評指正。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章