Vivado-FIFO Generator

2023-11-07

很全很详细的FIFO Generator IP核的使用规则

FIFO Generator IP核的使用

1 概述

(1)最大支持500M
(2)支持三种接口:Native interface FIFOs、 AXI Memory Mapped interface FIFOs、 AXI4-Stream interface FIFOs
(3)读写数据时,在数据上升沿采样

2 FIFO规则

2.1 empty/full信号

实际上即使有数据写入到fifo中,empty还是为高,等一些周期之后才会拉低,具体多少个周期之后不一定,不知道。就理解成fifo的反应有点慢就行了。
如图:
在这里插入图片描述
不管fifo的empty信号什么时候拉低,咱们不用管,咱们使用者只要知道,当empty信号拉低以后,就可以将读请求rd_en拉高读取数据,当empty拉高后,就不能使能rd_en了。

同样,对于full信号,只有当full为低的时候,才能使wr_en置1。
在这里插入图片描述
如图所示,当full置1了,写使能信号wreq拉低了,记住是上升沿采样,所以5这个值没有写进去.

注意:
(1)对于full信号,当full为1后,绝对不能再写入数据。
(2)empty为1后,绝对不要进行读数据
(3)无任何说明,绝对不能丢失数据,也不能多读数据
(4)当异步的时候,full信号是和写时钟域同步的,empty信号时和读时钟域同步的,这一点要记得,再写verilog代码时候需要考虑进来。还有rd_data_count和wr_data_count也是不同时钟域的,需要注意。

2.2 almost_full /almost_empty
almost_empty:表明fifo中的数据几乎要空了,只有一笔数据可以进行读取了。
almost_full:表明fifo中的数据几乎要满了,最多能再写一笔数据进去了。

2.3 rd_data_count/wr_data_count
这个就很坑了!
一直以为rd_data_count指的是从fifo中读出了几个数据,wr_data_count指的是向fifo中写入了几个数据,,,,,其实完全不是那样的。两个值都指的是fifo中存了多少数据,而在异步fifo时候,两个信号的时钟域不同,所以波形中两者不是同时出现的。
也就是说rd_data_count和wr_data_count指的是同一个东西。

基于这一点,本人做了一个实验:
在这里插入图片描述
如图,一直往FIFO中写数据,可以看到wr_data_count一直在计数。但是rd_en一直为0,但是rd_data_count却也有数据在变化。这就说明了rd_data_count并不是指的是从fifo中读出来了多少数据。

看PG057解释:
在这里插入图片描述
也是上面所说fifo中有多少数据,而不是写入或者读出了多少数据。

注意:
(1)rd_data_count和wr_data_count也只是个大概值,并不完全准确。rd_data_count小于等于实际上fifo中的数,以免没数据的时候进行数据读取,相反,wr_data_count大于等于实际上fifo中数,以免溢出。
(2)写入写接口的数据要经过一些周期才能在读接口中被读出。
(3)还有一点需要重点强调的就是,rd_data_count/wr_data_count的值不是fifo中数据多少个字节,而是多少笔。
怎么理解呢?
举例来说,我设置写入的位宽为32bit,那么写入fifo一笔就是4个字节,但wr_data_count是1而不是4。如图所示,位宽为32bit,写了64个字节,需要16笔,wr_data_count计数为16.

在这里插入图片描述
2.4 读写隔离
FIFO的读写隔离是实践总结出来的经验,在官方文档中并没有提及。使用fifo时候最好能够符合读写隔离。

什么是读写隔离呢?
读写隔离指的是,读写控制信号间是独立的,他们之间除了用fifo交流信息外,不能有任何信息交流。意思就是说,读FIFO的状态不能根据写fifo的信号来决定,写fifo也不能根据读fifo中的数据或状态来决定。
在这里插入图片描述
在这里插入图片描述
例:写侧的din_data写入FIFO时,其中包文包括了200个字节,使用din_vld作为读写使能,有可能出现读写不同步,因为你存入时就是你读出时;也有可能来了个短包文,存储完立马来了长包文,那么此时到底是写还是读?长包文未读完,来了短包文,此时FIFO就不知道如何处理。读写两侧应使用独立信号而不是互连信号。

2.5 读使能用组合逻辑
读使能必须判断空状态,并且要用组合逻辑产生。
在这里插入图片描述
这里指的是First-Word Fall-Fhrough模式,其实还是时序问题,不然可以导致多读一个,具体波形出来了以后具体分析吧。

2.6 因果关系
因果关系和上面的读写隔离其实是差不多的意思。

例如当判断rd_data_count达到某个值以后,令写使能wr_en置位继续往fifo中写数据,写入的数据又会导致rd_data_count的值变化,这要就造成了死循环。
真正的因果关系是,empty导致wr_en进行写数据,所以rd_data_count增加。

2.7 位宽转换
FIFO作为转换位宽时,高位优先出(将宽bit转窄bit);先进置于高位(窄bit转宽bit)。

2.8 rst信号
一定要注意:FIFO复位后的几个周期(2、3个周期)是无法进行写操作的,可能原因就是FIFO进入工作状态也需要一定时间的,如果此时就进行数据写入,可能导致某些数据丢失!!!

这一点一定要注意,而且在实际应用中,最好在fifo复位之后多空一些周期之后再进行写操作。
比如本人复位之后空了5个周期才进行写数据,写16笔数据,但是此时数据依旧有丢失了,只写进去了15笔。后来复位之后空了8个周期才进行写数据,16笔数据全部写进去了。
2.9 valid/wr_ack信号
(1)wr_ack的工作模式,即写入成功时,wr_ack将在下一周期拉高。也就是说,wr_ack反映的是上一周期的写操作。

在UG057上也有说:代表上一个周期写入成功
在这里插入图片描述
(2)valid和wr_ack类似,代表的是读数据成功。不过此处和wr_ack不同的是代表当前周期读到数据成功,而不是上一个周期,切记。

在这里插入图片描述

3 IP核配置

3.1 basic

在这里插入图片描述
interface type
如图,支持三种类型的接口。

Fifo implementation:
1,时钟,由FIFO的作用可知大部分都是读写不同步的,这里我们也选择异步模式,即读写的时钟不同。
2,存储器类型,这里主要是block RAM和distribute RAM之间的区别。简而言之,block RAM是FPGA中定制的ram资源,而distribute RAM则是由LUT构成的RAM资源。由此区别表明,当FIFO较大时应选择block RAM,当FIFO较小时,选择distribute RAM.另外一个很重要的就是block RAM支持读写不同宽度,而distribute不支持。在这里为了更全面的了解FIFO,选择block RAM以拥有非对称方向速率的特性。

同步fifo资源较少,结构简单。异步fifo的资源占用较多,结构复杂。

3.2 native ports
在这里插入图片描述
read mode
(1)读模式有两种选择,一般选择标准模式,当rd_en使能后,下一个clk出第一个数据。
在这里插入图片描述
如图,三个蓝框代表三个时钟,第一时钟rd_en拉高了,到第二个时钟就是第一个数据ebeae9d8,第三个时钟就是第二个数据。

(2)First-Word Fall-Fhrough:指的就是rd_en还没使能的时候,第一个数据就已经在读数据线dout上了,当rd_en使能后,清除上一个数据,此时第二个数据D1就出来了,当下一个clk时候,rd_en还是1的话,就将D1清除了,D2就出来了。
在这里插入图片描述
data port parameters
写数据宽度定义为32位,写深度定义为1024,读宽度定义为32位,而读深度将根据以上几个参数自动计算。但我们需要注意的是,在data port parameters处,有actual write depth和actual read depth,他们都比我们设置的要小,其意义以及原因将在例程中说明。

data port parameters处,有actual write depth和actual read depth,他们都比我们设置的要小,在实际的工程应用中,FIFO深度确实要比预设的小1,即当写入了Write Width-1个数据之后,FIFO的满信号full会拉高,这个时候如果还要写入数据,则写入的数据丢失。同理,读出Read Width-1个数据后,FIFO的空信号empty会拉高,此时读出信号无效。

initialization
(1)enable reset synchronization:选中后FIFO中的读端口和写端口同时复位,不选中,就会有两个复位信号需要连接。
(2)enable safety circuit:选中后会有两个信号:wr_rst_busy、rd_rst_busy
(3)Full Flags Reset Value:该值指的是full信号在FIFO复位时候的值为多少。这里注意,不是full一个信号,指的是关于full的所有信号(full/almost_full/prog_full)。

如图,当Full Flags Reset Value设为0的时候,rst_n为0的时候对fifo进行复位,可以看到关于full的三个信号都为0。
在这里插入图片描述
如图,当Full Flags Reset Value设为1时,rst_n为0的时候对fifo进行复位,此时三个信号都为1。但是复位完成以后,经过了好几个时钟周期以后full信号才会自动拉低,这样就很容易出现一些问题。比如上面所说,fifo复位以后等几个周期再进行写入操作,如果等的周期不够,此时full信号又是1,那么还是会丢数据。
所以,没有特殊要求,建议还是将当Full Flags Reset Value的值设置为0好一点。
在这里插入图片描述
3.3 status fla

g在这里插入图片描述
Optional Flags
almost full flags:就是fifo马上满了,还能再写入一笔数据。
almost empty flags:fifo马上空了,再读一笔数据就空了。

Programmable Flags
Programmable full type:有五个选项

在这里插入图片描述
选择第一个就不启用program full。
选择第二个就启用program full,然后再full threshold assert value中设置一个阀值,达到这个阀值,就进行program full就置1。
选择第四个,也启用program full信号,也可以设置阀值,但是不是再vivado这个UI界面设置,而是会多出一个prog_full_threshole信号,用户在verilog代码中自己设置,这样就更加灵活了,也就是说,full threshold assert value选项中也就设置不了。在这里插入图片描述
第三个意思应该是可以设置两个触发条件,当fifo中的数据在full threshold assert value和full threshold negate value之间时候,program full就置1。但是不确定,还没试过

在这里插入图片描述
第五个类似,用户可以在verilog中设置阀值。

3.4 data counts

在这里插入图片描述
这界面就没啥好说的,一看就会系列。

4 参考链接

链接1:(关于FIFO使用总结)
https://www.cnblogs.com/limanjihe/p/9771370.html
链接2:(xilinx FIFO的使用及各信号的讨论)
https://blog.csdn.net/xuexiaokkk/article/details/47753459

这两个链接必看,网上再搜一搜关于fifo使用的经验总结,不然只知道规则,在编程中依旧很容易出现问题,具体遇到了再说吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vivado-FIFO Generator 的相关文章

  • python饼图添加颜色_Python中的五颜六色的饼状图!(二)

    5x00 突出显示扇形块 explode 参数可以实现突出显示某一块扇区 接收数组形式的参数 这个数组中的元素个数应该是 len x 即和扇区块的数量相同 import matplotlib pyplot as plt plt rcPara
  • Python 基础(一):入门必备知识

    目录 1 标识符 2 关键字 3 引号 4 编码 5 输入输出 6 缩进 7 多行 8 注释 9 数据类型 10 运算符 10 1 常用运算符 10 2 运算符优先级 基础 进阶 爬虫 自动化 数据分析 编写小游戏 趣味 Python 文档
  • Expect 编程教程

    http expect nist gov expect home 目录 1 摘要 2 关键字 3 简介 4 Expect综述 5 callback 6 passwd 和一致性检查 7 rogue 和伪终端 8 ftp 9 fsck 10 多
  • 结构体中存在string类型成员

    include
  • 网页三剑客,html/css/javascript

    1 网页三剑客 html css javascript 引入到更高主流技术 进展比较快 不是为学习这个知识 小于10 高薪进入企业 新技术 我们的目标是让大家做项目时 出现这些html标签 css样式 js语法 都不陌生 2 javascr
  • 视频里去水印

    一 在网页 右键 检查 或者 ctrl shift i 调出代码界面 二 ctrl f 打开搜索框 可以直接搜索关键词 也可以输入xpath 优酷视频 在搜索框输入 div class youku layer wuliao div 删之前水
  • linux内核文件都是什么地方,一张图看懂Linux内核

    1 前言 本文主要讲解什么是Linux内核 以及通过多张图片展示Linux内核的作用与功能 以便于读者能快速理解什么是Linux内核 能看懂Linux内核 拥有超过1300万行的代码 Linux内核是世界上最大的开源项目之一 但是内核是什么
  • Java下载excel模板文件

    目录 一 前言 二 下载模板 三 Excel导入 一 前言 最近做了一个导入Excel的功能 需求 先提供一个下载Excel模板的功能 用户下载好模板后 可以在模板文件当中填写要上传的内容 填写完过后再进行导入Excel 然后将用户填写的数
  • springboot jackson时间和数据库查询的时间不一致

    1 当前的关于jackson的配置文件application yml jackson date format yyyy MM dd HH mm ss 1 1 问题描述 数据库查询出来的时间为 接口返回的数据 可以看出 接口返回的数据和数据库
  • cv2.imread读取灰度图的一点细节

    我们都知道灰度图或者红外图都是单通道图片 而彩色图片是三通道图片 但是当我们用img shape读取灰度图 红外图片的时候返回的却是三通道结果 img path home zhaotongdong data kaggle humap 256
  • 在css中使用vue定义的变量

    在css中使用vue定义的变量 例如根据分辨率的变化来改变元素的高度值 div class tablemain div
  • QT从入门到实战x篇_24_定时器实现方法2:利用QTimer类实现(更为推荐用于实现计时器功能)

    接上文 QT从入门到实战x篇 xx 定时器实现方法1 事件timerEvent QTimerEvent ev 静态变量的作用域 初始化及赋值 本篇介绍 使用QTimer类实现定时器功能 其原理是每隔一段时间就会利用timeout发送信号给槽
  • 蓝桥杯python(题目思路即解答(笔记))

    这篇文章是为蓝桥杯做准备时顺便做的笔记 用来讨论即参考用的 如有错误欢迎指正 有更好的方法也可以提出来一起讨论 谢谢各位大佬们orz 因为本人不是VIP 只能刷蓝桥杯里面的普通题 还请见谅orz 注 代码中的input别尚自加东西进去 会报
  • Fisher线性判别分析

    文章目录 一 问题举例 二 解决方法 1 Fisher线性判别分析 LDA 2 算法描述 1 留一法 2 Iris数据集 3 Sonar 数据集 三 仿真结果 1 Iris数据集 2 Sonar 数据集 四 代码 一 问题举例 在UCI数据
  • 通过docker搭建gitlab

    通过docker搭建gitlab 一 安装 拉取docker镜像 docker pull gitlab gitlab ce 启动容器 docker run d p 4443 443 p 8080 80 p 222 22 name gitla
  • 计算机桌面背景设置,电脑桌面背景设置图文教程

    桌面背景就是电脑屏幕所使用的各种图片 让我们的电脑看起来更好看 更漂亮 更有个性 但是很多人不知道电脑桌面背景如何设置 今天 小编就给大家介绍一下设置电脑桌面背景的操作方法 唯美的 搞笑的 文艺的高逼格桌面壁纸 还有超级好看的自拍照怎么能放
  • Postgresql语句持续更新

    分区表 partition by case when then end if else 日期 Date Timestamp text String互转 时间获取周 月等 自增序列 创建表 删除表 修改表 默认值 重命名列 修改列类型 时间序
  • python3.8.so.1.0‘: dlopen: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29‘ not found

    Linux下打包Python程序无法在别人系统上运行libpython3 6m so 1 0 dlopen lib64 libc so 6 version GLIBC 2 25 not wangziyang777的博客 CSDN博客 351
  • 安全方向就业前景

    安全方向人才招聘 文章目录 安全方向人才招聘 前言 安全人员基本技能 web安全工程师 web安全研发工程师 安全运维工程师 安全测试工程师 Windows逆向工程师 Android安全工程师 系统研发工程师 安全产品运营员 风控安全工程师
  • Linux与Windows的区别

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net chao199512 article details 79873866 当我们每个人接

随机推荐

  • 什么是Xshell? 干啥用的?

    Linux的远程连接工具 要登录Linux服务器使用的工具是putty SecureCRT Xshell 1 Xshell简介 Xshell 是一个强大的安全终端模拟软件 它支持SSH1 SSH2 以及Microsoft Windows 平
  • 分析注释 sequence_input_layer.py

    video order list 存放视频名称 对应视频 video dict 字典 每一个视频下都对应dict里的一项 usr bin env python Data layer for video Change flow frames
  • KVM虚拟机网络配置方式 (Bridge方式 Nat方式)

    Summary 使用libvirt安装完qemu kvm虚拟机 但是发现虚拟机不能上网 虚拟机想要上网 有很多中方法 我们称Guest机器为虚拟机 Host机器为开机运行的真实机器 KVM虚拟机网络配置一般的两种方式 NAT 默认上网 虚拟
  • 毕业设计——基于深度学习的手势识别以及手势交互功能(TensorFlow)(YOLO)

    目录 前言 1 背景介绍 2 项目简介 3 环境配置 配置介绍 版本 4 模型实现 数据集制作 手势训练 模型评估 识别效果 5 GUI界面以及手势交互的实现 区域介绍 展示 初始页面 识别页面 多媒体控制页面 6 结语 前言 今天 向大家
  • 【iOS】跳转邮箱发送邮件,支持系统内多个邮箱的方案 swift 实现

    我们永远无法知道运行应用程序的iPhone iPad是否安装了Apple的Mail应用程序 因为用户可以删除它 一 前言 网上一般都让这么写 let email foo bar com if let url URL string mailt
  • ubuntu apt-get grade 报错11: Resource temporarily unavailable

    ubuntu更新源时报错 报错详细提示如下 E Could not get lock var lib dpkg lock frontend open 11 Resource temporarly unavailable E Unable t
  • Android中View.inflate()

    Inflate可用于将一个xml中定义的布局控件找出来 因为在一个Activity里如果直接用findViewById 的话 对应的是setConentView 的那个layout里的组件 因此如果当前Activity里需要用到别的layo
  • 图像数据流识别圆形_我的电赛作品:BP算法鸟类图像识别系统

    作者 我的果果超可爱 本文由面包板社区版主原创 未经本人允许 禁止转载 不知不觉已经12月了 经过2020这个魔幻的一年 回想当年参加电子竞赛 仿佛回到了念书的快乐时光 不知不觉已经好几年了诶 任时光匆匆流走 我们还剩下什么呢 好了言归正传
  • CUDA10.0 官方手册 章三 CUDA编程接口

    因为这章内容比较碎 不好提炼 大部分为原文翻译 人工翻译 不是机器翻译 抵制不负责任的机翻从你我做起 翻译不易 转载贴上出处 630056108 qq com 目录 3 1 用NVCC编译 3 1 1 编译工作流 3 1 2 二进制兼容性
  • IPv6表示方法与配置案例

    1 IPv6地址格式 IPv4地址长度32位 IPv6的地址长度为128位 是IPv4地址长度的4倍 采用十六进制表示 表示方式如下 冒号分隔十六进制表示法 格式为X X X X X X X X 其中每个X表示地址中的16个二进制B 十六进
  • Tkinter批量截取log

    http automap bj bcebos com mapautozip 5 3 0 20201020 repacked path for 10x adas BaiduNavi china zip usr bin python codin
  • react获取经纬度

    useEffect gt if navigator geolocation navigator geolocation getCurrentPosition position gt const latitude position coord
  • Kubernetes学习之路(一)之概念和架构解析和证书创建和分发

    1 Kubernetes的重要概念 转自 CloudMan老师公众号 每天5分钟玩转Kubernetes https item jd com 26225745440 html Cluster Cluster 是计算 存储和网络资源的集合 K
  • C++Builder下利用TImage制作二维条码PDF417打印控件(五)

    接上文 字节压缩6 void TPDF417 byteCompaction6 pPdf417class p int start int length 6 char text p gt param gt text int ret p gt p
  • el-date-picker日期选择器

    先看效果 给绑定事件change或blur事件具体看需求
  • 计算机网络——主机IP地址、子网掩码、广播地址、网络数、主机数计算方法

    目录 一 概念 1 1 主机IP地址 1 2 子网掩码 1 3 广播地址 1 4 子网划分 二 计算 2 1 已知IP地址和子网掩码 计算网络地址和主机地址 2 2 已知IP地址和子网掩码 计算广播地址 2 3 已知子网掩码 计算主机数 2
  • DCMTK读取dcm图像

    医学图像处理中的图像格式通常为dcm格式 在C 中读取使用可以通过DCMTK库中的接口函数来实现 通常文件的读取步骤如下 使用DcmFileFormat类构造最基本的文件对象 使用loadFile 函数读取文件 并通过OFCondition
  • Python 思维锻炼

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 程序1 数字组合 程序描述 有四个数字 1 2 3 4 能组成多少个互不相同且无重复数字的三位数 各是多少 程序分析 可填在百位 十位 个位的数字都是1 2 3 4 组成所
  • uniapp 实现下载pdf格式文件

    processContractUrl params then res gt 调后端接口 返给url console log res uni downloadFile url res data url 调接口返给的url success fu
  • Vivado-FIFO Generator

    很全很详细的FIFO Generator IP核的使用规则 FIFO Generator IP核的使用 1 概述 1 最大支持500M 2 支持三种接口 Native interface FIFOs AXI Memory Mapped in