異步FIFO最小深度計算


計算FIFO深度是設計FIFO中常遇到的問題。常識告訴我們,當讀速率慢於寫速率時,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] http://blog.sina.com.cn/s/blog_6a89f7010100mnua.html

[2] http://www.cnblogs.com/zhangzhi/archive/2009/11/04/1595808.html

[3]  http://www.cnblogs.com/yuphone/archive/2011/06/21/2085840.html

[4]  http://www.asic-world.com/tidbits/fifo_depth.html

[5]  http://m282094986.blog.163.com/blog/static/38324693201301051444715/

[6]  http://bbs.eetop.cn/thread-383962-1-1.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM