FIFO深度計算問題

2021-10-25 00:20:41 字數 4444 閱讀 8319

fifo深度計算公式:

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

burst_length :突發資料個數

x,y:讀時鐘週期裡,每y個時鐘週期會有x個資料讀出fifo

r_clk:讀時鐘

w_clk:寫時鐘

1,同步fifo

對於同步fifo,每100個cycle可以寫入80個資料,每10個cycle可以讀出8個資料,fifo的深度至少為?

答:每100個cycle可以寫入80個資料,我們考慮最壞的情況,背靠背模式,空20個時鐘,剩下80個時鐘寫80個資料,再用80個時鐘寫80個資料,空20個時鐘,這樣的結果就是連著寫了160個資料,共用了200個時鐘,突發資料個數是160

所以fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

同步fifo,讀寫時鐘相同,r_clk=w_clk;

fifo_depth = 160 - 160 *(8/10) * 1 = 160-128=32

2,非同步fifo

wclk=200mhz,100個wclk裡寫入40個資料,rclk=100mhz,10個rclk裡讀出8個資料。那麼fifo深度為?

答:我們考慮最壞的情況,背靠背模式,即空60個wclk,剩下40個wclk寫入有40個資料,接著40個wclk寫40個資料,空60個wclk,那麼突發資料個數為40+40=80

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

fifo_depth = 80 - 80 *(8/10) * 100/200 = 80-32=48

fifo的深度一般是2的整數次冪,要符合格雷碼的編碼轉換規則,因此我們深度一般不選擇48,而是選擇比它大的2的整數次冪的數,比如64或者128

答:可以看出,b的時鐘要大於a的時鐘,如果b為讀時鐘,那麼a為寫時鐘,那就是讀時鐘大於寫時鐘,讀的比寫的快,那麼不會溢位了,所以b應該是寫時鐘,a為讀時鐘

假設讀clka=100mhz,寫clkb=400mhz, 則週期ta=10ns ,tb=2.5ns ,則 enb=10100=1000ns,enb的占空比為25%,即週期的25%為高電平,即為寫資料的時鐘時長,t_enb=100025%=250ns,t_enb/tb=250/2.5 = 100個資料,同時在這250ns時間裡面,讀書資料的個數為250/ta=250/10=25,

所以fifo深度為100-25=75

下面舉幾個例子:

第一種情況:

寫時鐘快於讀時鐘寫和讀的過程中沒有空閒週期,也即在突發(burst)過程中,讀和寫都在各自的時鐘域內連續進行。

答:第一種方法:採取公式計算

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

fifo_depth = 120 - 120 * 1 * 50/80 = 120 - 75 = 45

第二種方法:分析

寫時鐘週期tw = 1000/80 = 12.5ns

讀時鐘週期tr = 1000/50 = 20ns

突發長度是120,寫120個資料,需要的寫時間為120*12.5 = 1500ns

在1500ns的時間,讀了資料個數為1500/20 = 75

所以120-75 = 45

第二種情況

寫時鐘頻率大於讀時鐘頻率,但在讀寫的過程中存在空閒週期。

答:兩個寫資料之間空乙個時鐘,即2個時鐘寫1個資料

兩個讀資料之間空3個時鐘,即4個時鐘讀1個資料

第一種方法:採取公式計算

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

fifo_depth = 120 - 120 * 1/4 * 50/80 = 120 - 18.75 =

第二種方法:分析

寫時鐘週期tw = 1000/80 = 12.5ns

讀時鐘週期tr = 1000/50 = 20ns

突發長度是120,寫120個資料,需要240個時鐘,需要的寫時間為24012.5 = 3000ns

在3000ns的時間,讀了資料個數為3000/(204) = 37.5

最後0.5是不完整資料,取整為37,

所以120-37 = 83

第三種情況

寫時鐘慢於讀時鐘,且讀寫過程中沒有空閒週期;

答: 讀寫沒有空閒,而且寫時鐘慢於讀時鐘,所以應該是永遠不會寫滿,即不會溢位,fifo的深度為1即可

第四種情況

寫時鐘頻率小於讀時鐘頻率,但讀寫過程中存在空閒週期;

答:兩個寫資料之間空乙個時鐘,即2個時鐘寫1個資料

兩個讀資料之間空3個時鐘,即4個時鐘讀1個資料

第一種方法:採取公式計算

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

fifo_depth = 120 - 120 * 1/4 * 50/30 = 120 - 50 = 70

第二種方法:分析

寫時鐘週期tw = 1000/30

讀時鐘週期tr = 1000/50 = 20ns

突發長度是120,寫120個資料,需要240個時鐘,需要的寫時間為2401000/30= 8000ns

在8000ns的時間,讀了資料個數為8000/(204) = 100

所以120-100 = 20

第五種情況

讀寫時鐘速率相同,且無空閒時鐘

答:第一種方法:採取公式計算

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

fifo_depth = 120 - 120 * 1/* 1 = 0

如果讀寫時鐘之間沒有相位差,則不需要fifo就可以進行讀寫呀;

如果二者存在相位差,只需要fifo的深度為1即可。

第六種情況

讀寫時鐘頻率一致,但在讀寫過程中存在空閒週期。

答:兩個寫資料之間空乙個時鐘,即2個時鐘寫1個資料

兩個讀資料之間空3個時鐘,即4個時鐘讀1個資料

第一種方法:採取公式計算

fifo_depth = burst_length - burst_length * x/y * r_clk/w_clk

fifo_depth = 120 - 120 * 1/4 * 50/50 = 120 - 30 = 90

第二種方法:分析

寫時鐘週期tw = 1000/50=20ns

讀時鐘週期tr = 1000/50 = 20ns

突發長度是120,寫120個資料,需要240個時鐘,需要的寫時間為24020= 4800ns

在4800ns的時間,讀了資料個數為4800/(204) =60

所以120-60 = 60

第七種情況

特定條件下,最壞情況分析fifo最小深度;

答:100個時鐘週期寫80個資料,考慮最壞的情況,即背靠背的方式,空閒20個時鐘,剩餘80個時鐘寫80個資料,接著80個時鐘寫80個資料,空20個時鐘,最後的結果就是用160個時鐘要寫160個資料,即突發長度是160,

每10個時鐘讀8個資料,160個時鐘讀了128個資料,

fifo的深度=160-128 = 32

參考文獻1

參考文獻2

FIFO最小深度計算

我們通常需要非同步fifo用作兩個不同時鐘域的模組之間的資料緩衝,確保不會丟失資料。通常因為讀速率慢於寫速率,慢的模組來不及讀取的資料要被快取下來,所以說,fifo的工作模式應該是,資料突發 burst 寫入的形式。也就是隔一段時間突發的寫一組資料。如果連續寫入的話,因為讀速率慢於寫速率,fifo肯...

FIFO深度計算公式

原文 其實很慚愧,在這之前用fifo都是直接用ip,因為應用場景很簡單,因此fifo深度的選擇也比較隨意,並沒想很多。今天在網上看到乙個非同步fifo深度計算的題目,發現對於這塊並不熟悉,因此注意了下,下面寫寫自己的一些理解吧。提前說明下,因為我實際中並沒有碰到需要去計算fifo深度的場景,因此可能...

關於FIFO的深度計算

例如 對於同步fifo,每100個cycle可以寫入80個資料,每10個cycle可以讀出8個資料,fifo的深度至少為?參考 首先 要確實fifo的應用場景 並且最終要保證在最極端的情況下,仍不是發生溢位以及空資料的情況。如果資料是連續的資料流,那在頻率不同的非同步fifo中,當寫入頻率大於讀出頻...