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)仿真波形:

相关推荐
嵌入式-老费1 小时前
Linux Camera驱动开发(fpga + csi rx/csi tx)
fpga开发
ALINX技术博客13 小时前
【202601芯动态】全球 FPGA 异构热潮,ALINX 高性能异构新品预告
人工智能·fpga开发·gpu算力·fpga
JJRainbow20 小时前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
s91236010121 小时前
FPGA眼图
fpga开发
北京青翼科技1 天前
【PCIe732】青翼PCIe采集卡-优质光纤卡- PCIe接口-万兆光纤卡
图像处理·人工智能·fpga开发·智能硬件·嵌入式实时数据库
minglie11 天前
verilog信号命名规范
fpga开发
XINVRY-FPGA1 天前
中阶FPGA效能红线重新划定! AMD第2代Kintex UltraScale+登场,记忆体频宽跃升5倍
嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
南檐巷上学1 天前
基于FPGA的音频信号监测识别系统
fpga开发·音频·verilog·fpga·傅立叶分析·fft·快速傅里叶变换
Aaron15882 天前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
碎碎思2 天前
当 FPGA 遇见怀旧计算:486 与 Atari ST 的硬件级重生
fpga开发