vivado FIFO IP核的使用

本文介绍了如何在FPGA开发中使用Vivado的FIFO IP核,阐述了FIFO作为数据缓存器的功能,特别是在跨时钟域数据缓冲中的作用。通过配置异步读写方式,详细展示了IP核封装和测试文件的编写过程,并通过仿真结果验证了FIFO的正确性。最后,总结了学习FIFO IP核设置和引脚功能带来的收获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FIFO是先进先出的数据缓存器。起到跨时钟域的数据缓冲作用,一般在实际应用过程当中采用异步读写的方式,

选择的配置如下

封装IP核

module clk_wiz(

        input    resetn         ,
        input    clk_in1        ,

        output   clk_out1       ,
        output   clk_out2       ,
        output   clk_out3       ,
        output   clk_out4       ,
        output   locked         

    );

clk_wiz_1 clk_inst
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output clk_out1
    .clk_out2(clk_out2),     // output clk_out2
    .clk_out3(clk_out3),     // output clk_out3
    .clk_out4(clk_out4),     // output clk_out4
    // Status and control signals
    .resetn(resetn), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(clk_in1));      // input clk_in1

测试文件如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/03/12 16:51:42
// Design Name: 
// Module Name: sim_fifo
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module sim_fifo(

    );

reg          rst                        ;      
reg          wr_clk                     ;      
reg          rd_clk                     ;      
reg          [4 : 0] din                ;      
wire          wr_en                      ;      
wire          rd_en                      ;      
wire         [4 : 0] dout               ;
wire         full                       ;
wire         almost_full                ;
wire         wr_ack                     ;
wire         empty                      ;
wire         almost_empty               ;
wire         valid                      ;
wire         underflow                  ;
wire         [3 : 0] rd_data_count      ;
wire         [3 : 0] wr_data_count      ;
wire         wr_rst_busy                ;
wire         rd_rst_busy                ;


//读时钟
initial rd_clk = 1;
always#5 rd_clk = ~rd_clk;
 
//写时钟
initial wr_clk = 1;
always#25 wr_clk = ~wr_clk;
 
//读使能、写使能
assign wr_en = ((~rd_en) && (~full));
assign rd_en = ((~wr_en) && (~empty));
 
//写数据 
always @ ( posedge wr_clk ) begin
    if ( rst )
        din <= 5'd1;
    else if ( wr_en )
        din <= din + 1'b1;
end
 
initial begin
    rst = 1;
    #11;
    rst = 0;
 
end



fifo_top    fifo_top_inst(

                     .rst             (rst          )             ,
                     .wr_clk          (wr_clk       )             ,
                     .rd_clk          (rd_clk       )             ,
                     .din             (din          )             ,
                     .wr_en           (wr_en        )             ,
                     .rd_en           (rd_en        )             ,
                     .dout            (dout         )             ,
                     .full            (full         )            ,
                     .almost_full     (almost_full  )            ,
                     .wr_ack          (wr_ack       )            ,
                     .empty           (empty        )            ,
                     .almost_empty    (almost_empty )            ,
                     .valid           (valid        )            ,
                     .underflow       (underflow    )            ,
                     .rd_data_count   (rd_data_count)            ,
                     .wr_data_count   (wr_data_count)            ,
                     .wr_rst_busy     (wr_rst_busy  )            ,
                     .rd_rst_busy     (rd_rst_busy  )            

    );


endmodule

仿真结果如下:

收获:

使用了FIFO IP核,了解了FIFO各个引脚的含义,对IP核的设置有了一个基础的认知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值