Xilinx系FPGA学习笔记(七)FIFO的IP核学习

系列文章目录



FIFO介绍

FIFO(First In First Out),即先进先出。FPGA 或者 ASIC 中使用到的 FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互。它与普通存储器的区别是没有外部读写地址线,这样使用起来相对简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加 1 完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

FIFO 从读写时钟上来分有两类结构:单时钟 FIFO(同步 FIFO) 和双时钟 FIFO(异步FIFO)。单时钟 FIFO 的所有输入输出信号都是同步这个时钟信号的,双时钟 FIFO结构中,写端口和读端口分别有独立的时钟

(1)单时钟FIFO
常用于片内数据交互,由于传感器的数据非常快,所以需要利用FIFO,用快时钟将数据保存下来,后面慢速传递时也可以用快时钟来拿出数据,应该有读写使能配合完成,一般在快速时钟域到慢速的情况下,只需要快时钟就行

在高速ADC的工作时,每一路的时钟都很快,我们采用了一个RAM来存储数据,其实就是一个单时钟FIFO,用这个快时钟作为读写时钟,因为读取速度比较慢,所以有其他时钟来控制读地址,但还用快时钟来读数据。这里其实直接例化一个单时钟FIFO就行了,本质一样的
在这里插入图片描述

(2)双时钟 FIFO
双时钟 FIFO 应用于异步数据的收发,将不同时钟域中的数据同步到所需的时钟域系统中,一般在慢速时钟域到快速时钟的情况下,两个时钟都需要使用。例如将高速 ADC 采集的数据通过千兆以太网发送到 PC 机

FIFO还能进行位宽转换,大转小,小转大,其实就是把数据分割合并

FIFO 的宽度:即 FIFO 一次读写操作的数据位;
FIFO 的深度:指的是 FIFO 可以存储多少个 N 位的数据(如果宽度为 N)。
满标志: FIFO 已满或将要满时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO的写操作继续向 FIFO 中写数据而造成溢出。
空标志: FIFO 已空或将要空时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO的读操作继续从 FIFO 中读出数据而造成无效数据的读出。
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。

双时钟FIFO的IP核配置

在这里插入图片描述
在 IP 设置界面对接口类型设置为 Native, FIFO 类型上根据使用的资源以及读写时钟是否相同分为多种, 这里创建一个独立读写时钟,使用嵌入式 Block RAM 资源的 FIFO,选择 Independent Clocks Block RAM。

独立就是双时钟FIFO

在这里插入图片描述
设置读写深度和位宽
在这里插入图片描述
Standard FIFO 是在给了读数据使能后,数据才出来,而 First Word Fall Through 模式是,当前数据提前已经到数据读数据线上,在读使能到来后,下一个数据会到数据线上。选择 Standard FIFO 类型
在这里插入图片描述
在 Output Register 勾选并选择Embedded Register,也可以选择 Fabric Register,或者两个寄存器都选加上,多加一个输出寄存器,输出就会多延迟一个时钟周期出来
在这里插入图片描述
可以保持默认的勾选复位管脚、复位同步和使能 Safety Circuit

复位是对数据输出以及内部读写指针计数等进行复位,复位后,读写指针清零。这里的复位同步功能是
对异步输入的复位信号分别在读写时钟域内先进行同步后再进行读写的各自复位。

Safety Circuit 是一种更加可靠模式,内部通过额外的逻辑电路让 FIFO 复位的更加可靠,勾选 Enable Safety Circuit 后 fifo 模块的管脚会多出 wr_rst_busy 和 rd_rst_busy 两个信号输出,分别表示写/读时钟域复位忙信号(为 1 表示忙,处于复位中,为 0表示复位完),所以每次给一个异步复位信号对 FIFO 进行复位时,需要等到 wr_rst_busy 从1 变为 0 后才能对 FIFO 进行写数据操作(在 FIFO 非满情况下,这个是任何写操作时候都需要满足的),在 wr_rst_busy 为 1 时进行写操作是不允许的;同样的要等到 rd_rst_busy 从 1变为 0 后才能对 FIFO 进行读操作,在 rd_rst_busy 为 1 时进行读是不允许的。

在这里插入图片描述
Synchronization Stages即同步级数,只有在选择独立时钟 FIFO 类型时才会有这个设置,单时钟FIFO没有,异步复位信号持续时间,理论上要设置为周期大的那个时钟

在这里插入图片描述
Full Flag Reset Value:在复位时,满信号处于什么值,这里保持默认的 1,也就是复位时认为是满,禁止写入。
Dout Reset Value:复位时, FIFO 输出处于什么值,保持默认。
Read Latency:这里会根据前面设置自动更新,前面我们设置输出加上一个寄存器,这里就变为了 2,不加寄存器的情况下是 1,加两个寄存器就是 3。
在这里插入图片描述
wr_ack:写操作响应信号,当向 FIFO 写入数据时,如果正确写入到 FIFO 了,会输出高电平表示数据成功写入。
overflow:上溢出标识信号,表示 FIFO 数据满情况下继续往 FIFO 里写数据,该信号会拉高标志向上溢出。
valid:读数据输出数据有效信号,在进行读操作时, valid 信号伴随数据输出而拉高,高电平表示输出数据有效,用户逻辑可以根据该信号对读出的数据做后续进一步的处理使用。
underflow:下溢出标识信号,表示 FIFO 数据空情况下继续对 FIFO 进行读操作,该信号会拉高标志向下溢出。

在这里插入图片描述
可以对空满数据置位的阈值进行设置,例如默认情况下设置值依次为 253, 252,就是当数据大于等于 253
时, full 信号置 1,在 full 为 1 情况下, fifo 内数据量减小到 252 以下(包括 252)时, full变为 0。almost_full和almost_empty比full和empty信号提前一个时钟周期

Single Programmable Full Threshold Constant:仅对 Assert Value 值可进行设置, Negate Value 不可设置,保持默认。
Multiple Programmable Full Threshold Constant: Assert Value 和 Negate Value 均可设置。
Single Programmable Full Threshold Input Port: Assert Value 可由输入端口进行设置,Negate Value 不可设置 , 保持默认 , 这种情况下FIFO会多出个输入端 口prog_full_thresh。

Multiple Programmable Full Threshold Input Port: Assert Value 和 Negate Value 均可由输入端口进行设置 。 这 种情况下 FIFO会多出两个输入口分 别 为prog_full_thresh_assert[7:0]和 prog_full_thresh_negate[7:0],用于设置 Assert Value 和Negate Value。

在这里插入图片描述
FIFO 数据量计数信号输出, Write Data Count 和 Read Data Count 分别同步与写时钟和读时钟。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值