从蓄水池问题思考异步FIFO深度设计

本文通过蓄水池问题解释了当数据写入速率大于读取速率时,FIFO(先进先出)缓冲区可能溢出的概念。作者指出,在FIFO深度有限的情况下,如果写入速率持续超过读取速率,即使缓冲区很大,也会导致数据丢失。通过数学推导,给出了计算FIFO最小深度的公式,并通过实例展示了如何根据数据传输速率来确定合适的FIFO容量,以确保数据完整传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前段时间面试,因为没考虑过FIFO深度的问题,被面试官吊打一番,痛定思痛,写下这些。

蓄水池问题

一个蓄水池,体积为V,有进水口和出水口。进水口每秒流进m立方米的水,出水口每秒流出n立方米的水。初始时,蓄水池中没有水。

情形一:进水口,出水口一直工作

如果m=n,蓄水池可有可无,流进蓄水池的水会很快流出,蓄水池不会溢出;
如果m>n,经过一段时间t后,蓄水池溢出。
t = V / ( m − n ) t = V / (m-n) t=V/(mn)
可以推论,在这种情况下, 无论蓄水池有多大,总会溢出。
如果m<n,蓄水池永不会溢出。

情形二:出水口一直工作

该情形下,只关心m>n情况。
为了保证蓄水池不溢出,进水口在连续工作t时间后必须关闭,直到蓄水池中有剩余空间v0。进水口可再次连续工作的时间为 t 0 = v 0 / ( m − n ) t_0 = v_0/(m-n) t0=v0/(mn)
为了不频繁打开关闭进水口,可等到v0=V时再让进水口工作。
此种情形下,蓄水池的行为是,进水口一直工作到蓄水池满,关闭后等到蓄水池为空,再次工作直到蓄水池满。

FIFO深度问题

将FIFO类比成蓄水池。写时钟域吞吐量为m,读时钟域吞吐量为n。吞吐量表示为每秒钟数据量大小。
例如,写时钟为50MHz,每个时钟周期产生一个字节,则吞吐量为50M byte/s
若每两个时钟周期产生一个字节,则吞吐量为25M byte/s
m>n的情形下,若写时钟域一直工作,则无论FIFO为多深,总会溢出。因此,写时钟域只能工作一段时间,直到FIFO满。
在实际情况下,我们通常是先知道写时钟域能工作的时间,再反推出FIFO的最大深度。参考蓄水池问题,易得 f i f o d e p t h = t w r ∗ ( m − n ) fifo_{depth} = t_{wr} * (m-n) fifodepth=twr(mn)

举例

A/D采样速率50Mhz,dsp读A/D的速率40Mhz,要不丢失地将将10万个采样数据送入DSP ,在A/D和DSP之间至少加多大容量的(深度)FIFO才行??
答:A/D需工作的时间 t = 100 , 000 / 50 , 000 , 000 t=100,000/50,000,000 t=100,000/50,000,000
FIFO深度 = 1/500 *(50,000,000-40,000,000)= 20,000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值