1.FIFO IP核简介
根据FIFO 工作的时钟域,可以将FIFO 分为同步FIFO 和异步FIFO。同步FIFO 是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作。异步FIFO 是指读写时钟不一致,读写时钟是互相独立的。Xilinx 的FIFO IP 核可以被配置为同步FIFO 或异步FIFO,其信号框图如下图所示。从图中可以了解到,当被配置为同步FIFO 时,只使用wr_clk,所有的输入输出信号都同步于wr_clk 信号。而当被配置为异步FIFO时,写端口和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟wr_clk,所有与读相关的信号都是同步于读时钟rd_clk。

对于FIFO 需要了解一些常见参数:
FIFO 的宽度:FIFO 一次读写操作的数据位N;
FIFO 的深度:FIFO 可以存储多少个宽度为N 位的数据。
空标志:empty。FIFO 已空时由FIFO 的状态电路送出的一个信号,阻止FIFO 的读操作继续从FIFO中读出数据而造成无效数据的读出。
满标志:full。FIFO 已满或将要写满时由FIFO 的状态电路送出的一个信号,以阻止FIFO 的写操作继续向FIFO 中写数据而造成溢出。
读时钟:读FIFO 时所遵循的时钟,在每个时钟的上升沿触发。
写时钟:写FIFO 时所遵循的时钟,在每个时钟的上升沿触发。

2.FIFO IP核的使用
根据实验任务要求和模块化设计的思想,我们需要如下4 个模块:fifo IP 核、写fifo 模块、读fifo 模块以及顶层例化模块实现前三个模块的信号交互。由于FIFO 多用于跨时钟域信号的处理,所以本实验我们使用异步FIFO 来向大家详细介绍双时钟FIFO IP 核的创建和使用。为了方便大家理解,这里我们将读/写时钟都用系统时钟来驱动。系统的功能框图如下图所示:

首先创建一个名为ip_fifo 的工程,接下来我们创建fifo IP 核。在Vivado 软件的左侧“Flow Navigator”栏中单击“IP Catalog”,在“IP Catalog”窗口中,在搜索栏中输入“fifo”关键字,这时Vivado 会自动查找出与关键字匹配的IP 核名称,我们双击“FIFO Generator”,如下图所示。

弹出“Customize IP”窗口,如下图所示。

接下来就是配置IP 核的时钟参数的过程。
最上面的“Component Name”一栏设置该IP 元件的名称,这里保持默认即可。在第一个“Basic”选项卡中,“Interface Type”选项用于选择FIFO 接口的类型,这里我们选择默认的“Native”,即传统意义上的FIFO接口。“Fifo Implementation”选项用于选择我们想要实现的是同步FIFO 还是异步FIFO 以及使用哪种资源实现FIFO,这里我们选择“Independent Clocks Block RAM”,即使用块RAM 来实现的异步FIFO。如下图所示。

接下来是“Native Ports”选项卡,用于设置FIFO 端口的参数。

“Read Mode”选项用于设置读FIFO时的读模式,这里我们选择默认的“Standard FIFO”。

“Data Port Parameters”一栏用于设置读写端口的数据总线的宽度以及FIFO 的深度,写宽度“Write Width”我们设置为8 位,写深度“Write Depth”我们设置为256,注意此时FIFO IP 核所能实现的实际深度却是255;虽然读宽度“Read Width”能够设置成和写宽度不一样的位宽,且此时读深度“Read Depth”会根据上面三个参数被动地自动设置成相应的值;但是我们还是将读宽度“Read Width”设置成和写宽度“Write Width”一样的位宽,这也是在实际应用中最常用的情况。

由于我们只是观察FIFO 的读写,所以最下面的“Reset Pin”选项我们可以不使用,把它取消勾选。其他设置保持默认即可,如下图所示。

“Status Flags”选项卡,用于设置其他的边带信号,这里我们并不使用它们,保持默认即可,如下图所示。

“Data Counts”选项卡用于设置FIFO 内数据计数的输出信号,此信号表示当前在FIFO 内存在多少个有效数据。为了更加方便地观察读/写过程,这里我们把读/写端口的数据计数都打开,且计数值总线的位宽设置为满位宽,即8 位(根据你的深度所定),如下图所示。

最后的“Summary”选项卡是对前面所有配置的一个总结,在这里我们直接点击“OK”按钮即可,如下图所示。

接着就弹出了“Genarate Output Products”窗口,我们直接点击“Generate”即可,如下图所示。

之后我们就可以在“Design Run”窗口的“Out-of-Context Module Runs”一栏中出现了该IP 核对应的run“fifo_generator_0_synth_1”,其综合过程独立于顶层设计的综合,所以在我们可以看到其正在综合,如下图所示

在其Out-of-Context 综合的过程中,我们就可以进行RTL 编码了。首先打开IP 核的例化模板,在“Source”窗口中的“IP Sources”选项卡中,依次用鼠标单击展开“IP”-“fifo_generator _0”-“Instantitation Template”,我们可以看到“fifo_generator_0.veo”文件,它是由IP 核自动生成的只读的verilog 例化模板文件,双击就可以打开它,如下图所示


我们对代码进行仿真,TestBench 中只要送出时钟的复位信号即可。写满后转为读的仿真波形图如下图所示:

由波形图可知,当写满255 个数据后,fifo_full 满信号就会拉高。经过延时之后,fifo_rd_en 写使能信号拉高,经过一拍之后就开始将fifo 中的数据送到fifo_dout 端口上。写满后转为读的仿真波形图如下图所示:

由波形图可知,当读完255 个数据后,fifo_empty 空信号就会拉高。经过延时之后,fifo_wr_en 写使能信号拉高,经过一拍之后就开始向fifo 中继续写入数据。

FPGA学习笔记-IP核-FIFO相关推荐

  1. FPGA学习笔记_ROM核调用与调试

    FPGA学习笔记 ROM核调用与调试 1. ROM存储器IP核的使用 2. 创建.mif文件 3. In system memory content editor内存查看工具的使用 4. Signal ...

  2. ZYNQ之FPGA学习----RAM IP核使用实验

    1 RAM IP核介绍 RAM 的英文全称是 Random Access Memory, 即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度 ...

  3. FPGA学习---3.IP核使用,Counter IP核

    三 LPM--counter IP核使用 小结:counter(IP核)cin进位输入,clock时钟信号,cout进位输出,q当前计数值 FPGA设计方式 调用IP核 路径放到prj的ip文件夹下 ...

  4. FPGA学习笔记(十二)IP核之FIFO的学习总结

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  5. Altera FPGA 储存单元IP核之RAM、FIFO

    一.储存单元简介 1.ROM 只读存储器,系统上电后数据就被写入ROM,运行过程中只能从ROM中读取数据,而不能改变ROM中的数值. 2.RAM 随机存取储存器,可以随时把数据写入任一指定地址的储存单 ...

  6. FPGA学习笔记(七): DSB调制解调的仿真

    笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...

  7. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

  8. FPGA学习笔记(八):ASK调制解调的仿真

    笔记八是ASK调制解调的仿真实现. ASK调制解调的实现原理:首先使用MATLAB产生存储基带波形的coe文件,再让ROM读取coe文件输出基带波形,然后DDS产生正弦波信号作为载波信号,接下来使用乘 ...

  9. FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  10. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇尾

    FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一 FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇二 ...

最新文章

  1. 图像处理库(fbc_cv):源自OpenCV代码提取
  2. access汇总含义_2020最新大厂内部 PHP 高级工程师面试题汇总(二)
  3. 陌陌开源合规审计平台 Bombus
  4. 精通android布局,Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件...
  5. centos7中每天定时备份mysql数据库
  6. 信息学奥赛一本通 1101:不定方程求解 | OpenJudge NOI 2.1 7650 | 小学奥数 7650
  7. c语言:猴子吃桃问题
  8. Java 后端MD5加密
  9. mysql把字段拆成两个_MySQL数据库中,将一个字段的值分割成多条数据显示
  10. jmeter监控服务器的方法
  11. 系统架构变迁——个人成长路线
  12. 中兴B860AV2.1刷Armbian折腾记录
  13. ubuntu磁盘格式化
  14. 400多个JavaScript特效大全
  15. 微信分享代码申请key教程
  16. Spring的AOP与IOC原理
  17. win7扫描仪在计算机,怎么在win7我的电脑里显示hp1005扫描仪图标
  18. CentOS7下的网络设定方法
  19. 斯坦福SCI论文写作课笔记(一)
  20. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

热门文章

  1. Linux——常用工具
  2. 程序员必学电脑计算机专业英语词汇 12 (153 单词)(完)
  3. windows10如何卸载edge浏览器 1809版本
  4. 指挥系统核心服务器,应急指挥中心指挥调度系统解决方案(一)
  5. adb 黑域app_黑域ADB报错解决方法
  6. Junit5 以及与Spring boot整合
  7. 永远不合规的Android应用隐私政策-Andrid开发者的吐槽
  8. 中国省市区列表MySQLl数据库脚本
  9. SQL中的内连接查询和外连接查询
  10. ESP8266 WIFI模块学习之路(9)——C++实现通过电脑串口读取ESP8266数据