FIFO(First In First Out)是一種先進先出的存儲結構,經常被用來在FPGA設計中進行數據緩存或者匹配傳輸速率。
本文主要介紹FIFO深度計算的方法,FIFO的一個關鍵參數是其深度,也就是FIFO能夠存儲的數據條數,FIFO深度設計的合理,可以防止數據溢出,也可以節省FPGA資源的消耗。
一、FIFO深度計算影響因素
影響FIFO深度計算的主要因素包括:
- FIFO的位寬:決定了每個FIFO存儲單元的大小
- FIFO的數據字長:決定每個數據詞包含多少比特有效數據
- FIFO的總存儲容量:決定最大可以存儲的數據條數
以32位位寬,8位字長的FIFO為例,每個FIFO存儲單元需要32/8=4個字節。
如果FIFO總容量為128字節,那么可以存儲128/4=32個數據。
此外,FIFO深度還需要考慮:
- FPGA資源約束條件:過大的FIFO會占用過多資源
- 實際應用需求:深度過小可能導致數據丟失
- 存儲密度:選擇2的整數次冪作為深度可以優化資源利用
綜合考慮上述各因素后確定最佳的FIFO深度。
二、FIFO深度計算步驟
FPGA FIFO深度計算的基本步驟如下:
- 根據傳輸最惡劣的情況(一段時間內緩存數據量最大的時候),計算剩余數據量(寫數據量 - 讀數據量)。
- 根據剩余數據總存儲容量/寫位寬,計算FIFO最大可存儲的數據量
- 選擇大于等于最大數據量的2的冪作為FIFO深度
- 將FIFO深度轉換為二進制表示
如果寫比讀慢,那就不用擔心數據溢出,只有讀比寫慢的時候,需要考慮fifo深度設計,以防止數據溢出。
三、Verilog代碼示例
下面是使用Verilog代碼計算FIFO深度的示例:
// FIFO參數
parameter DATA_WIDTH = 32; // 32位
parameter WORD_SIZE = 8; // 8位字長
parameter FIFO_SIZE = 128; // 總容量128字節
// 每個FIFO存儲單元的大小
localparam FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;
// FIFO最大可存儲數據量
localparam FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;
// 選擇大于FIFO_MAX_WORDS的2的冪
localparam FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ?
(2**$clog2(FIFO_MAX_WORDS)) : 1;
// FIFO深度比特寬
localparam FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);
這個示例中,根據位寬32位、字長8位和容量128字節,計算出FIFO深度為32,需要5比特表示。
四、SystemVerilog代碼示例
下面是使用SystemVerilog編寫的等價代碼:
// FIFO參數
localparam int DATA_WIDTH = 32;
localparam int WORD_SIZE = 8;
localparam int FIFO_SIZE = 128;
// 每個FIFO存儲單元的大小
localparam int FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;
// FIFO最大可存儲數據量
localparam int FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;
// 選擇大于FIFO_MAX_WORDS的2的冪
localparam int FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ?
2**(FIFO_MAX_WORDS.log2) : 1;
// FIFO深度比特寬
localparam int FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);
SystemVerilog通過使用內置的log2函數可以簡化代碼。
五、FIFO深度計算實例
下面通過一些具體實例進一步說明FIFO深度計算過程。
1、匹配數據帶寬
如果FIFO需要匹配指定的數據帶寬,那么深度計算要考慮串行化因子的影響。
例如需要200MHz的串行LVDS接口,使用10位數據,那么單位時間內可以傳輸200MHz * 10位 = 2Gbps的數據。
如果后端接口是32位寬,100MHz,,那么其帶寬為100MHz * 32位 = 3.2Gbps。為匹配帶寬,前端數據需要緩存,此時FIFO深度計算如下:
后端帶寬 = 3.2Gbps
前端帶寬 = 2Gbps
串行化因子 = 后端帶寬/前端帶寬 = 3.2/2 = 1.6
FIFO深度 > 串行化因子 = 1.6
因此,選擇FIFO深度為2才能匹配帶寬需求。
2、防止數據溢出
如果寫入FIFO的數據速率可能高于讀取速率,那么需要增加FIFO深度來防止數據溢出。
場景1:如寫入速率是100MB/s,讀取速率是80MB/s,允許最大等待時間為50μs,那么需要的FIFO大小計算如下:
寫入速率 = 100MB/s
讀取速率 = 80MB/s
最大等待時間 = 50μs
額外存儲量 = 寫入速率 × 最大等待時間
= 100MB/s × 50μs
= 5000bit
因此,FIFO深度需要考慮額外存儲5000bit的數據量,也就是除了正常存儲量外還需要確保至少有5000bit的額外FIFO深度。
場景2:異步FIFO,寫時鐘100MHZ,讀時鐘80MHZ。讀寫位寬均為16bit。已知每100個寫周期最多寫入960bit數據,讀側每時鐘讀取一個數據。問:FIFO深度至少為多少?
最惡劣情況:前100個周期的后連續60個周期寫入960bit數據,后100個周期的前連續60個周期寫入960bit數據。
寫數據:最大數量為連續120個寫周期內,寫入數據量960*2bit = 1920 bit,用時為120/100 ns。
讀數據:這段時間內的數據量為 120/100 * 80 * 16bit = 1536 bit 。
最大緩存數據量為 1920 - 1536 = 384 bit
寫數據最大緩存深度:384/16 = 24
最大深度需要是2的冪次方,即為32
3、優化資源利用
有時為了優化資源利用,可能需要降低FIFO深度。
例如根據帶寬計算,一個18Kb block RAM可以實現depth=512的FIFO,但考慮到資源限制,只能使用一個9Kb RAM,這時可以將FIFO設計為depth=256,節省block RAM資源。
同樣,為了優化資源利用,FIFO深度通常設計為2的整數次冪,這可以減少地址解碼邏輯所需資源。
六、結論
FIFO深度計算并不復雜,但需要考慮許多實際因素,如帶寬匹配、防溢出和資源優化等。一般來說,根據存儲需求計算出最大深度,再綜合考慮資源和性能約束,選擇大于等于該最大深度的2的冪次方作為最終FIFO深度,既能滿足存儲需求,又可以優化FPGA資源利用。
-
FPGA
+關注
關注
1630文章
21796瀏覽量
605275 -
fifo
+關注
關注
3文章
389瀏覽量
43816 -
存儲結構
+關注
關注
0文章
21瀏覽量
9726
發布評論請先 登錄
相關推薦
評論