FIFO是FPGA內(nèi)部一種常用的資源,,可以通過FPGA廠家的的IP生成工具生成相應(yīng)的FIFO,。FIFO可分為同步FIFO和異步FIFO,其區(qū)別主要是,,讀寫的時鐘是否為同一時鐘,,如使用一個時鐘則為同步FIFO,讀寫時鐘分開則為異步FIFO,。一般來說,,較大的FIFO可以選擇使用內(nèi)部BLOCK RAM資源,,而小的FIFO可以使用寄存器資源例化使用。 一般來說,,FIFO的主要信號包括:
實(shí)際使用中,,可編程滿的信號(XILINX 的FIFO)較為常用,ALTERA的FIFO中,,可以通過寫深度(即寫入多少的數(shù)據(jù)值)來構(gòu)造其可編程滿信號,。通過配置threshold(門限)的值可以設(shè)定可編程滿起效時的FIFO深度。
上圖所示為FIFO的模型,,可以看做一個漏桶模型,,其中輸入、輸出,、滿信號,、空信號、可編程滿等信號如圖所示,,一目了然,。 其中threshold信號可以看做水位線,通過此信號可以設(shè)置可編程滿信號,。FIFO的其他的信號也大都與其深度相關(guān),,如有特殊需求,可通過廠商提供的IP生成工具的圖形界面進(jìn)行選擇使用,。 FIFO的使用場景有多種,,其中主要如下所示: (1) 數(shù)據(jù)的緩沖,如模型圖所示,,如果數(shù)據(jù)的寫入速率高,,但間隔大,且會有突發(fā),;讀出速率小,,但相對均勻。則通過設(shè)置相應(yīng)深度的FIFO,,可以起到數(shù)據(jù)暫存的功能,,且能夠使后續(xù)處理流程平滑,避免前級突發(fā)時,,后級來不及處理而丟棄數(shù)據(jù),。 (2) 時鐘域的隔離。對于不同時鐘域的數(shù)據(jù)傳遞,,則數(shù)據(jù)可以通過FIFO進(jìn)行隔離,,避免跨時鐘域的數(shù)據(jù)傳輸帶來的設(shè)計與約束上的復(fù)雜度。 FIFO設(shè)計中有兩個需要注意事項,,首先,,不能溢出,,即滿后還要寫導(dǎo)致溢出,對于數(shù)據(jù)幀的操作來說,,每次寫入一個數(shù)據(jù)幀時,,如果每寫一個寬度(FIFO的寬度)的數(shù)據(jù),都要檢查滿信號,,則處理較為復(fù)雜,,如果在寫之前沒滿,寫過程不檢查,,則就容易導(dǎo)致溢出,。因此可編程滿的設(shè)定尤為必要,通過設(shè)置可編程滿的水位線,,保證能夠存儲一個數(shù)據(jù)幀,,這樣寫之前檢查可編程滿即可。 其次,,另一更容易出錯的問題,,就是空信號。對于FIFO來說,,在讀過程中出現(xiàn)空信號,,則其沒有代表該值沒有被讀出,對于讀信號來說,,如設(shè)定讀出一定長度的值,,只在一開始檢測非空,如狀態(tài)機(jī)的觸發(fā)信號,,容易出現(xiàn)過程中間也為空的信號,,會導(dǎo)致某些數(shù)據(jù)未讀出,特別是寫速滿而讀速快的場景下,。 因此rden與!empty信號要一起有效才算將數(shù)據(jù)讀出,。 空信號處理相對容易出錯,懶人自有笨方法,,下面介紹一種應(yīng)用于數(shù)據(jù)幀處理的FIFO使用方式,,只需在讀開始檢測空信號即可,,可以簡化其處理讀數(shù)據(jù)的流程: 其處理結(jié)構(gòu)如上圖所示,,數(shù)據(jù)緩存以大FIFO(BLOCK RAM實(shí)現(xiàn))為主,而每存儲完畢一個數(shù)據(jù)幀向小FIFO(寄存器實(shí)現(xiàn))內(nèi)寫入值,。當(dāng)小FIFO標(biāo)示非空時,則標(biāo)示大FIFO中已存儲一個整幀,。則下一級模塊可以只需檢測小FIFO非空時,從而讀出一個整幀,,過程中大FIFO一直未非空,,可以不用處理非空信號,,從而簡化設(shè)計和驗(yàn)證的流程。 此外還有FIFO其他應(yīng)用方式,,下節(jié)接著介紹,。(未完待續(xù)) |
|