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