FIFO深度计算问题

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/(20
4) = 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/(20
4) = 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/(20
4) =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

  • 3
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
异步FIFO深度计算通常考虑写数据速率比读数据速率快的情况,以防止数据溢出和丢失。一种计算深度的方法是根据最大的写数据速率和读数据速率来确定。假设最大的写数据速率是Wr,读数据速率是Rd,传输数据的时钟周期为T,那么FIFO深度可以通过以下公式计算得出:深度 = ceil(Wr * T / Rd)。这个公式保证了FIFO能够容纳写入速率最大的数据,同时避免了数据丢失。另外,由于异步FIFO的设计中通常使用格雷码,所以深度需要是2的幂次方。如果计算得到的深度不是2的幂次方,需要选择大于等于该深度的最小的2的幂次方作为FIFO深度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [异步FIFO深度 计算模型以及详细推导.docx](https://download.csdn.net/download/changhaizhang/11441790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [异步FIFO最小深度计算](https://blog.csdn.net/qq_40268672/article/details/123275374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值