FIFO最小深度计算

简介

我们通常需要异步FIFO用作两个不同时钟域的模块之间的数据缓冲,确保不会丢失数据。通常因为读速率慢于写速率,慢的模块来不及读取的数据要被缓存下来,所以说,FIFO的工作模式应该是,数据突发(Burst)写入的形式。也就是隔一段时间突发的写一组数据。如果连续写入的话,因为读速率慢于写速率,FIFO肯定会写满,FIFO的深度就需要无穷大,才能确保数据不丢失。(这里注意区分读速率≠读时钟频率,写速率≠写时钟频率)
下面会通过讨论一种case下a模块传输数据到b模块所需FIFO深度的计算,进而延伸至通用计算公式

case1:Fa>Fb,读写都有空闲周期

写速率Fa = 80MHz
读速率Fb = 50MHz
突发长度Burst Length = 120
两个连续写入之间的空闲周期为 = 1
两个连续读取之间的空闲周期为 = 3

Solution:
两个连续写入之间的空闲周期为1的意思是,每写入一个数据,要等待一个周期,再写入下一个数据。这也可以理解为每2个周期,写入1个数据

两个连续读取之间的空闲周期为3的意思是,每读取一个数据,要等待三个周期,再读取下一个数据。这也可以理解为每4个周期,读取1个数据

写一个数据需要的时间 = 2 * (1 / 80MHz) = 25ns
写一个突发需要的时间 = 120 * 25ns = 3000ns
读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns

每3000ns,120个数据被写入FIFO,但读一个数据需要80ns的时间。可以计算出,3000ns内读出可以多少个数据,3000 / 80 = 37.5。剩下的没有读出,就存在FIFO中,则需要120 - 37.5 = 82.5 约等于 83。所以这种情况下,需要的FIFO最小深度为83

通用计算公式

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

首先认为写操作是Burst(突发)进行的,但是写操作的效率并不是100%,而是A/B,因此实际的写速率为Fwr = (A/B)*w_clk。同理,实际的读速率为Frd = (X/Y) * r_clk。

通常没有约束突发长度场景,正常情况下应该是这样的:

空闲——Burst——空闲——Burst——空闲——Burst

但是在计算时要考虑极端的情况,即“背靠背”的情况。

空闲——Burst——Burst——空闲——Burst——Burst——空闲

这就是”背靠背“的极端情况【burst_length = (A+A) / w_clk】。

按照case1的逻辑
写一个数据需要的时间 Twr= 1 / Fwr
写一个突发需要的时间 Tbt= burst_length * (1 / Fwr)
读一个数据需要的时间 Trd= 1 / Frd

每个Tbt时间内,burst_length个数据被写入FIFO,但读一个数据需要Trd的时间。可以计算出,Tbt内读出可以多少个数据,Tbt / Trd。剩下的没有读出,就存在FIFO中,则需要burst_length - Tbt / Trd,展开得出下面的公式:
fifo_depth = burst_length*(1-Frd/Fwr)=burst_length*[1-(X/Y) * r_clk/(A/B)w_clk]
考虑背靠背情况下:
fifo_depth = burst_length
[1-(X/Y) * r_clk/w_clk]
再做一下变化
fifo_depth = burst_length*(1-Frd/Fwr)= burst_length/Fwr*(Fwr-Frd),即
FIFO深度 = (写入数据量 / 写入速率)*(写入速率 - 读出速率)

第一次网上记录学习笔记,难免可能有误,欢迎指出,相互学习,谢谢!

参考文献

链接: 你问我FIFO有多深?–知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeep.guo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值