Vivado FIFO IP核

本文详细介绍了FPGA中的FIFOIP核常用参数配置,包括接口类型、实现方式、NativePorts(特别是读写数据端口和StatusFlags)以及数据计数器。通过示例仿真验证了同步和异步FIFO的行为,特别关注了数据宽度对读写的影响。

FIFO系列:FPGA中FIFO的应用
完整工程已上传至优快云下载链接


一、FIFO IP核参数配置简介

参考文档:pg057 P156—P173

1.1 Basic

在这里插入图片描述

①选择FIFO的接口类型:

  • 传统接口
  • AXI存储映射接口
  • AXI Stream接口。

②FIFO的实现方式:这个种类有很多,这里不详细列出。

  • common clock表示同步FIFO
  • independent clock表示异步FIFO

1.2 Native Ports

在Basic界面选择传统接口后,其配置界面如下:

在这里插入图片描述
①读类型:

  • 标准FIFO
  • 首字掉入FIFO,

②数据端口参数:设置读写宽度和深度,

补充:

  • 一般我们选择标准FIFO即可,有关首字掉入FIFO的说明详见P99
  • 虽然读写位宽可以设置为不同,但读深度不可设置,而是会根据上边三个参数自行计算出来,一般要满足:写宽度 * 写深度=读宽度 * 读深度
  • 写深度我们设置的使256,但IP核所实现的实际深度却是255,也就是比设置深度少1。

1.3 Status Flags

在这里插入图片描述
①可选标志:

  • 将满标志
  • 将空标志

补充:

  • almost_empty和almost_full可看作是empty和full的警告信号,它们相对于empty和full会提前一个时钟周期拉高

1.4 Data Counts

在这里插入图片描述
①数据计数器:用来记录读写数据的个数,可分别设置读写数据计数器的位宽。

二、仿真验证

2.1 原始仿真结果

`timescale 1ns / 1ps

module tb();

parameter FIFO_WIDTH=8;

reg wr_clk;
reg rd_clk;
reg [7:0] din;
reg wr_en;
reg rd_en;
wire [7:0] dout;
wire full;
wire almost_full;
wire empty;
wire almost_empty;
wire [7:0] rd_data_count;
wire [7:0] wr_data_count;

initial begin
    wr_clk=1'b0;
    rd_clk=1'b0;
    din='b0;
    wr_en=1'b0;
    rd_en=1'b0;
    #10;
    repeat(10)begin
        @(negedge wr_clk)begin
            din={$random}%(2^FIFO_WIDTH);
            wr_en=1'b1;
        end
    end
    repeat(10)begin
        @(negedge rd_clk)begin
            rd_en=1'b1;
            din={$random}%(2^FIFO_WIDTH);
        end
    end
    
end

always #10 wr_clk=~wr_clk;
always #20 rd_clk=~rd_clk;

fifo_generator_0 fifo_generator_u (
  .wr_clk(wr_clk),                // input wire wr_clk
  .rd_clk(rd_clk),                // input wire rd_clk
  .din(din),                      // input wire [7 : 0] din
  .wr_en(wr_en),                  // input wire wr_en
  .rd_en(rd_en),                  // input wire rd_en
  .dout(dout),                    // output wire [7 : 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 [7 : 0] wr_data_count
);
endmodule

在这里插入图片描述

2.3 修改参数后的仿真结果

☀️为了验证异步FIFO作不同数据宽度的数据接口这一应用,这里简单修改一下,使读位宽大于写位宽,设置读位宽为16位,读深度则为128。可以看到一个读出数据对应两个写入数据,也就是说,当读位宽大于写位宽时,几个写入数据拼接成一个读出数据。

在这里插入图片描述

☀️然后再试试写位宽大于读位宽的情况,这里设置读位宽为4,则读深度为512,并将输入数据扩大2倍。可以看到每次先读出输入数据的高4位,再读出低4位,也就是说,几个读出数据对应一个写入数据。

在这里插入图片描述

### 如何配置异步FIFO IP 在现代FPGA开发工具中,通常提供图形化界面来帮助工程师快速配置IP。对于异步FIFO而言,在Xilinx Vivado环境中可以通过如下方式完成其配置: #### 打开Vivado并创建项目 启动Vivado软件后新建一个工程文件夹用于保存整个项目的源码及相关设置。 #### 添加AXI FIFO IP Core 通过导航栏中的`Tools -> Create and Package New IP...` 或者直接利用IP Catalog搜索框输入“FIFO Generator”,找到对应的组件并点击双击打开向导窗口[^1]。 #### 配置基本参数 进入向导页面之后会提示选择目标器件系列以及接口模式(如Streaming或Memory-Mapped)。继续前进直到遇到可以自定义内部结构的地方,这里能够指定数据宽度、存储深度等重要特性。特别注意的是当涉及到跨时钟域操作即构建异步FIFO时,需勾选相应的选项以启用该功能。 #### 设置读写时钟信号 由于是异步工作环境下的FIFO设计,因此必须分别设定独立的读取端口与写入端口所使用的不同频率与时序关系的时钟源。这一步骤确保了即使两端的工作节奏不一致也能正常交换信息而不丢失任何有效载荷。 #### 应用额外优化措施 为了提高性能表现或是降低功耗消耗,还可以进一步调整一些高级别的开关项比如是否开启灰度编码机制来增强可靠性;或者是考虑采用分布式RAM代替块状SRAM作为实际物理载体从而节省空间占用率等等。 ```verilog // 示例Verilog代码片段展示简单的异步FIFO实例化过程 module async_fifo_example ( input wire wr_clk, // 写时钟 input wire rd_clk, // 读时钟 input wire rst_n, // 复位信号(低电平有效) input wire [7:0] din, // 数据输入 output reg full, // 满标志 input wire we, // 写使能 output reg empty, // 空标志 output reg [7:0] dout // 数据输出 ); // 实例化Xilinx提供的Async_FIFO_IP_Core模块 Async_FIFO_IP_Core your_instance_name ( .wr_clk(wr_clk), // 输入wire wr_clk .rd_clk(rd_clk), // 输入wire rd_clk .rst(rst_n), // 输入wire rst .din(din), // 输入wire [7 : 0] din .wr_en(we & ~full), // 输入wire wr_en .rd_en(~empty), // 输入wire rd_en .dout(dout), // 输出reg [7 : 0] dout .full(full), // 输出reg full .empty(empty) // 输出reg empty ); endmodule ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hi小瑞同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值