Vivado FIFO IP核测试与分析(附GitHub源码)

本项目用于测试Vivado提供的FIFO IP核不同配置的时序与逻辑,以供设计参考。

项目内容见GitHub:https://github.com/CY0807/Vivado_FIFO_Test

芯片型号:Artix-7 xc7a35tfgg484-2L

开发板:ALINX AX7035

开发环境:vivado 2019.1

首先新建Vivado工程,配置如下:

1

1 同步FIFO测试

1.1 基本设计

例化同步FIFO IP核,参数如下图所示,输入输出使用同一时钟,位宽为4,深度32。

1

仿真测试代码见tb_FIFO_syn.v,其中核心代码如下:

initial begin
    rst = 1'b1;
    wr_en = 1'b0;
    rd_en = 1'b0;
    
    # 1010
    rst = 1'b0;
    wr_en = 1'b1;
    # 10
    
    # 700
    rd_en = 1'b1;
    
    # 300
    wr_en = 1'b0;
    
    # 800
    $finish;
end

1.2 整体仿真时序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvcxjXMJ-1675525658507)(https://user-images.githubusercontent.com/95362898/213973858-359b87c6-010a-43f8-a120-1d58a8205d46.PNG “整体仿真时序图”)]

1.3 时序分析

如下见两放大图:

a
b

从仿真波形可以看出:

1、data_count的计数是准确且及时的,且对于深度为32的同步FIFO,data_count为4位,其最大值为31,故当FIFO满时count归0。

2、full和empty是准确的,almost_full和almost_empty信号都在数值差1时有效。

3、valid信号在输出数据有效时为高,当FIFO空了之后,即使有rd_en信号,valid信号仍然无效。

2 异步FIFO测试

2.1 基本设计

如下见异步FIFO IP核的配置参数:写位宽4, 深度63;读位宽8,深度31

在仿真中,写时钟为20ns,读时钟为12ns

1

仿真代码见tb_FIFO_asyn.v,核心部分如下所示:

initial begin
    wr_clk = 1'b1;
    rd_clk = 1'b1;
    rst = 1'b1;
    wr_en = 1'b0;
    rd_en = 1'b0;
    # 30
    
    rst = 1'b0;
    wait((~wr_rst_busy)&(~wr_clk));    
    wr_en = 1'b1;
    # 1500
    
    rd_en = 1'b1;
    # 200
    
    wr_en = 1'b0;
    # 300
    
    $finish;
end

FIFO IP核的例化模板如下

FIFO_2 FIFO_2_asyn (
  .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 [3 : 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
  .valid(valid),                  // output wire valid
  .rd_data_count(rd_data_count),  // output wire [4 : 0] rd_data_count
  .wr_data_count(wr_data_count),  // output wire [5 : 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
);

2.2 仿真波形与分析

2

由于FIFO核初始化需要时间,在rst电平拉低后,仍不能进行读写,直到wr_rst_busy和rd_rst_busy信号拉低后才能开始进行读写。

下面观察从零开始写数据的波形图:
3
1、根据官方说明,wr_data_count从不少报,而rd_data_count从不多报。

2、从上如中可以看出,刚开始写时wr_data_count是及时的,而rd_data_count延后了,即少报了。

3、empty信号和almost_empty信号在此处也滞后了。

再观察后半部分:
4
1、由于异步时序问题,wr_data_count和rd_data_count变化并不平滑,且真实数据在两者之间,其误差较小可以接受。

2、empty信号和full信号分别与rd和wr时钟同步,且与相应的data_count相吻合。

3、dout和din能匹配上。

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vivado FIFO IP核用于在Xilinx Vivado软件中实现FIFO(First-In-First-Out)功能。它是一种用于数据缓存和传输的IP核,可以用于解决数据读写速度不匹配的问题。使用Vivado FIFO IP核能够简化用户对FIFO的配置和设计过程。 Vivado提供了多种方式来使用FIFO IP核。第一种方式是用户根据需求自己编写FIFO逻辑,这种方式适用于用户对FIFO功能有特殊需求时。第二种方式是使用第三方提供的开源IP核,用户可以在此基础上进行修改以满足自己的系统需求。第三种方式是使用Vivado软件提供的免费FIFO IP核,它提供了友好的图形化界面,方便用户对FIFO的各种参数和结构进行配置,并且可以实现针对Xilinx不同系列器件的结构优化。建议在系统设计中使用该FIFO IP核,因为它已经提供了大部分设计所需的所有功能。 需要注意的是,在使用VivadoFIFO Generator IP核时,输入的读写时钟频率不能超过500MHz。用户可以根据自己的实际需求选择合适的时钟频率进行配置。 关于Vivado FIFO IP核的具体系统应用,请参考文献和中的内容。文献介绍了使用Vivado软件配置FIFO IP核的三种方式,而文献则提供了创建空白工程和查找FIFO Generator IP核的步骤。 请注意,由于限制回答长度,我无法提供详细的每一步操作。但你可以参考Vivado软件的相关文档和教程来了解如何使用Vivado FIFO IP核进行系统应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值