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