FIFO(first in first out),具備讀寫端口各一個,外部無需控制地址。
FIFO與普通RAM的區別在於FIFO外部忽略對讀寫地址的管理,而只需要關注空滿狀態。
異步FIFO設計框圖
參數:時鍾、數據位寬、深度、讀寫指針、空滿判斷、RAM空間大小
實質:控制信號+RAM
設計要點
- 讀、寫時鍾域的地址管理
- 寫地址到讀時鍾域的同步
- 讀地址到寫時鍾域的同步
- 讀時鍾域的空和將空信號控制
- 寫時鍾域的滿和將滿信號控制
判滿判空
以深度為1024的FIFO為例,假設一直沒有讀操作,讀指針停在地址0處。當寫完1024個數據后,寫指針又回到了地址0處,此時讀寫地址相等。而隨寫隨讀,讀寫地址也相等。所以無法通過讀寫地址進行判滿判空。
因此可以對地址增加1個高bit,來指示是否發生了回卷。此時若讀寫地址相等,則為空。若最高bit不同,但其余位相同,那么則為滿。
判滿時,需要將讀地址同步到寫時鍾域進行判斷。判空時,需要將寫地址同步到讀時鍾域進行判斷。
為什么采用格雷碼同步地址
因為FIFO的地址是逐1增加的,因此可以把逐1增加的地址編碼為相鄰數只有1位不同的格雷碼。在實現跨時鍾域信號采集時,如果數據每次只改變一位,那么就可以使用單比特跨時鍾域處理方式直接采樣。
二進制碼和格雷碼轉換
B2G
二進制碼右移一位,高位補0,與原二進制碼按位相異或。
assign gray = (bin >> 1)^ bin
G2B
Gn = Bn;
Gi-1=Bi ^ Bi-1; ( i=1,2,n-1; )
assign bin[N-1] = gray[N-1] ;
generate
genvar i;
for(i=0;i<N-1;i=i+1) begin:b2g
assign binary[i] = grey[i]^binary[i+1];
end
endgenerate