Vivado FIFO IP核

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


一、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位,也就是说,几个读出数据对应一个写入数据。

在这里插入图片描述

  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hi小瑞同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值