FIFO的使用非常广泛,一般用于不同时钟域之间的数据传输,或者用于不同数据宽度之间的数据匹配。在实际的工程应用,可以根据需要自己写FIFO。不考虑资源的情况下,也可以使用Xilinx提供的IP核来完成。
接口类型选择Native,SOC芯片上也可以根据需要选择AXI接口。

选择存储器类型:可以用块RAM、分布式RAM,移位寄存器和内嵌FIFO来实现FIFO。这里主要是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(Builtin FIFO)在5以上的FPGA芯片中才存在。
时钟:读写操作是否在相同的时钟域中完成。如果是,可以选择Common clock,否则,选择Independent clcoks。
读模式有两种选择,一般选择标准模式,First-Word Fall-Fhrough模式为首字预现,FWFT是指在不影响FIFO读操作的情况下,提前查看下一个数据的能力。即FIFO中不为空,有可用的数据时,FIFO中的第一个数据自动出现在输出总线DOUT上。
Synchronization Stage:穿过交叉时钟域的同步状态(寄存器)数量,默认即可。

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

该FIFO数据深度为16,从aabb0002到aabb0011共写入16个数据,当写入到第15个时,FULL信号拉高,数据不能被有效的写入,从读状态可以看出。当读写数据位宽不匹配时,写入的位宽大于读出的数据位宽,则先从高位开始读;当写入的数据位宽小于读出时,先写入的数据在读数据的高位,如下:

关于FIFO复位,Xilinx FIFO默认为高电平复位,在Initialization 中可以设置复位信号到来之后,full、almost full、prog full等信号的复位值为0,或者为1。可以设置读写同步复位,或者异步复位。fifo的复位需要一段时间,期间wr_rst_busy和rd_rst_busy信号为高电平,此时应禁止读写FIFO,否则会造成数据丢失。

关于读写计数,读计数是和读时钟同步的,写计数是和写时钟同步的。读计数是以读数据宽度为单位,fifo中存在的数据个数;写计数是以写数据宽度为单位,fifo中存在的数据个数,这两个值的结果,简单理解就是fifo内部控制器读写地址的差,由于fifo读写时钟可能异步,读写时钟频率不同,导致计算读写计数值时存在延迟,并不完全和读写操作同步。

读写计数仿真结果如下:

关于读写使能,写使能wr_en为高时,数据立即被写入到fifo中,读使能为高时,下一个时钟周期,有效数据才会出现在数据总线dout上。

一段简单的仿真如下:

`timescale 1ns / 1ps

module tb_fifo_16x256();
reg                rst;
reg                wr_clk;
reg                rd_clk;
reg   [31:0]       din;
reg                wr_en;
reg                rd_en;
wire  [15:0]       dout;
wire               full;
wire               empty;
wire               valid;
wire               almost_full;
wire               almost_empty;
wire  [4:0]        rd_data_count;
wire  [3:0]        wr_data_count;
wire               wr_rst_busy;
wire               rd_rst_busy;always #10  wr_clk <= ~wr_clk;
always #5   rd_clk <= ~rd_clk;initial beginrst <= 1;wr_clk <= 0;rd_clk <= 1;din <= 32'haabb0001 ;wr_en <= 0;rd_en  <= 0;#20;rst <= 0;#300;
//======================================================empty   repeat(16) @(posedge wr_clk)begindin <= din + 1;wr_en <= 1;endrepeat(1) @(posedge wr_clk) wr_en <= 0;   repeat(32) @(posedge rd_clk)beginrd_en <= 1;      endrepeat(1) @(posedge rd_clk) rd_en <= 0;//=======================================================full  repeat(16) @(posedge wr_clk)begindin  <= din + 1;wr_en <= 1;endrepeat(1) @(posedge wr_clk) wr_en <= 0;
endinitial begin
#900;repeat(32) @(posedge rd_clk)beginrd_en <= 1;      endrepeat(1) @(posedge rd_clk) rd_en <= 0;
end fifo_16x256 fifo_16x256_inst (.rst(rst),                      // input wire rst.wr_clk(wr_clk),                // input wire wr_clk.rd_clk(rd_clk),                // input wire rd_clk.din(din),                      // input wire [31 : 0] din.wr_en(wr_en),                  // input wire wr_en.rd_en(rd_en),                  // input wire rd_en.dout(dout),                    // output wire [15 : 0] dout.full(full),                    // output wire full.almost_full(almost_full),      // output wire almost_full.empty(empty),                  // output wire empty.almost_empty(almost_empty),    // output wire almost_empty.valid(valid),                  // output wire valid.rd_data_count(rd_data_count),  // output wire [8 : 0] rd_data_count.wr_data_count(wr_data_count),  // output wire [7 : 0] wr_data_count.wr_rst_busy(wr_rst_busy),      // output wire wr_rst_busy.rd_rst_busy(rd_rst_busy)      // output wire rd_rst_busy
);endmodule

Xilinx FIFO使用小结相关推荐

  1. (42)Xilinx FIFO IP核配置(三)(第9天)

    (42)Xilinx FIFO IP核配置(三)(第9天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx FIFO IP核配置(三)(第9天) 5) ...

  2. Xilinx fifo研究总结

    最近数据缓存方面用到了较多的fifo,发现Xilinx的fifo的depth.rdcnt.full flag等参数的时序会因为fifo的种类(standard or fwft).时钟(dc or si ...

  3. xilinx FIFO

    1.FIFO复位问题 摘自<FIFO Generator v9.3  PG057 December 18, 2012 >P126

  4. Xilinx FIFO IP核使用

    0 文章目录 1)FIFO简介 2)FIFO接口说明 3)FIFO IP定制 4)FIFO IP参数说明 5)FIFO IP仿真 6)FIFO使用经验 6)结束语 1 FIFO简介 1)FIFO是英文 ...

  5. 异步FIFO实验小结

    目录 写在前面 一.概述 1. 异步/同步FIFO 2. 异步fifo的特点 3. 异步fifo设计结构图 4. FIFO的常见参数 5. 异步fifo空/满判断 6.指针计数器的选择 7. 格雷码/ ...

  6. Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输

    Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输 一.Xilinx FIFO IP核介绍 二.UPP 仿真效果 总结 一.Xilinx FIFO IP核介绍 1. 因 ...

  7. Modelsim se仿真Xilinx IPcore

    Modelsim se仿真Xilinx IPcore 方法:先写好do文件常规框架,根据modelsim报错再添加ise IP核库仿真文件.注:记得添加并仿真glbl.v全局控制仿真文件到sim/is ...

  8. FIFO读rd写wr控制信号处理方式的简单理解-FPGA学习笔记(五)

    文章目录 1.1 分类: 1.2 FIFO阻塞 1.3 FIFO读操作处理方式 1.4 Xilinx FIFO generator IP复位释放方式 1.5 读写小tips 参考文档 FIFO在FPG ...

  9. IP核的使用之FIFO(Vivado)

    IP核的使用之FIFO(Vivado) 文章目录 IP核的使用之FIFO(Vivado) 一.引言 二.FIFO IP核及相关内容扫盲 1.FIFO 简介 2.FIFO 结构 3.FIFO 应用场景 ...

最新文章

  1. Debian和CentOS主流系统按包含文件名称搜索软件包
  2. redis常用数据结构解析
  3. zabbix mysql.status_Zabbix 监控 Mysql 状态
  4. 如何将lnmp 0.5里面的php5.2.14升级到php 5.3.3???
  5. txt 开关 csv 可通用 工具
  6. 华硕笔记本电池0%充不进电_华硕笔记本电池0%充不进电
  7. office精英俱乐部_开放组织读书俱乐部:收回精英制
  8. html容器自定义宽高比,容器长宽比_aspect-ratio, 宽高比, 会员专栏 教程_W3cplus
  9. 有哪些图片转excel表格的软件?
  10. nginx 之 http 转 https (两种方式)
  11. 【机器学习】逻辑回归(LogisticRegression)原理与实战
  12. golang中获取字符串长度的办法
  13. Android Webrtc使用Wifi Direct无法建立P2P连接
  14. Nacos源码之一-配置自动更新(重写)
  15. 前端企业微信开发内嵌H5记录
  16. 面试分享:17道Python面试题,让你在求职中无往不利
  17. Xcode Cloud 是什么
  18. 网页自动下载文件并汇总 (VBA)
  19. Parse 使用教程之一
  20. 电脑端微信多开方法,亲测有效

热门文章

  1. 淘宝/天猫获得淘宝店铺详情 API接口及 返回值说明
  2. 用表格做出的阴影扇形图
  3. java.util.concurrent FutureTask
  4. 英文诗歌 学习 月是故乡明
  5. opendrive网盘 一个能免费直接外链的网盘
  6. 520浪漫代码流星雨
  7. 阿里云轻量应用服务器开启minecraft基岩版服务器(bedrock)
  8. 智慧物联下主机加固安全解决方案分析
  9. 计算机如果添加新用户名,怎么在电脑中创建新用户
  10. attempt_load() got an unexpected keyword argument ‘map_location‘