使用FIFO積累
| FIFO是在FPGA設計中使用的非常頻繁,也是影響FPGA設計代碼穩定性以及效率等得關鍵因素。我總結一下我在使用FIFO過程中的一些心得,與大家分享。 我本人是做有線通信的,所做的設計中大量的使用到FIFO,用於報文的緩存。我經常使用一個FIFO存報文內容,另一個FIFO存報文的長度,兩者配合使用。 在數據連續讀取時,為了能不間斷的讀出數據而又不導致FIFO為空后還錯誤的讀出數據。可以將FIFO的Empty和Almost_empty以及讀使能配合起來使用,來保證能夠連續讀,並准確的判斷FIFO空滿狀態,提前決定是否能啟動讀使能。具體的實施辦法是:當Empty為1,立即停止讀;當Empty為0,Almost_empty為0時,可以放心讀;當Empty為0,但是Almost_empty為1時,如果上一拍讀使能Read也為1,那么不能讀;當Empty為0,但是Almost_empty為1時,如果上一拍讀使能Read為0,可以讀最后一拍。 在FIFO使用時,使用到Almost_full信號以及讀寫counter來控制FIFO的讀滿預警,如果數據不是在空滿判斷的下一拍寫入FIFO,則設計FIFO的滿預警時要小心。如果你不確定判斷滿預警之后要延遲多少拍才能真正寫入FIFO,那么盡量讓FIFO有足夠滿預警裕量。例如,在wr_data_count為128才是真的滿了,你可以設成wr_data_count為120的時候就給出滿預警,可以保證設計的可靠和安全。當然,如果你能准確的算出判斷滿預警與真正寫入FIFO的延遲,可以用精確的滿預警閾值。 當需要使用到數據位寬轉換時,如將128位的數據轉換成64位的數據,最好不要用XILINX自己生成的位寬轉換FIFO。可以例化兩個64位的FIFO,自己控制128轉64。這樣可以大大的節省資源,是XILINX CORE生成的FIFO資源的一半。 |
(1)FIFO作為跨時鍾域使用;
多bit位寬,盡量使用FIFO進行跨時鍾域;如果僅僅是打兩拍解決的話,會引起vivado布線困難;造成臨近邏輯不穩定;
避免過約束引起的時序問題;
(2)FIFO作為數據位寬轉換使用;
一般在同一時域下不必用FIFO作為位寬的轉換;若跨時鍾域可以采用xilinx IP進行生成對應的轉換,如果在資源非常緊張的情況下,需要考慮其他的方法,減少FIFO的使用;
FIFO作為轉換位寬時,高位優先出(將寬bit轉窄bit);先進置於高位(窄bit轉寬bit);
(3)FIFO優化時序
優先使用內部的RAM塊實現FIFO;若為了布線可以使用分布式資源布線;RAM資源實現FIFO和調整輸入輸出位寬,分布式Lut資源輸出位寬與輸入位寬一致;
(4)FIFO的控制
通過圖2、圖3可以看到,FIFO可以使用full/empty/almost_full/almost_empty進行控制;讀寫計數值可以作為的狀態機的控制值;
(5)FIFO的時序問題
FIFO根據不同的配置,讀寫時序一般低於450Mhz,當速率過高需要考慮布線問題;
(6)FIFO的資源使用
FIFO的summary中可以看出當前配置下,FIFO需要使用到的BRAM資源、LUT資源等;對於BRAM來說,有BRAM18K和BRAM36K,但實際上一個BRAM36K還是由兩個BRAM18K合並實現;
(7)端口的時鍾域
參看FIFO官方手冊體現了讀寫端口的時鍾域分布。

圖1: FIFO實現類型

圖2:可配置的full/empty

圖3:讀寫計數

圖4:FIFO詳細summary
