FIFO使用及其各条件仿真介绍

1
定义
fifo(first in first out )先入先出存储器,在fpg设计中常用于跨时钟域的处理,fifo可简单分为同步fifo和异步fifo。同步fifo可理解为读写时钟同源且频率相同的fifo,异步fifo为读写时钟不同源,时钟频率不一样的fifo。
2
同步fifo的仿真
该仿真基于xilinx的fifo generator13.2进行设计,ip core的配置如下。
由图所示,时钟模式配置为common clock,fifo深度为16,fifo数据位宽为36bit,其中32bit为数据位宽,4bit为用户自定义比特tuser。下图为fifo例化的ipcore。
理论情况下fifo的数据传输时序如下
当复位拉高后,fifo模块若没有满,s_axis_tready信号会拉高,然后用户将s_axis_valid信号拉高就可以向fifo里面写入有效的数据了,这就发起了写操作;此时在主端口用户可将m_axis_tready拉高,fifo若不为空,则m_tvalid信号会拉高,此时就可以源源不断的从fifo里读出数据了,这就发起了读操作。
下面讨论下在同步fifo中的两种情况
2.1 读写时钟为100m,m_axis_tready在m_axis_tvaild后,此时的仿真图如下所示。
由上图所示,在用户侧还未将m_axis_tready拉高之前,valid到来后,fifo输出的数据就不为0了,而是fifo中存入的第一个数据,一直到用户将m_axis_tready拉高,才会输出fifo里的下一个数据。所以并不是我们理解的,只有用户发起fifo读,fifo才会输出数据。
2.2 读写时钟为100m,m_axis_tready在m_axis_tvaild前,此时的仿真图如下所示。
由上图所示,在fifo的valid数据到来之前,我们先将tready拉高,这样就不会在读操作之前fifo就吐出数据了。在做设计时,将复位拉高后,随即将tready拉高即可。
3
** 异步fifo的仿真**
做异步fifo时,ipcore的配置如下图所示
时钟模式配置为independent clock,fifo深度为16,fifo数据位宽为36bit,其中32bit为数据位宽,4bit为用户自定义比特tuser。
理论情况下fifo的数据传输时序如下
由上图所示,读速率是写速率的1/2,因此写不是连续的,读速率是连续的。下面分几个情况进行讨论。
3.1 写为100m读为30.3m,m_trady在m_tvaild前
由上图所示,写数据也不连续,s_tready为周期性有效,切换周期和读时钟周期一样,其中高电平时间为一个写数据时钟周期。
3.2 写为50m读为100m,m_trady在m_tvaild前
由上图所示,此时读数据不连续,m_tvalid为周期性有效,切换周期和写时钟周期一样,其中高电平时间为一个读数据时钟周期。
4
对不同深度配置进行讨论
4.1当fifo深度为16时
由上图可知,若读数据不及时,比较滞后,则fifo可以存入15个数据,当fifo满后,s_axis_tready拉低,不能继续写fifo,当读操作开始时,fifo将从存入的第一个数据依次输出。
4.2 当fifo为32时
由上图可知,若读数据不及时,比较滞后,则fifo可以存入33个数据,当fifo满后,s_axis_tready拉低,不能继续写fifo,当读操作开始时,fifo将从存入的第一个数据依次输出。
5
在仿真时遇到的问题
在仿真时提示说t_user管脚找不到,但打开代码和block_design看了下,该端口是存在的,后面把block_design删掉,重新例化新模块后,问题解决,目前不知道是什么问题导致。
6
激励文件
`timescale 1ns / 1psmodule tb_fifo( );reg [31:0] s_axis_tdata ; wire s_axis_tready;reg s_axis_tvalid;reg [3:0] s_axis_tuser ; reg m_aclk ; reg s_aclk ; reg s_aresetn ; wire [31:0] m_axis_tdata ; reg m_axis_tready;wire m_axis_tvalid;wire [3:0] m_axis_tuser ;initial begin s_aresetn = 1'b0; s_axis_tdata = 32'h0000_0001; s_axis_tvalid = 1'b0; m_aclk =1'b1; s_aclk =1'b1; s_axis_tuser = 4'b1010; #50 s_aresetn = 1'b1; #10 s_axis_tvalid = 1'b1;endinitial begin m_axis_tready = 1'b0; #340 m_axis_tready= 1'b1;endalways #10 s_aclk = ~s_aclk;always #5 m_aclk = ~m_aclk;always @(posedge s_aclk) begin s_axis_tdata = s_axis_tdata +1'b1;enddesign_1_wrapper tb_design_fifo_wrapper ( .s_axis_0_tdata (s_axis_tdata ), .s_axis_0_tready(s_axis_tready), .s_axis_0_tvalid(s_axis_tvalid), .s_axis_0_tuser (s_axis_tuser ), .m_aclk_0 (m_aclk ), .s_aclk_0 (s_aclk ), .s_aresetn_0 (s_aresetn ), .m_axis_0_tdata (m_axis_tdata ), .m_axis_0_tready(m_axis_tready), .m_axis_0_tvalid(m_axis_tvalid), .m_axis_0_tuser (m_axis_tuser));endmodule

PCB行业产业链详细分析和前三大领域的应用情况
rfid标签怎样制作成嵌入式的温度检测系统
张一山、戚薇等众明星齐站台,OPPO这一波预热你得服
深度学习破解DNA数据复制难题
GAIN在PID调节和音响上表示的意思
FIFO使用及其各条件仿真介绍
德索LVDS连接器对性能的要求
深度学习遇上物理学,更好地识别粒子和分析数据
国芯思辰|拍字节新型3D铁电存储器(VFRAM)PB85RS128C在车身控制器上的应用,内存达128K,支持SPI接口输出
nubiaZ9拆解 这才是无边框手机真正的价值所在
IPv6的4大优势
中国城市竞争力蓝皮书
单轴MEMS角速率陀螺及三轴MEMS角速率陀螺
通过哪三个方面对动力电池测试进行了解
碳化硅推动电动汽车快速充电器的成本和性能优势
微克科技:坚持自主技术创新 聚焦穿戴核心科技
【数据库数据恢复】MS SQL数据库提示“附加数据库错误 823”如何恢复数据?
南京云栖大会九所江苏高校与阿里云合作
高精度GNSS定位定向模组M20D实现无人配送车导航定位的原理
电子学在医学应用中的制约有什么?