异步FIFO最小深度计算方法及原理分析
http://blog.csdn.net/u011412586/article/details/10241585
计算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/