- 1、FIFO深度計算
例如(對于同步fifo,每100個cycle可以寫入80個資料,每10個cycle可以讀出8個資料,fifo的深度至少為? )
參考網址:https://blog.csdn.net/times_poem/article/details/51917648
- 首先
要确實FIFO的應用場景
并且最終要保證在最極端的情況下,仍不是發生溢出以及空資料的情況。如果資料是連續的資料流,那在頻率不同的異步FIFO中,當寫入頻率大于讀出頻率時,FIFO必定是溢出的。是以這個時候需要确定資料的傳輸的突發性的,也就是一段一段的傳輸而不是連續的。
網上的:宏觀地,從整個時間域上看,“寫資料=讀資料”,這個條件必須要滿足,如果這個大條件不滿足的話,用FIFO是沒有效果的。但是在發送方"突發"發送資料的時間T内,是很有可能寫資料>讀資料的,是以FIFO的深度要能夠保證,在這段時間T内,如果接收方未能将發送方發送的資料接收完畢的話,剩下的資料都是可以存儲在FIFO内部而且不會溢出的,那麼在發送方停止發送資料的"空閑時隙"内,接收方可以從容地接收剩下來的資料
(總結上述的話:就是說在突發傳輸期間内,輸入的資料減去輸出的資料的剩下的資料還不會使FIFO溢出,那就FIFO的深度夠用。同理不會空的情況也就是如此。)
- 然後
例題:一個8bit寬的AFIFO,輸入時鐘為100MHz,輸出時鐘為95MHz,設一個package為4Kbit,且兩個package之間的發送間距足夠大。問AFIFO的深度。
這裡了解是:一個突發周期内為4Kbit,根據上面的位寬,也就是500個資料。
計算突發發送資料的時間為T=500/100MHz(這裡每一個資料的發送時間是頻率的倒數)。資料發送量為500.然後計算在T時間内,從FIFO中傳輸出去的資料。即為TX95MHZ=500x95/100=475個資料。那也就是說FIFO的深度至少大于500-475=25也就是說,FIFO的深度至少為25以上,又因為FIFO的深度設定為2N,也就是2的倍數。是以FIFO的深度至少設定為32 depth
- 然後
解答上述的題目:
可以認為寫操作是突發寫的。然後要考慮突發的情況,一般情況下,資料傳輸是:空閑—Burst突發—空閑—Burst突發—空閑—Burst突發。但是我們在計算中,需要考慮最極端的情況,即空閑—Burst突發—Burst突發—空閑—Burst突發—空閑。
以最極端的情況空閑—Burst突發—Burst突發—空閑來計算。
此時考慮背靠背(20個clk不發資料+80clk發資料+80clk發資料+20個clk不發資料的200個clk)
- 也就是說
首先
是一個突發寫的資料個數為80/100 x W_CLK(這個是實際寫頻率)
同理由于是同步FIFO一個突發讀資料為8/10 x W_CLK (這個為實際的讀頻率,這是原讀頻率等于原寫頻率,才能這麼計算。)
為什麼這裡是實際的頻率?
8/10是指一個周期内會有0.8個資料傳輸,再乘以頻率等于也就是說在10個周期内不是實際的每個周期内都讀取資料,而是有兩個周期未讀取資料,這樣導緻實際的周期增加,也就是實際的頻率降低。計算出實際的等效頻率為8/10 x W_CLK
在背靠背時發送的資料位160,這段時間為160/ W_CLK(這是的頻率是原有的頻率而不是上面計算後的頻率。).
那麼這段時間内讀出的資料為160/ W_CLK x 8/10 x W_CLK
也就是得到最終的FIFO深度為
160-160/ W_CLK x 8/10 x W_CLK=160-128=32
此時設定最少FIFO深度為32即不會發生溢出的情況,但是會有滿的情況。這是按最極端的情況來計算的。
然後
如果令wclk=200mhz,改為100個wclk裡寫入40個,rclk=100mhz,10個rclk裡讀出8個。那麼fifo深度為48
計算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48
- 總結:
寫時鐘頻率 w_clk,
讀時鐘頻率 r_clk,
寫時鐘周期裡,每B個時鐘周期會有A個資料寫入FIFO
讀時鐘周期裡,每Y個時鐘周期會有X個資料讀出FIFO
則,FIFO的最小深度是?
計算公式如下:
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
其中burst_length為實際的突發寫長度,其最大為上述兩個A。如果按正常的突發寫一個A長度也是按上述的公式計算。