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

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

3天内不再提示

XILINX FPGA IP之FIFO Generator例化仿真

CHANBAEK 来源: FPGA自学笔记分享 作者: FPGA自学笔记分享 2023-09-07 18:31 次阅读

上文XILINX FPGA IP之FIFO对XILINX FIFO Generator IP的特性和内部处理流程进行了简要的说明,本文通过实际例子对该IP的使用进行进一步的说明。本例子例化一个读数据位宽是写数据位宽两倍的FIFO,然后使用读时钟频率:写时钟频率=2:3,进行简单的FIFO跨时钟域操作。

首先了解一下FIFO读写位宽不一致时数据的摆放方式:

读数据位宽是写数据位宽的4倍的情况下的写如何读出数据摆放方式如下:

图片

写数据位宽是读数据位宽的4倍的情况下的写如何读出数据摆放方式如下:

图片

然后,开始例化IP,生成一个FIFO,使用BRAM搭建,两个独立时钟:

图片

写位宽18bit,读位宽36bit,读写数据位宽比为1:2.

图片

例化的总结为:

图片

例化的端口为:

//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
fifo_generator_0 your_instance_name (
  .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 [17 : 0] din
  .wr_en(wr_en),                  // input wire wr_en
  .rd_en(rd_en),                  // input wire rd_en
  .dout(dout),                    // output wire [35 : 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
  .rd_data_count(rd_data_count),  // output wire [7 : 0] rd_data_count
  .wr_data_count(wr_data_count),  // output wire [8 : 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
);

根据这个端口,编写tb,如下。设置读写时钟频率比为2:3。写侧:复位释放后,即拉高写使能,写入自加数,直到1000后停止写入。读侧:只要非空就开始一直读取数据。

// ============================================================
// File Name: tb_fifo_generator
// VERSION  : V1.0
// DATA     : 2023/7/23
// Author   : FPGA干货分享
// ============================================================
// 功能:xilinx fifo_generator ip 代码仿真
// delay : 
// ============================================================




`timescale 1ns/100ps
module tb_fifo_generator ;


reg                 rst              ='d1  ;
reg                 wr_clk           ='d1  ;
reg                 rd_clk           ='d1  ;
reg      [17 : 0]   din              ='d1  ;
reg                 wr_en            ='d0  ;
reg                 rd_en            ='d0  ;
wire     [35 : 0]   dout               ;
wire                full               ;
wire                almost_full        ;
wire                empty              ;
wire                almost_empty       ;
wire [7 : 0]        rd_data_count      ;
wire [8 : 0]        wr_data_count      ;
wire                wr_rst_busy        ;
wire                rd_rst_busy        ;


initial
    begin
        rst = 1'b1;
        #1000;
        rst = 1'b0;
    end


always #2 wr_clk = ~wr_clk;
always #3 rd_clk = ~rd_clk;


// ==================wr_clk======================//


always @(posedge wr_clk )
    if(din >= 'd1000)
        wr_en <= 1'b0;
    else if(~wr_rst_busy&&~rst)
        wr_en <= 1'b1;
    else
        wr_en <= 1'b0;


always @(posedge wr_clk)
    if(wr_en)
        din <= din + 1'b1;
    else
        din <= din;


// ==================rd_clk======================//
always @(posedge rd_clk)
    rd_en <= (!empty)&&(!rd_rst_busy);








//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
fifo_generator_0 fifo_generator_0 (    
  .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 [17 : 0] din
  .wr_en            (wr_en          ), // input wire wr_en
  .rd_en            (rd_en          ), // input wire rd_en
  .dout             (dout           ), // output wire [35 : 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
  .rd_data_count    (rd_data_count  ), // output wire [7 : 0] rd_data_count
  .wr_data_count    (wr_data_count  ), // output wire [8 : 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

仿真结果如下:

图片

图片

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

    关注

    1629

    文章

    21735

    浏览量

    603136
  • Xilinx
    +关注

    关注

    71

    文章

    2167

    浏览量

    121353
  • 仿真
    +关注

    关注

    50

    文章

    4080

    浏览量

    133578
  • fifo
    +关注

    关注

    3

    文章

    388

    浏览量

    43662
  • 时钟域
    +关注

    关注

    0

    文章

    52

    浏览量

    9535
收藏 人收藏

    评论

    相关推荐

    Xilinx FPGA IPBlock Memory Generator功能概述

    Xilinx Block Memory Generator(BMG)是一个先进的内存构造器,它使用Xilinx fpga中的嵌入式块RAM资源生成面积和 性能优化的内存。
    的头像 发表于 11-14 17:49 2760次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>Block Memory <b class='flag-5'>Generator</b>功能概述

    Xilinx FPGA IPBlock Memory Generator仿真

    上文对BMG ip的基本情况进行了简单的描述,本文通过仿真来实际使用功能一下这个IP
    的头像 发表于 11-14 18:24 1791次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>Block Memory <b class='flag-5'>Generator</b><b class='flag-5'>仿真</b>

    XILINX FPGA IPAXI Traffic Generator

    AXI Traffic Generator IP 用于在AXI4和AXI4-Stream互连以及其他AXI4系统外设上生成特定序列(流量)。它根据IP的编程和选择的操作模式生成各种类型的AXI事务。是一个比较好用的AXI4协议测
    的头像 发表于 11-23 16:03 2579次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>AXI Traffic <b class='flag-5'>Generator</b>

    Xilinx FPGA无痛入门,海量教程免费下载

    入门指南 -- FPGA片内FIFO实例FIFO配置Lesson55 特权Xilinx FPGA
    发表于 07-22 11:49

    Xilinx FPGA入门连载51:FPGA片内FIFO实例之功能概述

    实例内部系统功能框图如图所示。我们通过IP一个FIFO,定时写入数据,然后再读出所有数据。通过ISE集成的在线逻辑分析仪chipscope,我们可以观察
    发表于 02-26 10:26

    Xilinx FPGA入门连载52:FPGA片内FIFO实例FIFO配置

    Xilinx FPGA入门连载52:FPGA片内FIFO实例FIFO配置特权同学,版权所有配套
    发表于 02-29 13:35

    Xilinx FPGA入门连载52:FPGA片内FIFO实例FIFO配置

    Xilinx FPGA入门连载52:FPGA片内FIFO实例FIFO配置特权同学,版权所有配套
    发表于 02-29 13:35

    Xilinx FPGA入门连载56:FPGA片内异步FIFO实例FIFO配置

    `Xilinx FPGA入门连载56:FPGA片内异步FIFO实例FIFO配置特权同学,版权所
    发表于 03-09 10:49

    FPGA连载62:电子点菜单FIFO说明

    `FPGA连载62:电子点菜单FIFO说明特权同学,版权所有配套例程和更多资料下载链接
    发表于 12-26 17:22

    【正点原子FPGA连载】第十三章IPFIFO实验-领航者ZYNQFPGA开发指南

    图所示。图 13.4.12 “fifo_generator _0_synth_1”run在其Out-of-Context综合的过程中,我们就可以进行RTL编码了。首先打开IP核的
    发表于 09-23 17:27

    FPGA零基础学习:IP CORE FIFO设计

    ,点击Yes。 · 顶层设计顶层负责调用fifo_my,文件在ip core -> fifo_my ->
    发表于 03-15 16:19

    利用XILINX提供的FIFO IP进行读写测试

    FIFOFPGA应用当中非常重要的模块,广泛用于数据的缓存,跨时钟域数据处理等。学好FIFOFPGA的关键,灵活运用好FIFO是一个
    的头像 发表于 02-08 17:08 3139次阅读
    利用<b class='flag-5'>XILINX</b>提供的<b class='flag-5'>FIFO</b> <b class='flag-5'>IP</b>进行读写测试

    XILINX FPGA IPDDS Compiler_ip仿真

    之前的文章对dds ip 的结构、精度、参数、接口进行了详细的说明,本文通过仿真对该IP的实际使用进行演示。本文
    的头像 发表于 09-07 18:31 2265次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>DDS Compiler_<b class='flag-5'>ip</b><b class='flag-5'>例</b><b class='flag-5'>化</b><b class='flag-5'>仿真</b>

    XILINX FPGA IPFIFO Generator

    在数字设计中,fifo是数据操作任务所需的普遍结构,如跨时钟域、低延迟内存缓冲和总线宽度转换。
    的头像 发表于 09-07 18:31 1274次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b><b class='flag-5'>FIFO</b> <b class='flag-5'>Generator</b>

    FIFO GeneratorXilinx官方手册

    FIFO作为FPGA岗位求职过程中最常被问到的基础知识点,也是项目中最常被使用到的IP,其意义是非常重要的。本文基于对FIFO Generator
    的头像 发表于 11-12 10:46 377次阅读
    <b class='flag-5'>FIFO</b> <b class='flag-5'>Generator</b>的<b class='flag-5'>Xilinx</b>官方手册