FIFO深度计算公式: fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
burst_length :突发数据个数 X,Y:读时钟周期里,每Y个时钟周期会有X个数据读出FIFO r_clk:读时钟 w_clk:写时钟
对于同步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
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