跨时钟域进行数据传输时,可以使用FIFO来避免数据丢失。使用FIFO的场合主要在:读数据的速率小于写数据的速率的突发传输场合,我们不得不将那些来不及读走的数据缓存下来;(思考:读取速度快于写入速度时,还需要FIFO吗?)
我们需要开多大的空间去缓存这些数据是一个值得思考的问题:缓存开大了会浪费FPGA存储资源,缓存开小了会丢失数据,因此如何去计算最小FIFO深度(保证数据不丢失的最小FIFO深度)值得我们讨论。
一、数据突发长度(burst length)
如前所述,FIFO用于缓存较慢模块来不及读取的数据,但是应注意:FIFO仅在数据突发时才有效; 即FIFO并不适用于连续的数据输入和输出的场合, 因为连续的数据流意味着来不及读的数据不断累积,导致所需FIFO的大小无穷大。 因此只有在突发数据传输过程中讨论FIFO深度才是有意义的,有必要先介绍数据突发长度的概念:
数据突发长度:也就是说我们一次传递一包数据完成后再去传递下一包数据,我们把一段时间内传递的数据个数称为数据突发长度(burst length)
二、异步FIFO最小深度计算原理
FIFO的深度的确定,应从FIFO用于缓冲在数据突发场合来不及取走的数据这一本质入手:计算出在突发读写这段时间内有多少个数据没有被读走,就知道了FIFO的最小深度(FIFO的最小深度就等于没有被读走的数据个数)
公式:
{FIFO深度 /(写入速率 - 读出速率)} = {FIFO被填满时间} > {数据包传送时间}= {写入数据量 / 写入速率}
解释:

本文探讨了在FPGA中使用Verilog实现FIFO时如何计算最小深度以避免数据丢失。介绍了数据突发长度概念,异步FIFO最小深度计算原理,以及在最坏情形‘背靠背’的数据传输中的计算方法。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



