FIFO深度计算公式:
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
burst_length :突发数据个数
X,Y:读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
r_clk:读时钟
w_clk:写时钟
1,同步FIFO
对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为?
答:
每100个cycle可以写入80个数据,我们考虑最坏的情况,背靠背模式,空20个时钟,剩下80个时钟写80个数据,再用80个时钟写80个数据,空20个时钟,这样的结果就是连着写了160个数据,共用了200个时钟,突发数据个数是160
所以
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
同步FIFO,读写时钟相同,r_clk=w_clk;
fifo_depth = 160 - 160 *(8/10) * 1 = 160-128=32
2,异步FIFO
wclk=200mhz,100个wclk里写入40个数据,rclk=100mhz,10个rclk里读出8个数据。那么fifo深度为?
答:我们考虑最坏的情况,背靠背模式,即空60个wclk,剩下40个wclk写入有40个数据,接着40个wclk写40个数据,空60个wclk,那么突发数据个数为40+40=80
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 80 - 80 *(8/10) * 100/200 = 80-32=48
FIFO的深度一般是2的整数次幂,要符合格雷码的编码转换规则,因此我们深度一般不选择48,而是选择比它大的2的整数次幂的数,比如64或者128
答:可以看出,B的时钟要大于A的时钟,如果B为读时钟,那么A为写时钟,那就是读时钟大于写时钟,读的比写的快,那么不会溢出了,所以B应该是写时钟,A为读时钟
假设读clkA=100MHZ,写clkB=400MHZ, 则周期Ta=10ns ,Tb=2.5ns ,则 enB=10100=1000ns,enB的占空比为25%,即周期的25%为高电平,即为写数据的时钟时长,T_enB=100025%=250ns,T_enB/Tb=250/2.5 = 100个数据,同时在这250ns时间里面,读书数据的个数为250/Ta=250/10=25,
所以FIFO深度为100-25=75
下面举几个例子:
第一种情况:
写时钟快于读时钟,写和读的过程中没有空闲周期,也即在突发(burst)过程中,读和写都在各自的时钟域内连续进行。
答:
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1 * 50/80 = 120 - 75 = 45
第二种方法:分析
写时钟周期Tw = 1000/80 = 12.5ns
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要的写时间为120*12.5 = 1500ns
在1500ns的时间,读了数据个数为1500/20 = 75
所以120-75 = 45
第二种情况
写时钟频率大于读时钟频率,但在读写的过程中存在空闲周期。
答:
两个写数据之间空一个时钟,即2个时钟写1个数据
两个读数据之间空3个时钟,即4个时钟读1个数据
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/4 * 50/80 = 120 - 18.75 =
第二种方法:分析
写时钟周期Tw = 1000/80 = 12.5ns
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要240个时钟,需要的写时间为24012.5 = 3000ns
在3000ns的时间,读了数据个数为3000/(204) = 37.5
最后0.5是不完整数据,取整为37,
所以120-37 = 83
第三种情况
写时钟慢于读时钟,且读写过程中没有空闲周期;
答: 读写没有空闲,而且写时钟慢于读时钟,所以应该是永远不会写满,即不会溢出,fifo的深度为1即可
第四种情况
写时钟频率小于读时钟频率,但读写过程中存在空闲周期;
答:
两个写数据之间空一个时钟,即2个时钟写1个数据
两个读数据之间空3个时钟,即4个时钟读1个数据
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/4 * 50/30 = 120 - 50 = 70
第二种方法:分析
写时钟周期Tw = 1000/30
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要240个时钟,需要的写时间为2401000/30= 8000ns
在8000ns的时间,读了数据个数为8000/(204) = 100
所以120-100 = 20
第五种情况
读写时钟速率相同,且无空闲时钟。
答:
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/* 1 = 0
如果读写时钟之间没有相位差,则不需要FIFO就可以进行读写呀;
如果二者存在相位差,只需要FIFO的深度为1即可。
第六种情况
读写时钟频率一致,但在读写过程中存在空闲周期。
答:
两个写数据之间空一个时钟,即2个时钟写1个数据
两个读数据之间空3个时钟,即4个时钟读1个数据
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/4 * 50/50 = 120 - 30 = 90
第二种方法:分析
写时钟周期Tw = 1000/50=20ns
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要240个时钟,需要的写时间为24020= 4800ns
在4800ns的时间,读了数据个数为4800/(204) =60
所以120-60 = 60
第七种情况
特定条件下,最坏情况分析FIFO最小深度;
答:
100个时钟周期写80个数据,考虑最坏的情况,即背靠背的方式,空闲20个时钟,剩余80个时钟写80个数据,接着80个时钟写80个数据,空20个时钟,最后的结果就是用160个时钟要写160个数据,即突发长度是160,
每10个时钟读8个数据,160个时钟读了128个数据,
FIFO的深度=160-128 = 32
参考文献1
https://blog.csdn.net/Reborn_Lee/article/details/100127937
参考文献2
https://hardwaregeeksblog.files.wordpress.com/2016/12/fifodepthcalculationmadeeasy2.pdf