FIFO是FPGA内部一种常用的资源,能够经过FPGA厂家的的IP生成东西生成相应的FIFO。FIFO可分为同步FIFO和异步FIFO,其差异首要是,读写的时钟是否为同一时钟,如运用一个时钟则为同步FIFO,读写时钟分隔则为异步FIFO。一般来说,较大的FIFO能够挑选运用内部BLOCK RAM资源,而小的FIFO能够运用寄存器资源例化运用。
一般来说,FIFO的首要信号包含:
实际运用中,可编程满的信号(XILINX 的FIFO)较为常用,ALTERA的FIFO中,能够经过写深度(即写入多少的数据值)来结构其可编程满信号。经过装备threshold(门限)的值能够设定可编程满起效时的FIFO深度。
上图所示为FIFO的模型,能够看做一个漏桶模型,其间输入、输出、满信号、空信号、可编程满等信号如图所示,一望而知。 其间threshold信号能够看做水位线,经过此信号能够设置可编程满信号。FIFO的其他的信号也大都与其深度相关,如有特别需求,可经过厂商供给的IP生成东西的图形界面进行挑选运用。
FIFO的运用场景有多种,其间首要如下所示:
(1) 数据的缓冲,如模型图所示,假如数据的写入速率高,但距离大,且会有突发;读出速率小,但相对均匀。则经过设置相应深度的FIFO,能够起到数据暂存的功用,且能够使后续处理流程滑润,防止前级突发时,后级来不及处理而丢掉数据。
(2) 时钟域的阻隔。关于不同时钟域的数据传递,则数据能够经过FIFO进行阻隔,防止跨时钟域的数据传输带来的规划与束缚上的杂乱度。
FIFO规划中有两个需求注意事项,首要,不能溢出,即满后还要写导致溢出,关于数据帧的操作来说,每次写入一个数据帧时,假如每写一个宽度(FIFO的宽度)的数据,都要查看满信号,则处理较为杂乱,假如在写之前没满,写进程不查看,则就简单导致溢出。因而可编程满的设定尤为必要,经过设置可编程满的水位线,确保能够存储一个数据帧,这样写之前查看可编程满即可。
其次,另一更简单犯错的问题,便是空信号。关于FIFO来说,在读进程中呈现空信号,则其没有代表该值没有被读出,关于读信号来说,如设定读出必定长度的值,只在一开端检测非空,如状态机的触发信号,简单呈现进程中心也为空的信号,会导致某些数据未读出,特别是写速满而读速快的场景下。 因而rden与!empty信号要一同有用才算将数据读出。
空信号处理相对简单犯错,懒人自有笨办法,下面介绍一种使用于数据帧处理的FIFO运用方法,只需在读开端检测空信号即可,能够简化其处理读数据的流程:
其处理结构如上图所示,数据缓存以大FIFO(BLOCK RAM完成)为主,而每存储结束一个数据帧向小FIFO(寄存器完成)内写入值。当小FIFO标明非空时,则标明大FIFO中已存储一个整帧。则下一级模块能够只需检测小FIFO非空时,然后读出一个整帧,进程中大FIFO一向未非空,能够不必处理非空信号,然后简化规划和验证的流程。
此外还有FIFO其他使用方法,下节接着介绍。(未完待续)