FPGA中对FIFO深度的计算

本文深入探讨了FIFO缓冲区在不同数据流速率下的深度计算原理,包括如何通过写入和读出时钟周期计算最小深度,并通过实例展示了在连续数据流场景下的正确计算方法。此外,文章还提供了FIFO在实际应用中的关键计算公式,并通过具体案例说明了如何根据数据传输速率来确定FIFO的最小深度,确保数据传输过程中的高效性和无数据丢失。

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

写时钟周期w_clk, 
读时钟周期r_clk, 
写时钟周期里,每B个时钟周期会有A个数据写入FIFO 
读时钟周期里,每Y个时钟周期会有X个数据读出FIFO 
则,FIFO的最小深度是? 
首先,这道题不一定有解 
有解的必要条件是在一定时间内(足够长),写入的数据数量一定要等于读出的数据数量 
因此有:A/B * w_clk = X/Y * r_clk 
其次,算出写数据的最大burst_length。考虑最坏情况 
比如,如果条件给出,每100个写时钟,写入80个数据,那么在背靠背的情况下,burst_length = 2*80=160 
最后,fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk 
BTW:通常,为了安全起见,都会多留一些depth的余度
个人觉得,公式应该是这样: 
A/(B * w_clk) = X/(Y * r_clk) 
fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk 
举例说明: 
如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据 
其中w_ck=5ns,r_ck=10ns 
如果按照之前的公式,得出的深度为:fifo_depth = burst_length - burst_length * X/Y * r_ck/w_clk=160-160*8/10*2=-94,显然是不对的 
实际上,考虑背靠背(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk) 
这样在中间160个写时钟周期连续写的情况下,只能读出160*5/(10*10)*8=64个数据,所以FIFO的深度应该为160-64=96 
也就是fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk=160-160*8/10*5/10=96

如果数据流连续不断则FIFO深度无论多少,只要读写时钟不同源同频则都会丢数;
FIFO用于缓冲块数据流,一般用在写快读慢时,
FIFO深度 / (写入速率 - 读出速率) = FIFO被填满时间 应大于数据包传送时间= 数据量 / 写入速率
例:A/D采样率50MHz,dsp读A/D读的速率40MHz,要不丢失地将10万个采样数据送入DSP,在A/D在和DSP之间至少加多大容量(深度)的FIFO才行?
100,000 / 50MHz = 1/ 500 s = 2ms
(50MHz - 40MHz) * 1/500 = 20k既是FIFO深度。
一种错误的算法(我也犯了同样的错误):
100,000/40MHZ= 1/400s = 2.50ms
(50M - 400M)*1/400 =25K.那么这样进去的数据就不是100K了,而是100K+50M*(0.0025-0.002)=125,000bit,错误在时间的计算
### FPGAFIFO 的最小深度计算 对于FPGA中的FIFO,其最小深度计算取决于具体的应用场景以及读写速率等因素。当写速率大于读速率时,为了防止FIFO被写满,在一定时间内需要确保有足够的空间容纳新写入的数据。 一种情况下的快速估算方法显示,如果要保证在写入120个数据之后FIFO不会溢出,则可以通过特定公式得出所需的最小深度[^1]: \[ \text{FIFO 深度} = 120 - 120 \times \frac{\text{读取速度}}{\text{写入速度}} \] 例如给定条件下,此表达式的解为45,意味着此时应配置至少拥有45个存储单元的FIFO以满足需求。 另外有实例表明,在另一组参数设定下——即每写入一个字节所需时间为12.5纳秒,并且连续写入120次期间不允许发生溢出事件的情况下,通过时间乘以单位时间内产生的额外项数也可以得到相同的结论:在此情况下,最少需准备能够保存45个项目的缓冲区容量[^4]。 对于更通用的情况,特别是涉及到不同频率的工作环境(比如异步操作),则可以采用如下更为灵活的方式来进行评估: \[ \text{fifo_depth_min}=\frac{\text{wr_burst}}{\text{wr_clk}}(\text{wr_clk}-\text{等效读时钟频率}) \] 这里`wr_burst`代表一次突发传输所能携带的最大数量;而`wr_clk`指的是写入端口工作的时钟周期长度;最后括号内的部分反映了实际有效工作率之间的差异[^5]。 值得注意的是,上述所有讨论均基于理想化假设之上,真实项目开发过程中还需考虑更多因素如毛刺噪声影响、同步机制引入延迟等问题。因此建议开发者们根据实际情况调整设计方案并进行全面测试验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值