FIFO深度設定的探究
FIFO深度的問題一直困擾著我,下面來具體解決這個問題,因為FIFO有同步和非同步FIFO之分,但是在分析這個問題時,我們要將其列為數學模型,簡化整個思考的過程。
問題1:對於同步對於同步fifo,每100個cycle可以寫入80個數據,每10個cycle可以讀出8個數據,fifo的深度至少為?
思路:
剛拿到這個題目,我是蒙的,以前用FIFO都是為了跨時鐘域,而且用的AXI_STREAM都是有叫停機制的,因此FIFO深度沒有仔細考證過,之前有個需要深度計算的FIFO,還是金師兄高速我用2倍的資料包長。經過一些查詢資料後:
解題思路:
假設:寫時鐘頻率 w_clk, 讀時鐘頻率 r_clk, 寫時鐘週期裡,每B個時鐘週期會有A個數據寫入FIFO 讀時鐘週期裡,每Y個時鐘週期會有X個數據讀出FIFO 則,FIFO的最小深度計算公式如下:
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
因此本題的解答:
最大一次資料寫入量,背靠背傳輸(20個clk不發資料+80個clk發資料+80個clk發資料+20個clk不發資料),因是同步時鐘wclk=rclk,帶入公式計算:
FIFO_DEPTH = 160 - 160 *
(8/10) = 32
因此本題的答案為32個。
拓展
:
假設本題wclk=200mhz,改為100個wclk裡寫入40個,rclk=100mhz,10個rclk裡讀出8個。那麼fifo深度為48 計算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48。
這讓我聯想到另外一個之前的專案問題:
示意圖:圖中的200M僅僅是例子。
假設前級的資料無法叫停,問FIFO的最小深度為多少?
分析:此問題就是找 FIFO進來最大資料量,而FIFO出資料最小的時候。
解答:FIFO進來資料是很多的,但是FIFO出資料考慮背靠背最少的出資料的情況在後級800M時鐘內,出資料最少的狀態(200M出資料+200不出資料+200不出資料+200M出資料)。
因此最大的情況是後級400M不出資料,對應前級的時間是200M
FIFODEPTH = 200M - 400M * 0 = 200M 。