Xilinx IP核手册阅读——FIFO

编程入门 行业动态 更新时间:2024-10-07 18:20:54

Xilinx IP核<a href=https://www.elefans.com/category/jswz/34/1769120.html style=手册阅读——FIFO"/>

Xilinx IP核手册阅读——FIFO

目录

  • Introduction
  • Ch. 1: Overview
    • Feature Summary
      • Native FIFO Interface Signals
    • Applications
      • Native FIFO Applications
  • Ch. 2: Product Specification
  • Ch. 3: Designing with the Core
    • General Design Guidelines
    • Initializing the FIFO Generator
    • FIFO Usage and Control(重要)
    • Clocking
    • Reset
    • Latency

Introduction


该核心为所有FIFO配置提供了优化的解决方案,并在利用最少资源的同时提供了最大性能(高达500 MHz)。

FIFO IP核提供本地接口AXI内存映射接口AXI4流接口 FIFO。本地接口为缓冲、数据位宽转换和时钟域去耦等应用提供最优方案,支持有序的存储和检索。

AXI内存映射接口和AXI4流接口源自从本地接口FIFO,前者支持AXI4, AXI3和AXI4-Lite三种类型。

AXI为一种协议,是一种标准化的总线接口,线多,操作复杂,常用的还是Native FIFO。

可看到,Introduction部分介绍的非常笼统,从很大的方向上讲明FIFO是什么。

Ch. 1: Overview


概述,和Introduction中的内容差不多,指明:FIFO的使用场景、最大时钟、支持的接口类型以及在VIVADO中使用时,需要配套,包括读取、写入指针和状态标志的生成等逻辑。

本地接口FIFO可以使用块RAM,分布式RAM或某些FPGA系列中可用的内置FIFO资源来创建高性能、区域优化的FPGA设计。

本地接口FIFO支持标准模式和首字直通(First Word Fall Through)(FWFT)两种操作模式,后者可以不需要读命令,自动的将最新数据放在dout上,相当于数据输入进去就会漏出来。


黑色为强制保留端口,蓝色为可选端口,灰色为可选边带端口。故黑色应为最重要端口,可见FIFO分为写时钟和读时钟两个区域,分别对应外部的写和读。

(跳过AXI接口FIFO的overview)

Feature Summary

Feature Summary中首先介绍了共同的功能

  1. 支持各种各样的接口
  2. 深度最大到131072字
  3. 读写时钟域可以独立可以一样
  4. VHDL演示了演示了IP核心的设计流程,包括如何实例化和模拟它(学的Verilog,还有参考价值吗?)
  5. 使用Xilinx Vivado IP目录自定义程序进行完全配置(VIvado里可以用就是了)


Native FIFO特定功能:

  1. 支持的位宽1~1024
  2. 对称或非对称纵横比(读写端口比范围从1:8到8:1),说白了就是输入输出位宽的比例,最大比例是8
  3. 同步或者异步复位选项
  4. 可以灵活的选择存储资源类型
  5. 支持标准模式和首字直通(First Word Fall Through)(FWFT)两种操作模式
  6. Full和Empty状态标志,以及用于指示还剩一个单词的Almost Full和Almost Empty标志
  7. 可编程的满和空状态标志,由用户定义的常量或专用输入端口设置
  8. 可配置的握手信号
  9. Hamming错误注入和校正检查(ECC)支持块RAM和内置FIFO配置
  10. 块RAM FIFO的软ECC支持(高达64位数据宽度)
  11. 块RAM和内置FIFO配置的嵌入式寄存器选项
  12. UltraScale的动态电源门控和ECC流水线寄存器支持™ 体系结构内置FIFO配置

上述的各种支持功能,常用性应该也是前边的几个,后边的配置,暂时基本上接触不上,人家毕竟做手册,写的全是他的事儿,怎么看是咱的事儿。

接下来手册里进一步介绍了如上12种功能的具体内容,把一句话扩展成一段话,对哪个功能感兴趣可以再去看,Native FIFO Interface Signals这节应该好好看一下。

Native FIFO Interface Signals



rst 为复位输入端口,一种异步复位信号,用于初始化所有内部指针和输出寄存器。不适用于UltraScale设备内置的FIFO
sleep 仅适用于UltraScale设备内置的FIFO

首先来看写端的端口,表格1-5按照必须和可选划分

必须的:
wr_clk-写时钟:写入域上的所有信号都与该时钟同步
din[n:0]-输入数据:接入的数据
wr_en-写使能:如果FIFO未满,置位该信号将把din的数据写入FIFO
full-写满信号:它被置位时,说明FIFO已经写满了,FIFO将不再理会后续的写使能信号,直接自闭,保持里面的数据不动。

(此处为什么说置位而不是拉高拉低呢?手册中用asserted,说明它是可以配置的,高有效、低有效都行)

可选的:
wr_rst Input-写复位:同步在写时钟上的信号,当它置位时,初始化写入时钟域的所有内部指针和标志。
almost_full-几乎满:当置位时,标志着再写一个,就得满了,就差那么一个。
prog_full-可编程满:自己设置一个阈值,大于等于阈值就是满,该信号就会被置位,小于阈值就不会置位。

wr_data_count [d:0]-写入数据计数:它输出的是已经写入FIFO的数据字数,该计数保证永远不会低估FIFO中的字数,以确保您永远不会溢出FIFO。这种行为的例外是,当写入操作发生在wr_clk/clk的上升沿时,该写入操作将仅反映在下一个上升时钟沿的wr_data_count,意思为,该时钟写入,至少下个时钟才能实现wr_data_count++,差了一个时钟。

其余的跳过。

读端口大部分和写端口同理,重点介绍下面两个端口功能。rd_data_count [c:0]-读计数:指示FIFO中可供读取的字数。计数保证永远不会过度报告可供读取的字数,以确保FIFO不会下溢(榨干),这种行为的例外是,当读取操作发生在rd_clk/clk的上升沿时,该读取操作仅反映在下一个上升时钟沿的rd_data_count上,也就是你在一时钟处进行读操作时,下一个时钟才能完成rd_data_count- -的操作。
该端口需要注意,它不是代表从FIFO中已经读出的数据计数(done),而是FIFO中可以读出来的数据计数(to do),它的计数从empty拉低开始

如上图,复位信号拉低后,经过1clk后,写使能拉高,数据开始写入FIFO,再经过2clk,wr_count开始计数,empty信号拉低后,rd_cout信号开始计数,但是注意光标时间,wr_count和rd_count两个信号并不是和clk时钟信号对齐的。(这个问题。。。。应该是IP核的固有问题?)

Applications

Native FIFO Applications


介绍了一个FIFO的典型应用,指导意义有限。

至此,Overview看了个大概,总结来说,该章中主要介绍IP核的应用场景、适配性等问题,并会给出IP核接口的详细说明,还会有简略的时序图说明接口之间的关系,力求全面总体,后面的章节一定是对ch1中提到的多有功能做出系统的详细的说明。

Ch. 2: Product Specification

本章包括有关性能和延迟的详细信息。本章中各种指针向其他文章,不想看。

Ch. 3: Designing with the Core

本章应该比较重要,一个⭐,一个IMPORTANT,说明开发者要严格遵守下面章节的内容设计。

General Design Guidelines


官方手册真是那个啊,上来让评估设计难度,真他娘的专业,主要从:最大时钟频率、目标设备架构(接口类型?)和特定用户功能三方面考虑,确保使用设计技术来促进实施,包括流水线和使用约束(时间约束、放置和/或面积约束)。

接下来了解信号管道化和同步,为了理解FIFO设计的本质,了解如何使用流水线来最大限度地提高性能,并实现时钟域交叉的同步逻辑是很重要的。写入din接口的数据可能需要多个时钟周期才能在读取接口上访问。

感觉略抽象,对于时序的前考虑有点困难。

同步的注意事项: 必须使用FIFO Full和Empty标志来保证正确的行为。

图3-1中给出了所有和时钟有关的信号,rst除外,它是异步复位信号。除了写使能、写数据两个口,所有输出的状态信号,都严格同步于其所在的时钟域,且只能在其所在的时钟域使用,观察图中,并没有wr_cout和rd_count信号,对应Native FIFO Interface Signals最后一段提到的,这两个计数信号并不会同步于所在的时钟。

Initializing the FIFO Generator



下划线的对应两种设计模式,不同的设计模式对复位的要求是不同的。

对于用块RAM或分布式RAM实现的FIFO,不需要复位,输入引脚是可选的。对于常见的时钟配置,可以选择异步或同步复位。对于独立的时钟配置,您可以选择异步复位(rst)或同步复位(wr_rst/rd_rst),分别针对各自的时钟域。

这个选项是否勾选,手册中介绍:


总之,勾选的话,执行异步复位时,rst置位,它将同步到用于确保FIFO初始化为已知状态的时钟域(?);不勾选的话,只要wr_rst被置位,写时钟域就保持复位状态,只要rd_rst被置位,读时钟域就会保持复位状态。(是否使用前者更好?)

FIFO Usage and Control(重要)


这段话把写入过程中的逻辑说的很清楚,当FIFO不full且wr_en信号拉高时,din数据写入,同时wr_ack也会置位,wr_ack表示:

如果一直不读,FIFO早晚被写满,满了之后,就会忽略wr_en的写请求,且保持内部数据不变,同时拉高溢出信号(overflow flag)。

官方给出了一个实例,值得认真参阅

下面是读操作。

上图把读过程中的几个关键信号逻辑讲的很明白。突然有点理解状态信号的含义,读写使能信号是被控制的量,相当于一个系统的输出,而状态信号如full、empty、almost系列、上溢、下溢等,都是一个系统的输入,而这个输入输出关系,在IP核的端口层面来看,又是反过来的。这个system,就是我们要配套FIFO编写的逻辑,用flag去控制en。

下面介绍了两种读取模式,FWFT应该也比较常用,但是暂时用不上。

第一种:Standard FIFO Read Operation

第二种:First-Word Fall-Through FIFO Read Operation

对比一下,第二种模式的empty信号和underflow信号都比第一种延后1clk。

Clocking


Reset

讲了同步复位和异步复位的概念。

Latency

更多推荐

Xilinx IP核手册阅读——FIFO

本文发布于:2024-03-08 00:05:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1719311.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:手册   Xilinx   IP   FIFO

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!