【FPGA】 Vivado FIFO IP核使用教程

这篇具有很好参考价值的文章主要介绍了【FPGA】 Vivado FIFO IP核使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、FIFO简介

二、FIFO的应用

三、Vivado FIFO创建

四、FIFO IP核实例化

五、对实例化顶层文件仿真

一、FIFO简介

       FIFO 的英文全称是 First In First Out ,即先进先出 FPGA 使用的 FIFO 一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互,也即所谓的跨时钟域信号传递。它与 FPGA 内部的 RAM ROM 的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,使用起来简单方便,由此带来的缺点就是不能像 RAM 和 ROM 那样可以由地址线决定读取或写入某个指定的地址。
       FIFO 从输入时钟的角度来分,有两种类型: 单时钟 FIFO和双时钟 FIFO;单时钟 FIFO 具有一个独立的时钟端口 clock,因此,所有的输入输出信号都同步于 clock 信号。双时钟 FIFO 结构中,写端口 和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟 wr_clk,所有与读相关 的信号都是同步于读时钟 rd_clk。

二、FIFO的应用

1. 单时钟 FIFO 常用于同步时钟的数据缓存;
2. 双时钟 FIFO 常用于跨时钟域的数据信号的传递,例如时钟域 A 下的数据 data1 传递 给异步时钟域 B ,当 data1 为连续变化信号时,如果直接传递给时钟域 B 则可能会 导致收到的数据不是发送的数据的情况,即在采集过程中会出现包括亚稳态(数据采样失真)问题在内的一系列问题,使用双时钟 FIFO 能够将不同时钟域中的数据同步到所需的时钟域中

三、Vivado FIFO创建

1、新建工程后进入以下界面,点击IP Catalog,在右侧界面搜索fifo,找到FIFO Cenerator打开。

【FPGA】 Vivado FIFO IP核使用教程
2、在FIFO IP核配置界面,Component Name中可以更改命名,Fifo Impiementation中可以选择单时钟(Common Clock Block RAM)和双时钟(Independent Clocks Block RAM),这里我选择双时钟。

 【FPGA】 Vivado FIFO IP核使用教程

3、模式选择有标准模式和FWFT模式,标准模式中读取的数据滞后读信号一个时钟周期;FWFT模式中读信号有效时,读取的数据也立即有效。这里我选择标准模式,设置读写数据位宽为16,数据深度为512,根据需要自行设置。

【FPGA】 Vivado FIFO IP核使用教程

 4、读写计数界面,Write Data Count表示FIFO已经写入多少数据,Read Data Count表示FIFO中有多少数据可以读。点击“OK”,完成异步FIFO 配置。【FPGA】 Vivado FIFO IP核使用教程

四、FIFO IP核实例化

1、Sources里的fifo_ip.veo文件中是IP的例化模板。我们只需要将文件中内容复制粘贴到我们verilog程序中,对IP进行实例化。。【FPGA】 Vivado FIFO IP核使用教程

 2、我们在创建一个顶层设计文件来实例化这个FIFO IP, 编写pll_test.v代码如下。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/03/31 14:59:11
// Design Name: 
// Module Name: fifo_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module fifo_test(
    input wr_clk ,//写 FIFO 时钟
    input rd_clk ,//读 FIFO 时钟
    input rst_n ,//复位
    input [7:0] wr_din ,//写入 FIFO 的数据
    input wr_en ,//写使能
    input rd_en ,//读使能

    output reg [7:0] rd_dout,//从 FIFO 读出的数据
    output reg rd_out_vld    //从 FIFO 读出的数据有效指示信号
 );
    //信号定义
    wire [7:0] wr_data ;
    wire [7:0] q ;

    wire wr_req ;
    wire rd_req ;

    wire rd_empty ;
    wire wr_full ;

    wire [7:0] wrusedw ;
    wire [7:0] rdusedw ;
    //FIFO 例化
     fifo_ip your_instance_name (
  .wr_clk       (wr_clk     ),   // input wire wr_clk
  .rd_clk       (rd_clk     ),   // input wire rd_clk
  .din          (wr_data    ),   // input wire [15 : 0] din
  .wr_en        (wr_req     ),   // input wire wr_en
  .rd_en        (rd_req     ),   // input wire rd_en
  .dout         (q          ),   // output wire [15 : 0] dout
  .full         (wr_full    ),   // output wire full
  .empty        (rd_empty   ),   // output wire empty
  .rd_data_count(rdusedw    ),   // output wire [8 : 0] rd_data_count
  .wr_data_count(wrusedw    )    // output wire [8 : 0] wr_data_count
);
     assign wr_data = wr_din;//输入的数据
     assign wr_req = (wr_full  == 1'b0)?wr_en:1'b0;//非满才写
     assign rd_req = (rd_empty == 1'b0)?rd_en:1'b0;//非空才读
     always @(posedge rd_clk or negedge rst_n)begin
        if(!rst_n)begin
         rd_dout <= 0;
        end
         else begin
         rd_dout <= q;
        end
     end
     always @(posedge rd_clk or negedge rst_n)begin
        if(!rst_n)begin
            rd_out_vld <= 1'b0;
        end
        else begin
            rd_out_vld <= rd_req;
        end
     end
 endmodule

五、对实例化顶层文件仿真

1、我们在创建一个仿真激励文件来仿真这个fifo_test顶层文件, 编写fifo_test_tb.v代码如下。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/03/31 15:11:44
// Design Name: 
// Module Name: fifo_test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module fifo_test_tb();
//时钟和复位
    reg     wr_clk      ;
    reg     rd_clk      ;
    reg     rst_n       ;
//输入信号
    reg [7:0]    wr_din;
    reg          wr_en ;
    reg          rd_en ;
//输出信号
    wire        rd_out_vld  ;
    wire [7:0]  rd_dout     ;
    //参数定义
    parameter   WR_CYCLE    = 20;//写时钟周期,单位为 ns,
    parameter   RD_CYCLE    = 30;//读时钟周期,单位为 ns,
    parameter    RST_TIME   = 3 ;//复位时间,此时表示复位 3 个时钟周期的时间。
//待测试的模块例化
    fifo_test u_fifo_test(
    .wr_clk         (wr_clk  ),//时钟
    .rd_clk         (rd_clk  ),
    .rst_n          (rst_n   ),//复位
    .wr_din         (wr_din  ),//写入 FIFO 的数据
    .wr_en          (wr_en   ),//写使能
    .rd_en          (rd_en   ),//读使能
//输出信号定义
    .rd_dout        (rd_dout ),//从 FIFO 读出的数据
    .rd_out_vld     (rd_out_vld )//从 FIFO 读出的数据有效指示信号
);
    integer i = 0;
//生成本地时钟 50M
    initial wr_clk = 0;
    always #(WR_CYCLE/2) wr_clk=~wr_clk;
    initial rd_clk = 0;
    always #(RD_CYCLE/2) rd_clk=~rd_clk;
    //产生复位信号
    initial begin
    rst_n = 1;
    #2;
    rst_n = 0;
    #(WR_CYCLE*RST_TIME);
    rst_n = 1;
    end
    //输入信号赋值
    initial begin
    #1;
    //赋初值
    wr_din = 0;
    wr_en = 0;
    #(100*WR_CYCLE);
    //开始赋值
    for(i=0;i<500;i=i+1)begin
        wr_din = {$random};
        wr_en  = {$random};
    #(1*WR_CYCLE);
    end
    #(100*WR_CYCLE);
    end
    initial begin
    #1;
    //赋初值
        rd_en = 0;
        #(120*RD_CYCLE);
    //开始赋值
    for(i=0;i<500;i=i+1)begin
        rd_en = {$random};
        #(1*RD_CYCLE);
    end
        #(100*RD_CYCLE);
        $stop;
    end
    endmodule

2、仿真结果如下,输出rd_dout[7:0]的结果和输入wr_din[7:0]一致。

【FPGA】 Vivado FIFO IP核使用教程文章来源地址https://www.toymoban.com/news/detail-464359.html

到了这里,关于【FPGA】 Vivado FIFO IP核使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (四)零基础学懂FIFO——最详细的FIFO IP核应用教程

    此篇为专栏 《FPGA学习笔记》 的第四篇,记录我的学习FPGA的一些开发过程和心得感悟,刚接触FPGA的朋友们可以先去此专栏置顶 《FPGA零基础入门学习路线》来做最基础的扫盲。 本篇内容基于笔者实际开发过程和正点原子资料撰写,将会详细讲解此FPGA实验的全流程, 诚挚 地

    2024年02月03日
    浏览(53)
  • xilinx FPGA FIFO IP核的使用(VHDL&ISE)

    1.新建工程和ip核文件 下图显示了一个典型的写操作。拉高WR_EN,导致在WR_CLK的下一个上升边缘发生写入操作。因为FIFO未满,所以WR_ACK输出1,确认成功的写入操作。当只有一个附加的单词可以写入FIFO时,FIFO会拉高ALMOST_FULL标志。当ALMOST_FULL拉高之后,一个附加的写入将导致

    2024年02月03日
    浏览(54)
  • Vivado 下 IP核之FIFO 实验

    目录 Vivado 下 IP核之FIFO 实验 1、FIFO IP 核简介 2、实验任务 3、程序设计 3.1、FIFO IP 核配置 3.1.1、“Basic” 选项卡下各参数配置 3.1.2、“Native Ports”选项卡下各参数配置 3.1.3、“Status Flags” 选项卡下各参数配置 3.1.4、“Data Counts(数据计数)”选项卡下各参数配置 3.2、时序图讲

    2024年02月09日
    浏览(56)
  • vivado IP核:ILA、时钟、RAM、FIFO

    vivado工具集成了逻辑分析仪,ILA IP核用于替换外部的逻辑分析仪,添加探针来监控内部信号波形变化。 1)IP Catalog 2)搜索栏可搜索IP核,如创建FIFO、RAM等。 3)搜索并选择。 4)设置ILA各项参数。    5) 设置好IP核参数后点ok。 6)打开ila_0.evo。 7) 复制ila例化模板。 8)在

    2023年04月21日
    浏览(43)
  • 【FPGA】Vivado软件使用教程

    目录       一、创建Vivado工程 二、创建Verilog HDL文件 三、添加管脚约束 四、时序约束 五、生成BIT文件 六、Vivido仿真 七、上板再补充 1、启动Vivado,在Vivado开发环境里点击“Create Project”,创建新工程。  2、弹出窗口点击“Next”,在弹出的窗口中输入工程名和存放的工程路

    2024年02月06日
    浏览(43)
  • 【FPGA IP系列】FIFO的通俗理解

    FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 FIFO全称是First In First Out,即先进先出。 FIFO是一个数据缓存队列,主要特点就是数据顺序写入,再按照同样的顺序输出数

    2024年02月15日
    浏览(49)
  • 【FPGA IP系列】FIFO深度计算详解

    FIFO(First In First Out)是一种先进先出的存储结构,经常被用来在FPGA设计中进行数据缓存或者匹配传输速率。 FIFO的一个关键参数是其深度,也就是FIFO能够存储的数据条数,深度设计的合理,可以防止数据溢出,也可以节省FPGA资源的消耗。 影响FIFO深度计算的主要因素包括: FIF

    2024年02月06日
    浏览(55)
  • xilinx FPGA 乘法器ip核(multipler)的使用(VHDL&Vivado)

    一、创建除法ip核  可以选择两个变量数相乘,也可以选择一个变量输入数据和一个常数相乘 可以选择mult(dsp资源)或者lut(fpga资源) 可以选择速度优先或者面积优先 可以自己选择输出位宽 还有时钟使能和复位功能  二、编写VHDL程序:声明和例化乘法器ip核 三、编写仿真程

    2024年02月11日
    浏览(64)
  • FPGA原理与结构——FIFO IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门         FIFO是英文First-In-First-Out的缩写,是一种先入先出的数据缓冲器,与一般的存储器的区别在于没有地址线, 使用起来简单,缺点是只能顺序读写数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器

    2024年02月11日
    浏览(47)
  • Altera FPGA 储存单元IP核之RAM、FIFO

         只读存储器,系统上电后数据就被写入ROM,运行过程中只能从ROM中读取数据,而不能改变ROM中的数值。      随机存取储存器,可以随时把数据写入任一指定地址的储存单元,也可以随时从任一指定地址中读取数据。其读写速度是由时钟频率决定的。RAM主要用来存放程

    2023年04月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包