FPGA研發(fā)之道(11)-設(shè)計(jì)不是湊波形(一)FIFO(上)
FIFO是FPGA內(nèi)部一種常用的資源,可以通過FPGA廠家的的IP生成工具生成相應(yīng)的FIFO。FIFO可分為同步FIFO和異步FIFO,其區(qū)別主要是,讀寫的時(shí)鐘是否為同一時(shí)鐘,如使用一個(gè)時(shí)鐘則為同步FIFO,讀寫時(shí)鐘分開則為異步FIFO。一般來說,較大的FIFO可以選擇使用內(nèi)部BLOCK RAM資源,而小的FIFO可以使用寄存器資源例化使用。
本文引用地址:http://www.ex-cimer.com/article/264818.htm一般來說,F(xiàn)IFO的主要信號包括:
實(shí)際使用中,可編程滿的信號(XILINX 的FIFO)較為常用,ALTERA的FIFO中,可以通過寫深度(即寫入多少的數(shù)據(jù)值)來構(gòu)造其可編程滿信號。通過配置threshold(門限)的值可以設(shè)定可編程滿起效時(shí)的FIFO深度。
上圖所示為FIFO的模型,可以看做一個(gè)漏桶模型,其中輸入、輸出、滿信號、空信號、可編程滿等信號如圖所示,一目了然。 其中threshold信號可以看做水位線,通過此信號可以設(shè)置可編程滿信號。FIFO的其他的信號也大都與其深度相關(guān),如有特殊需求,可通過廠商提供的IP生成工具的圖形界面進(jìn)行選擇使用。
FIFO的使用場景有多種,其中主要如下所示:
(1) 數(shù)據(jù)的緩沖,如模型圖所示,如果數(shù)據(jù)的寫入速率高,但間隔大,且會有突發(fā);讀出速率小,但相對均勻。則通過設(shè)置相應(yīng)深度的FIFO,可以起到數(shù)據(jù)暫存的功能,且能夠使后續(xù)處理流程平滑,避免前級突發(fā)時(shí),后級來不及處理而丟棄數(shù)據(jù)。
(2) 時(shí)鐘域的隔離。對于不同時(shí)鐘域的數(shù)據(jù)傳遞,則數(shù)據(jù)可以通過FIFO進(jìn)行隔離,避免跨時(shí)鐘域的數(shù)據(jù)傳輸帶來的設(shè)計(jì)與約束上的復(fù)雜度。
FIFO設(shè)計(jì)中有兩個(gè)需要注意事項(xiàng),首先,不能溢出,即滿后還要寫導(dǎo)致溢出,對于數(shù)據(jù)幀的操作來說,每次寫入一個(gè)數(shù)據(jù)幀時(shí),如果每寫一個(gè)寬度(FIFO的寬度)的數(shù)據(jù),都要檢查滿信號,則處理較為復(fù)雜,如果在寫之前沒滿,寫過程不檢查,則就容易導(dǎo)致溢出。因此可編程滿的設(shè)定尤為必要,通過設(shè)置可編程滿的水位線,保證能夠存儲一個(gè)數(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))為主,而每存儲完畢一個(gè)數(shù)據(jù)幀向小FIFO(寄存器實(shí)現(xiàn))內(nèi)寫入值。當(dāng)小FIFO標(biāo)示非空時(shí),則標(biāo)示大FIFO中已存儲一個(gè)整幀。則下一級模塊可以只需檢測小FIFO非空時(shí),從而讀出一個(gè)整幀,過程中大FIFO一直未非空,可以不用處理非空信號,從而簡化設(shè)計(jì)和驗(yàn)證的流程。
此外還有FIFO其他應(yīng)用方式,下節(jié)接著介紹。(未完待續(xù))
fpga相關(guān)文章:fpga是什么
水位傳感器相關(guān)文章:水位傳感器原理
評論