參考文章:http://blog.pfan.cn/yanyoushuai/34540.html
FIFO即First in first out,也叫先入先出電路,可以實現數據先進先出的存儲器件。
FIFO一般普遍用作數據緩沖器,也可以用於順序數據的緩沖,比如音頻信號或視頻信號。另一個廣泛的應用是在處理器之間的通訊中。
FIFO的基本單元是寄存器。作為存儲器件,FIFO的存儲能力是由其內部定義的存儲寄存器的數量決定。FIFO存儲器一般以數據量的(深度,即寄存單元的個數)
deepth*width(寬度,即一寄存單元的bits)的形式來說明所采用的基本結構。
第一代FIFO存儲器是基於“導向”理論的,數據從輸入端被移到輸出端,所需要的時間稱為導向時間。每一個數據字需要一個狀態觸發器,因此對數據鎖存的控制只能實現很短的
FIFO的操作以長度為8的FIFO為例說明其工作原理,如下圖:
________________________
D, C, B, A ——> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8|———>
兩邊的箭頭表示數據移動的方向。A,B,C,D表示被處理的數據。1,2,3,4,……8表示FIFO的8個存儲單元。
表明這個FIFO中共有8個寄存器單元。每個寄存器單元可以存儲一個數據。所以寄存器的單元越多,FIFO的存儲能力就越強。
每個寄存器單元的位寬與FIFO的輸入和輸出端的位寬是一致的。如果要處理的數據A,B,C,D是16位的數據,那么輸入輸出端及每個寄存器單元的位寬就都是16位。
這個FIFO可以命名為8X16 FIFO。它在每一個時鍾上升沿到來時,數據向右移動一個存儲單元。這樣在時鍾的控制下,數據從左到右通過存儲單元
FIFO通常是雙端口的存儲器,其中一個端口用於寫入數據,而另一個端口用於讀出數據。可以同時對存儲器字存儲單元進行寫入和讀出操作。它的數據吞吐率是普通RAM的兩倍。
FIFO型的存儲器不需要由地址來存取數據。需要由另外的信號線(或標志)來指明存儲器的內容狀態。
現在的FIFO存儲器采用SRAM單元來實現。它是基於帶兩個指針的環行FIFO結構的。要寫入的數據的存儲地址放在寫指針中,
而FIFO結構中要讀出的第一個數據的地址放在讀指針中。在復位后,兩個指針都指向存儲器的同一個字單元,每次寫操作后,寫指針指向下一個存儲單元。
對數據字的讀取操作,會把讀指針指向下一個要讀取的數據字,讀指針就不斷地跟隨寫指針,當讀指針跟上寫指針后,FIFO的結構里面為空。
如果寫指針追上讀指針,FIFO結構里面的數據是滿載的。
如果從硬件上來實現循環存儲器,可以用雙端口的SRAM來存取數據。指針用二進制計數器的特征,它用於產生SRAM的存儲器地址,
同步FIFO存儲器的基本結構包括存儲器陣列,標志邏輯和擴展邏輯(圖太難畫了,就不貼了)。存儲器陣列由雙端口存儲單元構成。
允許同時對存儲單元的兩個端口(讀端口和寫端口)進行存取。標志邏輯用於比較兩個地址指針的值,如果兩個值的比較結果為零,FIFO存儲器為全空,同時全空標志為真。
如果兩個值的比較結果等於存儲器的容量深度,說明存儲器全滿,同時全滿標志為真。還可以設置其他一些標志,比如半滿,可編程接近滿,可編程接近空等。
它們也通過對偏移量寄存器中的編程值和存儲器陣列中的字的數量進行比較來生成,擴展邏輯通過對多個模塊按容量深度擴展結構進行的級聯來形成更深的FIFO存儲器,
采用令牌傳遞方法來實現邏輯上容量更深的FIFO。
在普通模式下(沒有進行容量,深度級聯的模式),每一個地址在到達最大值后,會跳會到零。
在容量深度擴展模式下,當地址指針到達最大值后,一個脈沖信號會送到擴展端口,該端口把令牌傳到另一個FIFO存儲器中(直到令牌重新傳回來,這個地址指針才會增加),
(這個地方還有點模糊,有待解決。)
字寬擴展,可以使FIFO存儲器有更寬的數據通路。在字寬擴展模式中,讀操作,寫操作和重傳輸都一樣。要在字寬上擴展多個FIFO存儲器,必須同時通過對每個存儲器的狀態
標志進行與操作生成“混合標志”。混合標志也包括全空標志和全滿標志。這樣才能保證FIFO存儲器保持同步。