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