FPGA从Xilinx 的7系列学起(8)

2.7 FIFO模式
在7系列中还包括专用逻辑,每个BlockRAM转换成专用的FIFO。这样的结构的最大好处在于可以不占用CLB资源,可以直接利用硅片里面专用单元,可以直接转化RAM为FIFO使用, 而且从性能上讲也比消耗逻辑资源的FIFO性能要好一点。XILINX 7系列中的FIFO是支持同步和异步读写操作,不需要时钟和数据之间有一个相位的便宜。空信号,满信号,和可以编程的空满信号都可以被用作控制FIFO的信号,从而可以实现不同的功能。同步FIFO可以消除异步FIFO的固有的不确定性。它有一个first-word-fall-through的选项,在空模式下,它可以使第一个数据能够立马从输出口可以读取到。

FIFO像BlockRAM一样可以提供各种不同的配置模式,当BlockRAM被分为两个18Kb的时候,它也可以使用BlockRAM的一部分。需要注意的是FIFO对应BlockRAM的端口A,写端口对应着BlockRAM的端口B。也BlockRAM一样可以级联出更大的存储空间,可以配置成64Kb

FIFO支持使用异步时钟,它能够支持标准和first-word-fall-through模式。这在生成FIFO的属性里面可以选择使用,GUI默认的模式是同步模式。同步模式只能支持标准模式,无法支持first-word-fall-through模式。这种模式没有信号的一个相互交互使用,就可以获得一个非常低的延时。

至于选用什么模式,是用户根据自己需求来完成的,有一点需要进一步强调一下,无论用户需用什么模式,都不会额外占用资源。

关于时钟的对应关系,也就啰嗦一句:读取从FIFO数据是同步的RDCLK的上升沿;写入数据到FIFO是同步的WRCLK的上升沿。

FIFO核同时可以产生大量的标志,当用户使用 GUI界面进行例化的时候,这个都是可以用户来选择使用什么信号,不使用什么信号。同样地,这些标志不要求任何额外的逻辑。最常用的信号有FULL,ALMOST_FULL,EMPTY,ALMOST_EMPTY 4个信号,FULL,ALMOST_FULL的同步时钟是写时钟,EMPTY,ALMOST_EMPTY的时钟是读时钟。

当尝试对一个满的FIFO进行写操作的时候,FIFO还提供WRERR信号来声明出错,当尝试对一个满的FIFO进行读操作的时候,FIFO还提供RDERR信号来声明出错。RDCOUNT和WRCOUNT是当前指针指到底层BlockRAM地址(它俩分别对应在RDCLK和WRCLK。)。

在同步模式下,ALMOST_EMPTY 可以编程的数值为1到FIFO深度减2的之间。在异步模式中,ALMOST_EMPTY在标准模式可以编程的数值范围为5至深度减6,在FWFT模式下可以编程的数值范围为6到深度减6。在同步模式下,ALMOST_FULL 可以编程的数值为1到FIFO深度减2的之间。在异步模式中,ALMOST_FULL在标准模式可以编程的数值范围为4至深度减7之间,在FWFT模式下可以编程的数值范围为4到深度减8之间。

最后对FIFO的两种模式在做一个简单的说明:
在标准模式下,数据的第一个字必须积极从FIFO读出。当空信号无效时,有读使能才可以读数据。在first-word-fall-through模式下,只要数据被推入FIFO中那么数据立即出现在读端口。

文章来源: FPGA那点事儿
微信公众号