Xilinx FIFO使用小结
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使用小结相关推荐
- (42)Xilinx FIFO IP核配置(三)(第9天)
(42)Xilinx FIFO IP核配置(三)(第9天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx FIFO IP核配置(三)(第9天) 5) ...
- Xilinx fifo研究总结
最近数据缓存方面用到了较多的fifo,发现Xilinx的fifo的depth.rdcnt.full flag等参数的时序会因为fifo的种类(standard or fwft).时钟(dc or si ...
- xilinx FIFO
1.FIFO复位问题 摘自<FIFO Generator v9.3 PG057 December 18, 2012 >P126
- Xilinx FIFO IP核使用
0 文章目录 1)FIFO简介 2)FIFO接口说明 3)FIFO IP定制 4)FIFO IP参数说明 5)FIFO IP仿真 6)FIFO使用经验 6)结束语 1 FIFO简介 1)FIFO是英文 ...
- 异步FIFO实验小结
目录 写在前面 一.概述 1. 异步/同步FIFO 2. 异步fifo的特点 3. 异步fifo设计结构图 4. FIFO的常见参数 5. 异步fifo空/满判断 6.指针计数器的选择 7. 格雷码/ ...
- Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输
Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输 一.Xilinx FIFO IP核介绍 二.UPP 仿真效果 总结 一.Xilinx FIFO IP核介绍 1. 因 ...
- Modelsim se仿真Xilinx IPcore
Modelsim se仿真Xilinx IPcore 方法:先写好do文件常规框架,根据modelsim报错再添加ise IP核库仿真文件.注:记得添加并仿真glbl.v全局控制仿真文件到sim/is ...
- FIFO读rd写wr控制信号处理方式的简单理解-FPGA学习笔记(五)
文章目录 1.1 分类: 1.2 FIFO阻塞 1.3 FIFO读操作处理方式 1.4 Xilinx FIFO generator IP复位释放方式 1.5 读写小tips 参考文档 FIFO在FPG ...
- IP核的使用之FIFO(Vivado)
IP核的使用之FIFO(Vivado) 文章目录 IP核的使用之FIFO(Vivado) 一.引言 二.FIFO IP核及相关内容扫盲 1.FIFO 简介 2.FIFO 结构 3.FIFO 应用场景 ...
最新文章
- Debian和CentOS主流系统按包含文件名称搜索软件包
- redis常用数据结构解析
- zabbix mysql.status_Zabbix 监控 Mysql 状态
- 如何将lnmp 0.5里面的php5.2.14升级到php 5.3.3???
- txt 开关 csv 可通用 工具
- 华硕笔记本电池0%充不进电_华硕笔记本电池0%充不进电
- office精英俱乐部_开放组织读书俱乐部:收回精英制
- html容器自定义宽高比,容器长宽比_aspect-ratio, 宽高比, 会员专栏 教程_W3cplus
- 有哪些图片转excel表格的软件?
- nginx 之 http 转 https (两种方式)
- 【机器学习】逻辑回归(LogisticRegression)原理与实战
- golang中获取字符串长度的办法
- Android Webrtc使用Wifi Direct无法建立P2P连接
- Nacos源码之一-配置自动更新(重写)
- 前端企业微信开发内嵌H5记录
- 面试分享:17道Python面试题,让你在求职中无往不利
- Xcode Cloud 是什么
- 网页自动下载文件并汇总 (VBA)
- Parse 使用教程之一
- 电脑端微信多开方法,亲测有效
热门文章
- 淘宝/天猫获得淘宝店铺详情 API接口及 返回值说明
- 用表格做出的阴影扇形图
- java.util.concurrent FutureTask
- 英文诗歌 学习 月是故乡明
- opendrive网盘 一个能免费直接外链的网盘
- 520浪漫代码流星雨
- 阿里云轻量应用服务器开启minecraft基岩版服务器(bedrock)
- 智慧物联下主机加固安全解决方案分析
- 计算机如果添加新用户名,怎么在电脑中创建新用户
- attempt_load() got an unexpected keyword argument ‘map_location‘