什么是FIFO?
FIFO是First in First out 的縮寫(xiě),一般是由寄存器reg或者ram搭起來(lái)的,相對(duì)于普通存儲(chǔ)器而言,F(xiàn)IFO沒(méi)有地址可操作的地址總線(xiàn),因而使用比較方便,但是數(shù)據(jù)只能像水流一樣排隊(duì)進(jìn)排隊(duì)出。
什么情況下使用FIFO?
FIFO一般發(fā)生在不同時(shí)鐘域下數(shù)據(jù)的交互或者同一時(shí)鐘域下寫(xiě)快讀慢的情況下,就像“蓄水池“一樣,讓下游來(lái)不及處理的數(shù)據(jù)暫存起來(lái),不會(huì)因此而發(fā)生數(shù)據(jù)丟失。當(dāng)然寫(xiě)時(shí)鐘數(shù)據(jù)不能一直是持續(xù)的寫(xiě)入,否則再大的fifo遲早也會(huì)溢出。寫(xiě)時(shí)鐘側(cè)數(shù)據(jù)應(yīng)是突發(fā)寫(xiě)入,在某一段時(shí)間內(nèi)寫(xiě)數(shù)據(jù)是大于讀數(shù)據(jù)的,此時(shí)FIFO的深度要保證這段時(shí)間內(nèi)數(shù)據(jù)不會(huì)溢出。從長(zhǎng)時(shí)間軸來(lái)看寫(xiě)口和讀口流量必定是均衡的。從帶寬角度來(lái)看寫(xiě)帶寬是大于讀帶寬的,F(xiàn)IFO的作用就是完成大帶寬到小帶寬的轉(zhuǎn)變。
什么是FIFO的閾值?
FIFO的接口信號(hào)一般會(huì)有將滿(mǎn)prog_full和prog_empty信號(hào),對(duì)應(yīng)afull_cnt將滿(mǎn)閾值和aempty_cnt 將空閾值;當(dāng)FIFO的數(shù)據(jù)data_count大于afull_cnt 時(shí),將滿(mǎn)afull 將會(huì)拉高,由于路徑上有一定延時(shí)(Nxclk)因此必須要提前通知上游模塊,不要再給下游模塊發(fā)數(shù)據(jù)了,否則FIFO會(huì)溢出,不會(huì)使用full滿(mǎn)信號(hào)作為通知上游的反壓信號(hào)。Prog_empty 信號(hào)一般不會(huì)使用,使用empty,F(xiàn)IFO非空即讀。
FIFO的閾值如何設(shè)置?
1.當(dāng)FIFO的數(shù)據(jù)等于afull_cnt時(shí),afull 開(kāi)始拉高,反壓 路徑延時(shí)M拍到達(dá)上游模塊Module A,此時(shí)FIFO中的數(shù) 據(jù)拍數(shù)為afull_cnt + M
2.上游模塊ModuleA 收到afull信號(hào)后開(kāi)始響應(yīng),但是還 會(huì)給下游發(fā)送路徑流水?dāng)?shù)據(jù)N拍
此時(shí)FIFO中的數(shù)據(jù)為afull_cnt +M +N
3.為了數(shù)據(jù)不會(huì)溢出,F(xiàn)ifo_depth >= afull_cnt +M +N ;得到afull_cnt <=Fifo_depth –(M+N)
FIFO的深度如何計(jì)算?
上述而得到的afull_cnt 最大值,沒(méi)有得到下限值。在沒(méi)有考慮反壓期間下游Module B 需要讀出的數(shù)據(jù),為了保證FIFO不會(huì)被讀空。
這里考慮FIFO是異步(wclk快于rclk)的場(chǎng)景,(M+N)是寫(xiě)時(shí)鐘wclk域下的時(shí)鐘周期拍數(shù),而在讀時(shí)鐘rclk域下時(shí)鐘周期拍數(shù)(rclk/wclk)*(M+N);反壓期間FIFO需要至少要存有M+N拍數(shù)據(jù)以防被下游模塊讀空,導(dǎo)致數(shù)據(jù)斷流(極限情況下rclk=wclk) ;
FIFO的深度一方面要要能緩存當(dāng)起反壓afull后上游的數(shù)據(jù)流水;另一方面也要使得當(dāng)反壓撤銷(xiāo)后不會(huì)被下游讀空,Afull_cnt應(yīng)不小于(M+N)。從而得到fifo_depth >=(M+N)+ (M+N) =2*(M+N)。
由于異步FIFO通過(guò)比較讀寫(xiě)指針進(jìn)行滿(mǎn)空判斷,但是讀寫(xiě)指針屬于不同的時(shí)鐘域,所以在比較之前需要先將讀寫(xiě)指針進(jìn)行同步處理,這樣在設(shè)計(jì)的時(shí)候讀寫(xiě)指針用了至少兩級(jí)寄存器同步,同步會(huì)消耗至少兩個(gè)時(shí)鐘周期,勢(shì)必會(huì)使得判斷空或滿(mǎn)有所延遲。滿(mǎn)判斷時(shí)并不是真的滿(mǎn),有2個(gè)地址不會(huì)進(jìn)行讀寫(xiě),因此在理論計(jì)算的fifo的深度上要多加2。通常FIFO深度會(huì)留有20%左右的裕量;而且對(duì)與異步FIFO而言FIFO的深度只能是2^n
如下圖所示,如果afull_cnt設(shè)的過(guò)小假設(shè)為5 M+N=15 fifo將會(huì)被讀空。導(dǎo)致數(shù)據(jù)斷流T->T+15 是起反壓期間,寫(xiě)多少,讀走多少,data_count 不會(huì)變化維持在afull_cnt 上,當(dāng)撤銷(xiāo)反壓之后(T+15->T+30) 這段時(shí)間不會(huì)有數(shù)據(jù)寫(xiě)入,因此必須使得afull_cnt 大于M+N.
此例,對(duì)于異步FIFO而言,fifo深度理論計(jì)算至少等于2*15+2 =32 正好是2^n,為了設(shè)計(jì)的可靠性,一般會(huì)預(yù)留一定裕量,異步FIFO的深度將會(huì)擴(kuò)大一倍,depth=64;15<=Afull_cnt <64-15=49;這個(gè)區(qū)間內(nèi)都是合理的。
FIFO的深度計(jì)算公式
1.如果從帶寬的角度分析FIFO的深度,則FIFO的深度和寫(xiě)口和讀口最大帶寬差有關(guān)。
帶寬計(jì)算公式:bw=freq*data_width
一般考慮的場(chǎng)景:空閑----bust-----空閑----bust
深度計(jì)算公式:T(bust)*bw(read)+fifo_depth >=T(bust)*bw(write)
且保證空閑時(shí)間內(nèi)slave把FIFO讀空:T(空間)*bw(read) >=fifo_dpeth
極端的場(chǎng)景:空閑---bust---bust----空--- (背靠背場(chǎng)景)
深度計(jì)算公式:T(bust)*bw(read)+fifo_depth >=2*T(bust)*bw(write)
且保證空閑時(shí)間內(nèi)slave把FIFO讀空:T(空閑時(shí)間)*bw(read) >=fifo_dpeth
2.FIFO用于緩沖塊數(shù)據(jù)流,一般用在寫(xiě)快讀慢時(shí),遵循的規(guī)則如下:
{FIFO深度 /(寫(xiě)入速率 - 讀出速率)} = {FIFO被填滿(mǎn)時(shí)間} > {數(shù)據(jù)包傳送時(shí)間}= {寫(xiě)入數(shù)據(jù)量 / 寫(xiě)入速率}
即:保對(duì)FIFO寫(xiě)數(shù)據(jù)時(shí)不存在overflow,從FIFO讀出數(shù)據(jù)時(shí)不存在underflow
計(jì)算公式如下:
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
寫(xiě)時(shí)鐘頻率w_clk,
讀時(shí)鐘頻率 r_clk,
寫(xiě)時(shí)鐘周期里,每B個(gè)時(shí)鐘周期會(huì)有A個(gè)數(shù)據(jù)寫(xiě)入FIFO
讀時(shí)鐘周期里,每Y個(gè)時(shí)鐘周期會(huì)有X個(gè)數(shù)據(jù)讀出FIFO
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120385 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7035瀏覽量
89045 -
fifo
+關(guān)注
關(guān)注
3文章
388瀏覽量
43684
原文標(biāo)題:FIFO閾值設(shè)置及深度計(jì)算原理
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論