FPGA研發之道(11)-設計不是湊波形(一)FIFO(上)

FIFOFPGA內部一種常用的資源,可以通過FPGA廠家的的IP生成工具生成相應的FIFOFIFO可分爲同步FIFO和異步FIFO,其區別主要是,讀寫的時鐘是否爲同一時鐘,如使用一個時鐘則爲同步FIFO,讀寫時鐘分開則爲異步FIFO。一般來說,較大的FIFO可以選擇使用內部BLOCK RAM資源,而小的FIFO可以使用寄存器資源例化使用。

    一般來說,FIFO的主要信號包括:

信號

數據信號

讀信號

rd_en

讀數據

dout

讀空信號

empty

寫信號

wr_en

寫數據

din

寫滿信號

full

    實際使用中,可編程滿的信號(XILINX FIFO)較爲常用,ALTERAFIFO中,可以通過寫深度(即寫入多少的數據值)來構造其可編程滿信號。通過配置threshold(門限)的值可以設定可編程滿起效時的FIFO深度。

 

     上圖所示爲FIFO的模型,可以看做一個漏桶模型,其中輸入、輸出、滿信號、空信號、可編程滿等信號如圖所示,一目瞭然。 其中threshold信號可以看做水位線,通過此信號可以設置可編程滿信號。FIFO的其他的信號也大都與其深度相關,如有特殊需求,可通過廠商提供的IP生成工具的圖形界面進行選擇使用。

     FIFO的使用場景有多種,其中主要如下所示:

(1)       數據的緩衝,如模型圖所示,如果數據的寫入速率高,但間隔大,且會有突發;讀出速率小,但相對均勻。則通過設置相應深度的FIFO,可以起到數據暫存的功能,且能夠使後續處理流程平滑,避免前級突發時,後級來不及處理而丟棄數據。

(2)       時鐘域的隔離。對於不同時鐘域的數據傳遞,則數據可以通過FIFO進行隔離,避免跨時鐘域的數據傳輸帶來的設計與約束上的複雜度。

    FIFO設計中有兩個需要注意事項,首先,不能溢出,即滿後還要寫導致溢出,對於數據幀的操作來說,每次寫入一個數據幀時,如果每寫一個寬度(FIFO的寬度)的數據,都要檢查滿信號,則處理較爲複雜,如果在寫之前沒滿,寫過程不檢查,則就容易導致溢出。因此可編程滿的設定尤爲必要,通過設置可編程滿的水位線,保證能夠存儲一個數據幀,這樣寫之前檢查可編程滿即可。

其次,另一更容易出錯的問題,就是空信號。對於FIFO來說,在讀過程中出現空信號,則其沒有代表該值沒有被讀出,對於讀信號來說,如設定讀出一定長度的值,只在一開始檢測非空,如狀態機的觸發信號,容易出現過程中間也爲空的信號,會導致某些數據未讀出,特別是寫速滿而讀速快的場景下。 因此rden!empty信號要一起有效纔算將數據讀出。

空信號處理相對容易出錯,懶人自有笨方法,下面介紹一種應用於數據幀處理的FIFO使用方式,只需在讀開始檢測空信號即可,可以簡化其處理讀數據的流程:

     其處理結構如上圖所示,數據緩存以大FIFOBLOCK RAM實現)爲主,而每存儲完畢一個數據幀向小FIFO(寄存器實現)內寫入值。當小FIFO標示非空時,則標示大FIFO中已存儲一個整幀。則下一級模塊可以只需檢測小FIFO非空時,從而讀出一個整幀,過程中大FIFO一直未非空,可以不用處理非空信號,從而簡化設計和驗證的流程。

      此外還有FIFO其他應用方式,下節接着介紹。(未完待續)

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