0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:FPGA开发备忘录 作者:小创 2023-04-25 15:55 次阅读

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 / 1ps
module 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;
end


initial begin
  m_axis_tready = 1'b0;
  #340
  m_axis_tready= 1'b1;
end
always #10 s_aclk = ~s_aclk;
always #5 m_aclk = ~m_aclk;


always @(posedge s_aclk) begin
  s_axis_tdata = s_axis_tdata +1'b1;
end


design_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

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA设计
    +关注

    关注

    9

    文章

    428

    浏览量

    26463
  • 存储器
    +关注

    关注

    38

    文章

    7425

    浏览量

    163505
  • FIFO存储
    +关注

    关注

    0

    文章

    103

    浏览量

    5955
  • 时钟源
    +关注

    关注

    0

    文章

    92

    浏览量

    15918
收藏 人收藏

    评论

    相关推荐

    Efinity FIFO IP仿真问题 -v1

    Efinity目前不支持联合仿真,只能通过调用源文件仿真。 我们生成一个fifo IP命名为fifo_sim 在Deliverables中保留Testbench的选项。 在IP的生成目
    的头像 发表于 10-21 11:41 768次阅读
    Efinity <b class='flag-5'>FIFO</b> IP<b class='flag-5'>仿真</b>问题 -v1

    异步FIFO结构及FPGA设计

    首先介绍异步FIFO 的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法; 在传统设计的基础上提出一种新颖的电路结构并对其
    发表于 04-16 09:25 46次下载

    基于LPM的高速FIFO的设计

    利用参数可设置模块库(LPM)中的兆功能模块,根据实际系统的需要,对其参数进行必要的调整设置,介绍了一个高速FIFO 存储器的设计方法和步骤,给出了仿真结果,方便实用。
    发表于 09-02 09:33 26次下载

    异步FIFO结构

    设计一个FIFO是ASIC设计者遇到的最普遍的问题之一。本文着重介绍怎样设计FIFO——这是一个看似简单却很复杂的任务。一开始,要注意,FIFO通常用于时钟域的过渡,是双时钟设计
    发表于 10-15 08:44 94次下载

    高速异步FIFO的设计与实现

    本文主要研究了用FPGA 芯片内部的EBRSRAM 来实现异步FIFO 设计方案,重点阐述了异步FIFO 的标志信号——空/满状态的设计思路,并且用VHDL 语言实现,最后进行了仿真验证。
    发表于 01-13 17:11 40次下载

    异步FIFO结构及FPGA设计

    摘要:首先介绍异步FIFO的概念、应用及其结构,然后分析实现异步FIFO的难点问题及其解决办法;在传统设计的基础上提出一种新颖的电路结构并对
    发表于 06-20 12:46 3841次阅读
    异步<b class='flag-5'>FIFO</b>结构及FPGA设计

    嵌入式 FIFO 数据传输系统设计

    本文以dMAX和EMIF接口的数据传输为例,介绍嵌入式FIFO的设计、配置及其使用。
    发表于 06-23 17:19 1197次阅读
    嵌入式 <b class='flag-5'>FIFO</b> 数据传输系统设计

    SVPWM原理及其Simulink仿真

    SVPWM原理及其Simulink仿真
    发表于 04-15 17:49 71次下载

    基于FLASH的FIFO读写

    基于FLASH的FIFO读写,介绍的比较详细,值得一读。
    发表于 04-28 10:30 22次下载

    LED照明节电装置的技术要求及其应用条件介绍

    本文介绍了照明节电装置及其应用技术的条件分析。
    发表于 10-23 16:54 2次下载
    LED照明节电装置的技术要求<b class='flag-5'>及其</b>应用<b class='flag-5'>条件</b>的<b class='flag-5'>介绍</b>

    以太网基础介绍:MAC地址,FIFO, DMA

    介绍了STM32中以太网外设的特性:MAC地址,FIFO, DMA
    的头像 发表于 07-03 05:04 7678次阅读

    系统仿真及其Matlab实现

    系统仿真及其Matlab的实现方法介绍
    发表于 06-17 17:13 27次下载

    FIFO的使用介绍

    FIFO的使用非常广泛,一般用于不同时钟域之间的数据传输,或者用于不同数据宽度之间的数据匹配。在实际的工程应用,可以根据需要自己写FIFO。不考虑资源的情况下,也可以使用Xilinx提供的IP核来完成。
    的头像 发表于 08-14 10:49 5026次阅读

    同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用

    同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用? 1. 同步FIFO和异步
    的头像 发表于 10-18 15:23 1606次阅读

    同步FIFO和异步FIFO区别介绍

    1. FIFO简介 FIFO是一种先进先出数据缓存器,它与普通存储器的区别是没有外部读写地址线,使用起来非常简单,缺点是只能顺序读写,而不能随机读写。 2. 使用场景 数据缓冲:也就是数据写入过快
    的头像 发表于 06-04 14:27 1192次阅读
    同步<b class='flag-5'>FIFO</b>和异步<b class='flag-5'>FIFO</b>区别<b class='flag-5'>介绍</b>