计算FIFO的深度是FIFO设计中经常出现的问题。 众所周知,如果读取速度慢于写入速度,则FIFO可以用作系统中的缓冲区或队列。 因此,FIFO的大小基本上意味着所需的缓存数据量,该容量取决于数据的读写速度。 统计表明,系统的数据速率取决于系统的承载能力。 因此,为了保证FIFO的大小,必须考虑FIFO传输的最坏情况。 最坏的情况是使写入速度最大,使读取速度最小。 通常考虑突发传输。
一、异步FIFO最小深度计算原理
在数据流连续的情况下,不管FIFO的深度是多少,只要读/写时钟不同的源频率相同,就失去数量;
FIFO用于缓冲块数据流,通常在写入速度慢时,遵循以下规则:
{FIFO深度/{写入速率-读取速率}={FIFO满的时间} {数据包传输时间}={写入数据量/写入速率}
即,在向FIFO写入数据时存在溢出,在从FIFO读出数据时不存在还原流.
例如: A/D采样率50MHz,dsp读取A/D的速度40MHz,要向dsp发送10万个采样数据而不丢失,A/D必须与dsp之间添加至少多少容量(深度)的FIFO
100,000/50m Hz=1/500 s=2毫秒
(50MHz - 40MHz ) * 1/500=20k为FIFO深度。
错误的算法(我也犯了同样的错误) :
100,000/40 MHz=1/400 s=2.50 ms
(50M - 400M ) *1/400=25K .因此输入的数据为0.0025-0.002 )=125,000位,而不是100K ),这会导致时间计算错误。
二、异步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 ) X(100/200 )=80-32=48
注意: FIFO _ depth=burst _ length -变形burst _ length * (x/y ) (* (r_clk/w_clk ) ),使FIFO _ depth=burst 很明显,burst_length表示在这个时间写入的数据量,两者之差是fifo中剩下的数据,这也就是理论上fifo的最小深度。 在实际应用中,由于经常用空中半满信号指示fifo的空闲状态,因此在实际设计fifo时至少剩下一个数据空间的深度裕度。
三.读写FIFO不同时进行时,异步FIFO最小深度计算
如果读写FIFO不同时进行,则必须将FIFO的深度设置为写入数据的最大突发数。
四.异步FIFO最小深度算例(1) )。
设定fifo深度时,需要参考具体的应用情况。
1、SDRAM APP应用
例如,在SDRAM APP应用程序中,设置一个对应的fifo,一般设置深度是操作数据的两倍就足够了。 例如,SDRAM的所有页面的读写为256,对应的设定深度为512。 这是因为SDRAM的读写速度一定比FIFO的写入速度和之后的FIFO的读取速度快。 因此,只要SDRAM前后的动作速度一致即可。 没有任何问题。
2、双异步时钟数据接口
例如,对于两个异步时钟域数据接口,在同时读取和写入的情况下,写入时钟通常在设置FIFO时大于读出时钟。 此时,要设定FIFO的深度,需要对应两个时钟和写入最大的突发数据。 假设写入时钟频率为40MHz,读取时钟为25Mhz,写入侧的最大突发写入数据数为100数据。 对应深度计算: 100(1-25/40 )=37.5,对应深度设置至少为38。 〔用第2点所述的公式计算〕
如果读写不同时进行,则必须将写入数据的最大突发数设置为深度。 在上例中,如果深度为100个,对应于最大突发数,则深度设置为100。
五、异步FIFO最小深度算例(2) )。
1,8bit宽的AFIFO,输入时钟为100MHz,输出时钟为95MHz,一个包为4Kbit,两个包之间的发送间距足够大。 A求出国际先进先出的深度吗?
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。