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