异步 FIFO(缓冲存储器,将数据在两个不同的时钟间进行交换, 能够顺序存储连续的数据,
之后按照先进先出的原则输出这些数据)
1、FIFO,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟
着才执行第二条指令。在系统设计中,以增加数据传输率、处理大量数据流、匹配具有不同
传输率的系统为目的而广泛使用 FIFO 存储器,从而提高了系统性能。FIFO 存储器是一个
先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个存储器的输入口,
另一个口是存储器的输出口。
FIFO 关心的就是队列长度问题,队列长度会影响到时延、抖动、丢包率。因为队列长
度是有限的,有可能被填满,这就涉及到该机制的丢弃原则。常见的一个丢弃原则叫做 Tail
Drop 机制。简单地说就是该队列如果已经满了,那么后续进入的报文被丢弃,而没有什么
机制来保证后续的报文可以挤掉已经在队列内的报文。在这种机制中,如果定义了较长的队
列长度,那么队列不容易填满,被丢弃的报文也就少了,但是队列长度太长了会出现时延的
问题,一般情况下时延的增加会导致抖动也增加。如果定义了较短的队列,时延的问题可以
得到解决,但是发生 Tail Drop 的报文就变多了。
2、原理简述:
FIFO 队列不对报文进行分类,当报文进入接口的速度大于接口能发送的速度时,FIFO
按报文到达接口的先后顺序让报文进入队列,同时,FIFO 在队列的出口让报文按进队的顺
序出队,先进的报文将先出队,后进的报文将后出队。FIFO 队列具有处理简单,开销小的
优点。但 FIFO 不区分报文类型,采用尽力而为的转发模式,使对时间敏感的实时应用(如VoIP)
的延迟得不到保证,关键业务的带宽也不能得到保证。
2’功能:FIFO 存储器是系统的缓冲环节,如果没有 FIFO 存储器,整个系统就不可能正常工
作,它主要有几方面的功能:
(1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;
(2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻 CPU 的负担;
(3)允许系统进行 DMA 操作,提高数据的传输速度。这是至关重要的一点,如果不采用
DMA 操作,数据传输将达不到传输要求,而且大大增加 CPU 的负担,无法同时完成数据的
存储工作。
3、使用范围:
FIFO 一般用于不同时钟域之间的数据传输,比如 FIFO 的一端是 AD 数据采集,另一端
是计算机的 PCI 总线,假设其 AD 采集的速率为 16 位 100K SPS,那么每秒的数据量为
100K×16bit=1.6Mbps,而 PCI 总线的速度为 33MHz,总线宽度 32bit,其最大传输速率为
33*32=1056Mbps,在两个不同的时钟域间就可以采用 FIFO 来作为数据缓冲。另外对于不同
宽度的数据接口也可以用 FIFO,例如单片机位 8 位数据输出,而 DSP 可能是 16 位数据输
入,在单片机与 DSP 连接时就可以使用 FIFO 来达到数据匹配的目的。
4、重要参数:
FIFO 宽度(THE WIDTH):指的是 FIFO 一次读写操作的数据位,就像 MCU 有 8 位和
16 位,ARM32 位等等,FIFO 的宽度在单片成品 IC 中是固定的,也有可选择的,如果用 FPGA
自己实现一个 FIFO,其数据位,也就是宽度是可以自己定义的。
FIFO 的深度:THE DEEPTH,它指的是 FIFO 可以存储多少个 N 位的数据(如果宽度为
N)。如一个 8 位的 FIFO,若深度为 8,它可以存储 8 个 8 位的数据,深度为 12 ,就可以存
储 12 个 8 位的数据,FIFO 的深度可大可小,个人认为 FIFO 深度的计算并无一个固定的公
式。在 FIFO 实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个具体
的应用中不可能由一些参数精确算出所需的 FIFO 深度为多少,这在写速度大于读速度的理
想状态下是可行的,但在实际中用到的 FIFO 深度往往要大于计算值。一般来说根据电路的