当前位置:   article > 正文

Vivado FIFO IP核_异步fifo调用ip核

异步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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

在这里插入图片描述

2.3 修改参数后的仿真结果

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

在这里插入图片描述

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/879353
推荐阅读
相关标签
  

闽ICP备14008679号