XILINX FIFO深入解析

简介

        FIFO:FIRST IN FIRST OUT,是一个先进先出缓冲器。本章节就XILINX FIFO IP模块进行详细介绍。

FPGA调用FIFO IP,如下图所示:

        本IP FIFO有3种模式,分别是NAtive模式、AXI-4模式、AXI-STREAM,下面就每个模式详细介绍。

Native框图

该模式结构图如下图所示:

Native FIFO

BASIC界面

现结合IP设置做详细介绍,如下图所示:

1、代表FIFO类型,NAtive、AXI-4、AXI-STREAM,这里选用NAtive模式;

2、组成FIFO的方式,同步还是异步,由块 RAM、分布式 RAM 还是内置 FIFO 资源构成;

3、FIFO支持的特性:
(1) Non-symmetric aspect ratios:非对称纵横比(读写的数据端口位宽可以不一致,范围从 1:8 到 8:1);
(2) First-Word Fall-Through:第一个字读出功能,当 FIFO 中存在数据时,第一个字将通过 FIFO自动出现在输出总线 dout上;
(3) Uses Built-in FlFO primitives:使用内置的FIFO单元,从而可以通过在宽度和深度上级联内置 FIFO 来创建大型 FIFO;
(4) ECC support:纠正检查支持;
(5) Dynamic Error Injection:汉明错误注入;

        这里需要说明的是FIFO主要做数据缓存和异步处理的作用,同步时钟选用COMMON模式,异步处理选用异步时钟FIFO,即independent模式。

        不论是同步FIFO还是异步FIFO,基本只用到BRAM模式或者distribute模式,这两种模式的区别是前者是使用FPGA内部固定缓存资源,后者是使用逻辑资源搭建的FIFO功能,当BRAM资源紧张的时候,合理利用后者可以减轻BRAM负担。

本文我们选用异步FIFO做介绍,如下图所示:

synchonization stages:FIFO里的数据数量多少时,EMPTY信号开始拉低;

Native Ports界面

Native Ports设置图如下:

1、FIFO读模式

Standard FIFO:标准模式,IP核的输出给定读使能后,读数据会滞后至少一个时钟周期输出,选择Output Registers会再延迟一个时钟周期。具体输出延迟的周期可查看总结页面。时序图如下:

first word fall through:rd_en拉高的同时输出第一个数据,下一周期输出下一个数据,即数据未读取前,数据已经准备好。时序图如下:

2、设置数据写宽度;

3、设置数据写深度,这里读的深度可以和写的深度不一致,如下图所示:

此设置下依然遵循先进先出的原则,如下图所示:

时序图如下:

        从上图可以得出FPGA FIFO的写数据宽度为2,分四次依次写入"01","00","11","10"四个值,读数据宽度设置为8,那么读出的值为0x4E。

        类似的如果设置写入的是8bit,输出的是2bit,时序图如下:

4、ECC功能,默认不选

        关于ECC功能的介绍,具体来说,BlockRAM内部集成了错误检测和纠正单元,可以进行64位ECC的校验。这意味着,当72位的bit位都被使用时,可以纠正所有的单bit错误,这个错误修正是在数据的输出端口进行的,而不是在内部的存储阵列里面进行的。此外,它能够检测但无法纠正双bit的错误,并且能够指示出错误地址。这种功能对于需要使用外部高速存储器控制器的用户来说非常有帮助,因为用户可以故意插入一些错误进行相关的测试‌。该功能作者目前未使用过。

5、标准模式下寄存器输出时延,如果不选择,输出滞后一个时钟周期,默认可不选。添加寄存器输出可一定程度上增强FIFO布局布线的性能,这是我个人理解,但一般情况下无需使用,布线时序紧张的情况下可考虑。

6、复位接口,异步时钟使用异步复位,后面两个是使能复位新增的对象,分别时同步复位和读写忙碌标志位,在忙碌状态下,不能进行读或者写,时序图如下:

复位一段时间后,写和读会持续一段时间忙碌状态,代表该时间段内不能进行读写操作。

7、复位后默认输出数据设置。

status flags界面

FIFO的status flags设置,简单来说就是状态信号设置,因为使用FIFO过程中仅仅是empty,full这些信号远远不够用,我们需要更过的信息来知道当前FIFO缓存的状态,如下图所示:

1、基本满和基本空标志位;原文表示如下:

        almost_ful Flag::When asserted, this signal indicates that only one more write can be performed before the FIFO is full,代表还有一个数据写满时该信号拉高;

        Almost Empty Flag: When asserted, this signal indicates that the FIFO is almost empty and one word remains in the FIFO.代表还有一个读数据,EMPTY拉高;

 2、写有效标志和写溢出标志,时序图如下:

3、读有效和读空无效标志,时序图如下:

可以看到valid信号和有效数据时同步的。和AXI_STREAM里的TVALID信号一致。

4、自定义状态信息,分别为BUFFER即将满状态和即将空的状态,该信号在设计中经常使用到。该状态可以选用5种模式如下:

(1):该模式代表不适用自定义状态。

(2)Single threshold constant: 

        You can specify the threshold value through the FIFO Generator Vivado IDE. Once the core is generated, this value can only be changed by re-generating the core. This option consumes fewer resources than the single threshold with dedicated input port.设置固定参数,BUFFER缓存大于这个参数时prog_full拉高,时序图如下:

 (3)Single threshold with dedicated input port (non-built-in FIFOs only):

         You can specify the threshold value through an input port (prog_full_thresh) on the core. This input can be changed while the FIFO is in reset, providing you the flexibility to change the programmable full threshold in-circuit without re-generating the core,代表prog_full状态的值可以动态设置。

(4)Programmable Full: Assert and Negate Thresholds constant

        This option enables you to set separate values for the assertion and deassertion of prog_full. When the number of entries in the FIFO is greater than or equal to the assert value, prog_full is asserted. When the number of entries in the FIFO is less than the negate value, prog_full is deasserted,代表prog_full信号的上升沿和下降沿的值可以自由设置,时序图如下:

(5)Programmable Full: Assert and Negate Thresholds input port

        同理,prog_full信号的上升沿和下降沿可以通过FPGA逻辑设置。

        EMPTY状态标志和FULL类似,只介绍一个Single threshold constant模式,其他不再强调,模式时序如下图所示:

Data Counts界面

该界面主要设置WR和RD缓存数据数量;

        wr_data_count(写数据计数器)表示此时写入到FIFO中的数据;写入一个数据该值加一;读出数据后,该值根据相应的位宽减。
        rd_data_count(读数据计数器)表示此时FIFO中可读的数据量;读出一个数据该值减一,写入数据后,该值根据相应的位宽加。

到这里普通模式FIFO介绍完毕。

AXI_STREAM FIFO

下面是AXI STREAM的时序图如下图所示:

BASIC界面

只有tvalid和tready同时为高电平时数据有效。

框图如下:

1、选用AXI STREAM模式;

2、同步时钟和异步时钟选择,这里一样选择异步时钟;

3、跨时钟域的打拍操作,默认即可。

AXI4 STREAM Ports界面

如下图所示:

Data num bytes:数据流数据宽度;

TID WIDTH:(Slave AXI Stream Transaction ID)是一个输入信号,用于标识数据流中的数据包。这个信号允许数据包的发送方(Slave)为每个数据包分配一个唯一的ID,以便于数据的识别和处理。通过s_axis_tid,接收方(Master)可以识别来自不同源的数据包,这对于处理并发数据流或进行调试非常有用,0代表不使用;

TDEST WIDTH:信号用于指定数据传输的目标地址。这个信号通常用于多通道数据传输场景,其中不同的数据流需要发送到不同的目标地址。

TUSER WIDTH:用户自定义的信息;

HAS TSTRB:数据有效位指示,例如数据流的位宽时32bit,那么该值的位宽时4bit,每一个bit映射数据流的一个BYTE,例如STROBE[0] = 1b, DATA[7:0] is valid,STROBE[3] = 0b, DATA[31:24] is not valid。

HAS TKEEP:和HAS TSTRB类似,代表数据是否有效还是该值无效,两个信号区别如下:

  • s_axis_tkeep‌信号用于指示哪些字节是有效的数据,它提供了关于数据传输中哪些字节是实际数据的辅助信息。在AXI总线通信中,数据传输通常以字节为单位,并且每个字节都有一个对应的tkeep位。当某个字节的tkeep位为1时,表示该字节是有效数据;为0时,表示该字节是无效数据,即不应被处理或传输‌1。

  •  

    s_axis_tstrb‌信号则用于标记哪些字节是有效的传输数据。在非对齐传输的情况下,尤其是在起始地址非对齐的情况下,tstrb信号用于指示哪些字节被包含在传输中。具体来说,对于填充数据(用于实现地址对齐的数据),tstrb信号会将这些字节标记为无效,即通过设置相应的tstrb位为0来指示这些字节不应被视为有效数据传输的一部分‌2。

简而言之,s_axis_tkeep和s_axis_tstrb的主要区别在于它们各自的功能和用途:

  • s_axis_tkeep用于指示哪些字节是实际的有效数据,帮助识别传输中的有效载荷。
  • s_axis_tstrb则用于标记哪些字节是传输中的有效数据字节,特别是在处理非对齐传输时,通过设置tstrb位为0来标识填充数据,确保数据的正确对齐和传输。

一般s_axis_tkeep信号用的较多一点。

TLAST:AXI STREAM数据流一般以帧为单位,一帧最后的有效数据以TLAST结尾。

Config配置界面

界面图如下:

1、使用片内固定BRAM存储资源或者逻辑搭建资源,和Native FIFO一样;

2、以数据为单位或者以帧为单位;一般根据设计要求选择,如果设计传输中有帧定义,一般选择以帧作为缓存,这样缓存完一帧数据在输出,保证数据连续性。

3、FIFO深度;

4、自定义信号,和Native fifo一样,不做介绍。

Status Flags界面

        信号定义和Native一样,不再阐述。

        FIFO IP的介绍就到这里,有疑问的可以留言。

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值