FPGA中,經常會用到FIFO來緩沖數據或者跨時鍾傳遞數據。
1、Almost full & Almost empty
作為初學者,最開始使用FIFO的時候,對於它的理解,無非是配置好位寬、深度;如有必要,再加上Full、Empty信號即可;或者在跨時鍾應用中,選用DCFIFO。
FIFO中有兩個信號,Almost Full和Almost Empty,一直不理解為什么需要這兩個信號。有Full、Empty,為什么還要加上Almost這兩個雞肋?
在讀FIFO時,我們一般在時序邏輯中判斷Empty Signal:如果Empty Signal為低,說明FIFO有數據可以讀,於是拉高Readreq。這在連續讀操作會出問題。

如上圖,第2個clock中Empty signal為高,於是第3個clock中Readreq為高,此時讀出的數據是沒有問題的。但假設此時已經是FIFO的最后一個數據,由第3個clock的Readreq signal,在第4個clock中Empty Signal才會拉高,而在第4個clock中,時序邏輯輸入的Empty Signal是上一個時鍾的低電平信號,於是認為還有有效的FIFO數據,Readreq繼續為高。
有兩種方法解決這個問題:
- Readreq拉高后的下一個時鍾再去判斷Empty Signal;
- 配合使用Almost Empty Signal來處理;
第一種方法每兩個clock才能處理一個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為空后還錯誤的讀出數據。
