关于FIFO的深度计算

  • 1、FIFO深度计算

例如(对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为? )
参考网址:https://blog.csdn.net/times_poem/article/details/51917648

  1. 首先

要确实FIFO的应用场景
并且最终要保证在最极端的情况下,仍不是发生溢出以及空数据的情况。如果数据是连续的数据流,那在频率不同的异步FIFO中,当写入频率大于读出频率时,FIFO必定是溢出的。因此这个时候需要确定数据的传输的突发性的,也就是一段一段的传输而不是连续的。

网上的:宏观地,从整个时间域上看,“写数据=读数据”,这个条件必须要满足,如果这个大条件不满足的话,用FIFO是没有效果的。但是在发送方"突发"发送数据的时间T内,是很有可能写数据>读数据的,因此FIFO的深度要能够保证,在这段时间T内,如果接收方未能将发送方发送的数据接收完毕的话,剩下的数据都是可以存储在FIFO内部而且不会溢出的,那么在发送方停止发送数据的"空闲时隙"内,接收方可以从容地接收剩下来的数据
总结上述的话:就是说在突发传输期间内,输入的数据减去输出的数据的剩下的数据还不会使FIFO溢出,那就FIFO的深度够用。同理不会空的情况也就是如此。

  1. 然后

例题:一个8bit宽的AFIFO,输入时钟为100MHz,输出时钟为95MHz,设一个package为4Kbit,且两个package之间的发送间距足够大。问AFIFO的深度。
这里理解是:一个突发周期内为4Kbit,根据上面的位宽,也就是500个数据。
计算突发发送数据的时间为T=500/100MHz(这里每一个数据的发送时间是频率的倒数)。数据发送量为500.然后计算在T时间内,从FIFO中传输出去的数据。即为TX95MHZ=500x95/100=475个数据。那也就是说FIFO的深度至少大于500-475=25也就是说,FIFO的深度至少为25以上,又因为FIFO的深度设置为2N,也就是2的倍数。因此FIFO的深度至少设置为32 depth

  1. 然后

解答上述的题目:
可以认为写操作是突发写的。然后要考虑突发的情况,一般情况下,数据传输是:空闲—Burst突发—空闲—Burst突发—空闲—Burst突发。但是我们在计算中,需要考虑最极端的情况,即空闲—Burst突发—Burst突发—空闲—Burst突发—空闲。
以最极端的情况空闲—Burst突发—Burst突发—空闲来计算。
此时考虑背靠背(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk)

  1. 也就是说

首先
是一个突发写的数据个数为80/100 x W_CLK(这个是实际写频率)
同理由于是同步FIFO一个突发读数据为8/10 x W_CLK (这个为实际的读频率,这是原读频率等于原写频率,才能这么计算。)
为什么这里是实际的频率?
8/10是指一个周期内会有0.8个数据传输,再乘以频率等于也就是说在10个周期内不是实际的每个周期内都读取数据,而是有两个周期未读取数据,这样导致实际的周期增加,也就是实际的频率降低。计算出实际的等效频率为8/10 x W_CLK
在背靠背时发送的数据位160,这段时间为160/ W_CLK(这是的频率是原有的频率而不是上面计算后的频率。).
那么这段时间内读出的数据为160/ W_CLK x 8/10 x W_CLK
也就是得到最终的FIFO深度为
160-160/ W_CLK x 8/10 x W_CLK=160-128=32
此时设置最少FIFO深度为32即不会发生溢出的情况,但是会有满的情况。这是按最极端的情况来计算的。

然后
如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48

计算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48

  1. 总结:

写时钟频率 w_clk,
读时钟频率 r_clk,
写时钟周期里,每B个时钟周期会有A个数据写入FIFO
读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
则,FIFO的最小深度是?

计算公式如下:

fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
其中burst_length为实际的突发写长度,其最大为上述两个A。如果按正常的突发写一个A长度也是按上述的公式计算。

发布了7 篇原创文章 · 获赞 2 · 访问量 561

猜你喜欢

转载自blog.csdn.net/weixin_44167319/article/details/94992471