非同步FIFO最小深度計算方法及原理分析

2022-08-19 19:24:11 字數 2930 閱讀 1339

計算fifo深度是設計fifo中常遇到的問題。常識告訴我們,當讀速率慢於寫速率時,fifo便可被用作系統中的緩衝元件或佇列。因此fifo的大小基本上暗示了所需快取資料的容量,該容量取決於讀寫資料的速率。據統計,系統的資料速率取決於系統的負載能力。因此為了保證fifo的大小,我們需要考慮fifo傳輸的最壞情況下。所謂最壞的情況就是使得寫速率最大,讀速率最小;通常是考慮突發傳輸。

一、非同步fifo最小深度計算原理

如果資料流連續不斷則fifo深度無論多少,只要讀寫時鐘不同源同頻則都會丟數;

fifo用於緩衝塊資料流,一般用在寫快讀慢時,遵循的規則如下:

=  >  =

即:確保對fifo寫資料時不存在overflow,從fifo讀出資料時不存在underflow.

例:a/d取樣率50mhz,dsp讀a/d讀的速率40mhz,要不丟失地將10萬個取樣資料送入dsp,在a/d在和dsp之間至少加多大容量(深度)的fifo才行?

100,000 / 50mhz = 1/500 s = 2ms

(50mhz - 40mhz) * 1/500 = 20k既是fifo深度。

一種錯誤的演算法(我也犯了同樣的錯誤):

100,000 / 40mhz= 1/400s = 2.50ms

(50m - 400m)*1/400 =25k.那麼這樣進去的資料就不是100k了,而是100k+50m*(0.0025-0.002)=125,000bit,錯誤在時間的計算。

二、非同步fifo最小深度常用計算公式(假如讀寫fifo是同時進行的)

寫時鐘頻率w_clk,

讀時鐘頻率 r_clk,

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

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

則,fifo的最小深度是?

計算公式如下:

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

此公式可有原理推導而來。

例舉說明:

如果100個寫時鐘週期可以寫入80個資料,10個讀時鐘可以讀出8個資料。令wclk=rclk ,考慮背靠背(20個clk不發資料+80clk發資料+80clk發資料+20個clk不發資料的200個clk)代入公式可計算fifo的深度

fifo_depth = 160-160x(80%)=160-128=32

如果令wclk=200mhz,改為100個wclk裡寫入40個,rclk=100mhz,10個rclk裡讀出8個。那麼fifo深度為48

計算如下fifo_depth =80-80x(80%)x(100/200)=80-32=48

注:將 fifo_depth = burst_length - burst_length * (x/y) * (r_clk/w_clk) 作個變形,得到 fifo_depth = burst_length -[(burst_length *(1/w_clk))]/[(y*(1/r_clk))/x] 其中[(burst_length *(1/w_clk))] 表示這個burst的持續時間,[(y*(1/r_clk))/x] 表示讀出每個資料所需的時間(即:讀的實際速度)。兩者相除自然就是這段時間讀出的資料量。顯然burst_length表示這 段時間寫入的資料量,兩者的差為fifo中殘留的資料,這個也就是理論上的fifo的最小深度。實際應用中往往是以半空半滿訊號來指示fifo的空滿狀態的,所以實際設計fifo的時候會至少留下乙個資料空間的深度裕量。

三、讀寫fifo不是同時進行的情況下,非同步fifo最小深度計算

假如讀寫fifo不是同時進行的,這就需要設定fifo深度為寫資料最大突發個數。

四、非同步fifo最小深度計算例項(1)

對於設定乙個fifo深度,這個需要參考具體應用情況。

1、sdram應用

如:在sdram應用中,對應設定乙個fifo,一般設定深度為運算元據的兩倍就夠了,如sdram全頁讀寫為256,對應設定深度為512。因為sdram讀寫速度肯定是快於fifo寫的速度,和後面那個fifo讀的速度。因此,只要sdram前後操作總體速率一致。就沒什麼問題。

2、兩非同步時鐘資料介面

如:兩個非同步時鐘域資料介面,假如讀寫是同時進行的,一般這時設定fifo情況就是寫時鐘大於讀時鐘。這個時候設定fifo的深度就要對應兩個時鐘以及對應寫最大的突發資料。假設寫時鐘頻率是40mhz,讀時鐘為25mhz,在寫端最大突發寫資料個數為100個資料。對應設定深度計算:100(1-25/40)=37.5,對應深度設定至少為38。(用第二點所述公式計算)

假如讀寫不是同時的,這就需要設定深度為寫資料最大突發個數,如上例中,對應最大突發個數為100個,則深度設定為100。

五、非同步fifo最小深度計算例項(2)

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

公式:fifo_depth = burst_length - burst_length * (x/y) * (r_clk/w_clk)

burst_length = 4kbit/8bit ,有兩種結果,其一,根據儲存廠商的慣用演算法,4kbit=4000bit,burst_length=500;其二,用一般二進位制演算法,4kbit=4*1024=4096bit,burst_length=512。

因為x和y的值沒有給出,所以預設為1.

可得:其一,fifo_depth = 500 - 500*(95/100)= 25 ,所以fifo_depth最小取值是25 。

其二,fifo_depth = 512 - 512*(95/100)= 25.6 ,所以fifo_depth最小取值是26 。

參考:[1] 

[2] 

[3]  

[4]  

[5]  

[6]  

FIFO最小深度計算方法

在實際工作中使用fifo,如何計算fifo的深度是乙個關鍵問題。本文以例項的形似,展示了在資料轉換時,fifo深度的計算方法。例1,已知某a d轉換的取樣率為50mhz,而fpga工作在40mhz時鐘下,現在要處理10萬個資料,需要的緩衝fifo深度是多少?答 1 採集10萬個資料的總時間為 tto...

非同步FIFO最小深度計算方法及原理分析

計算fifo深度是設計fifo中常遇到的問題。常識告訴我們,當讀速率慢於寫速率時,fifo便可被用作系統中的緩衝元件或佇列。因此fifo的大小基本上暗示了所需快取資料的容量,該容量取決於讀寫資料的速率。據統計,系統的資料速率取決於系統的負載能力。因此為了保證fifo的大小,我們需要考慮fifo傳輸的...

非同步 FIFO 最小深度計算方法及原理分析(轉補)

非同步 fifo 最小深度計算方法及原理分析 補 計算 fifo 深度是設計 fifo 中常遇到的問題。常識告訴我們,當讀速率慢於寫速率時 瞬時速率 fifo 便可被用作系統中的緩衝元件或佇列。fifo 的大小取決於讀寫資料的速率,系統的資料速率取決於系統的負載能力,因此為了保證系統效能,我們需要考...