32.同步FIFO-IP核的调用

(1)FIFO(First In First Out,即先进先出),是一种数据缓冲器,用来实现数据先入先出的读写方式。

(2)FIFO存储器主要是作为缓存,应用在同步时钟系统和异步时钟系统中,在很多的设计中都会被使用,比如:多比特数据做跨时钟域处理、前后带宽不同步等都用到了FIFO。

(3)FIFO根据读写时钟是否相同,可以分为SCFIFO(同步FIFO)和DCFIFO(异步FIFO)。

(4)scfifo配置过程:

(5)scfifo的调用:

module scfifo
(
    input clk               ,
    input reset_n           ,
    input [7:0]data_in      ,
    input wr_en             ,
    input rd_en             ,
    
    output [7:0]data_out    ,
    output full             ,
    output empty            ,
    output [7:0]data_count       

    );
    
    
scfifo_8x256 scfifo_8x256_inst (
    .clk            (clk           ),                // input wire clk
    .srst           (~reset_n      ),              // input wire srst
    .din            (data_in       ),                // input wire [7 : 0] din
    .wr_en          (wr_en         ),            // input wire wr_en
    .rd_en          (rd_en         ),            // input wire rd_en
    .dout           (data_out  ),              // output wire [7 : 0] dout
    .full           (full      ),              // output wire full
    .empty          (empty     ),            // output wire empty
    .data_count     (data_count)                // output wire [7 : 0] data_count
); 
    
    
    
    
    
    
endmodule

(6)仿真文件代码:

`timescale 1ns / 1ps

module scfifo_tb;

reg                     clk         ;
reg                     reset_n     ;
reg         [7:0]       data_in     ;
reg                     wr_en       ;
reg                     rd_en       ;

reg         [1:0]       cnt         ;

wire        [7:0]       data_out    ;
wire                    full        ;
wire                    empty       ;
wire        [7:0]       data_count  ;


scfifo scfifo_inst
(
   .clk        (clk       )     ,
   .reset_n    (reset_n   )     ,
   .data_in    (data_in   )     ,
   .wr_en      (wr_en     )     ,
   .rd_en      (rd_en     )     ,
                          
   .data_out   (data_out  )     ,
   .full       (full      )     ,
   .empty      (empty     )     ,
   .data_count (data_count)      

    );
    
    initial clk = 1'd1;
    always #10 clk = ~clk;
    
    initial begin 
        reset_n <= 1'd0;
        #21;
        reset_n <= 1'd1;
        #100_000;
        $stop;
    end
    
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            cnt <= 2'd0;
        else if(cnt == 2'd3)
            cnt <= 2'd0;
        else 
            cnt <= cnt + 2'd1;
            
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            wr_en <= 1'd0;
        else if(cnt == 2'd3 && rd_en == 1'd0)
            wr_en <= 1'd1;
        else
            wr_en <= 1'd0;
            
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            data_in <= 8'd0;
        else if(data_in == 8'd255 && wr_en)
            data_in <= 8'd0;
        else if(wr_en  && (!full))
            data_in <= data_in + 8'd1;
        else 
            data_in <= data_in;
            
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            rd_en <= 1'd0;
        else if(full && wr_en == 1'd0)
            rd_en <= 1'd1;
        else if(empty)
            rd_en <= 1'd0;
        else 
            rd_en <= rd_en;

endmodule

(7)仿真波形:

相关推荐
szxinmai主板定制专家17 分钟前
【国产NI替代】基于国产FPGA+兆易创新GD32F450的全国产16振动+2转速(24bits)高精度终端采集板卡
fpga开发
szxinmai主板定制专家2 小时前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
HIZYUAN8 小时前
AGM FPGA如何配置上拉或者下拉电阻
fpga开发
∑狸猫不是猫8 小时前
(13)CT137A- 简易音乐盒设计
fpga开发
ThreeYear_s14 小时前
基于FPGA 的4位密码锁 矩阵键盘 数码管显示 报警仿真
fpga开发·矩阵·计算机外设
Anin蓝天(北京太速科技-陈)20 小时前
252-8路SATAII 6U VPX高速存储模块
fpga开发
如何学会学习?1 天前
2. FPGA基础了解--全局网络
fpga开发
Anin蓝天(北京太速科技-陈)1 天前
271-基于XC7V690T的12路光纤PCIe接口卡
嵌入式硬件·fpga开发
碎碎思1 天前
FPGA新闻速览-WiMi开发基于FPGA的数字量子计算机验证技术
fpga开发·量子计算
hi942 天前
Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
嵌入式硬件·fpga开发·vivado 远程开发·vmware网络配置