FIFO深度計算公式

2021-08-28 03:41:37 字數 2444 閱讀 8993

原文:

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

首先,一定要理解清楚fifo的應用場景,這個會直接關係到fifo深度的計算,如果是面試官丟擲的問題,那麼有不清楚的地方,就應該進行詢問。如果是筆試或者工程中需要計算fifo深度的話,那麼就需要自己考慮清楚。

其次,非同步fifo,讀寫時鐘不同頻,那麼fifo主要用於資料快取,我們選擇的fifo深度應該能夠保證在最極端的情況下,仍然不會溢位。因此考慮的前提一般都是寫時鐘頻率大於讀時鐘頻率,但是若寫操作是連續的資料流,那麼再大的fifo都無法保證資料不溢位。因此可以認為這種情況下寫資料的傳輸是「突發burst」的,即寫操作並不連續,設計者需要根據滿標誌控制或者自己來控制寫操作的起止。

巨集觀地,從整個時間域上看,"寫資料=讀資料",這個條件必須要滿足,如果這個大條件不滿足的話,用fifo是沒有效果的。但是在傳送方"突發"傳送資料的時間t內,是很有可能寫資料》讀資料的,因此fifo的深度要能夠保證,在這段時間t內,如果接收方未能將傳送方傳送的資料接收完畢的話,剩下的資料都是可以儲存在fifo內部而且不會溢位的,那麼在傳送方停止傳送資料的"空閒時隙"內,接收方可以從容地接收剩下來的資料。

紅字部分就是個人認為在fifo深度計算中,最重要的部分了。接著來看乙個例子,這是我看乙個網友寫時,是他當時遇到的一道筆試題。

乙個8bit寬的afifo,輸入時鐘為100mhz,輸出時鐘為95mhz,設乙個package為4kbit,且兩個package之間的傳送間距足夠大。問afifo的深度。

因為這位網友可能只是簡述,因此資訊並不完整,我的個人理解是這樣的場景,乙個非同步fifo,讀寫頻率不同,讀寫位寬相同。傳送發一次burst突發的資料量為4kbit,即500word,在兩次burst突發之間有足夠的時間,因此我們只用考慮在傳送方burst傳送資料的時間t內,如果接受方沒法將資料全部接受,其餘資料均可存在fifo內且不溢位,那麼在傳送方停止burst傳送資料的時間段內,接收方就可以從容的從fifo內讀取資料。首先傳送方burst傳送資料的時間段為 t = 500/100mhz,傳送的資料量為 b_send = 500word,而在t這段時間內,接收方能夠接受的資料量為b_rec =  t*95mhz = 500 * 95 / 100 word = 475word,因此 b_remain = b_send - b_rec = 500 - 475 = 25 。那麼fifo的深度至少要大於等於25才行。

再看另外乙個例子,還是從網上找到的,

寫時鐘頻率w_clk,

讀時鐘頻率r_clk,

寫時鐘週期裡,每b個時鐘週期會有a個資料寫入fifo

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

則,fifo的最小深度是?

首先,我們可以認為寫操作是burst突發的。

其次,寫操作的效率並不是100%的,而是a/b的,因此我們可以認為實際的f_wr = (a/b)*w_clk,同理,實際中f_rd = (x/y)*r_clk。

另外,和第乙個例子不同的是,這個題目裡面並沒有約束burst突發的場景,在正常情況下,應該是這樣的

空閒---burst突發---空閒---burst突發---空閒---burst突發。但是我們在計算中,需要考慮最極端的情況,即

空閒---burst突發---burst突發---空閒---burst突發---空閒。即傳輸過程中,可能會出現"背靠背"的情況,那麼我們設計的fifo深度必須能夠保正,在"背靠背"的時間段內,如果接收方沒法接受所有資料,那麼剩餘的資料可以被儲存在fifo內部且不會溢位。那麼就可以開始計算了。假設"背靠背"時傳送的資料 = bl,那麼"背靠背"的時間 =  bl / w_clk ,注意,這段時間內 f_wr = w_clk  而不是之前提到的

(a/b)*w_clk。在這段時間內,接收方可以接受的資料 = (bl / w_clk)  * (x/y)*r_clk ,

剩下的資料量 = bl -  ( bl / w_clk ) * (x/y)*r_clk,那麼fifo的深度至少就要為

" depth =  bl -  ( bl / w_clk ) * (x/y)*r_clk "這樣的深度了。

將上述公式變換下,得到 depth = bl - bl  * (x/y) * (r_clk/w_clk) 。這個公式就是網上流傳的計算fifo深度的公式,我想應該就是這個推理過程吧。

上述的討論的乙個前提就是fifo的讀寫位寬一致,如果這個條件不滿足的話,那麼fifo的深度的計算就更加複雜一些,但是我們還是可以把fifo的讀寫位寬也折合成一定的因子,帶入 實際的f_wr = (a/b)*w_clk 和 f_rd = (x/y)*r_clk 中去,應該是是可以解決的。

根據這個公式再看第乙個例子,得到fifo最小深度:bl-bl* 512/512 * 95/100 = 25,其中bl = 512 , 所以以上公式成立。

FIFO深度計算問題

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 對於同步fi...

FIFO最小深度計算

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

關於FIFO的深度計算

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