IP核之fifo

一.FIFO简介

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

二,FIFO实现原理

FIFO是采用一种先入先出的实现原理

就如图按照D1到D10的顺序输入那么读取的时候也是按照D1到D10的顺序读取.

三,FIFO应用场景

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

比如下边图1就是多比特数据做跨时钟域处理

图2为带宽不同的数据处理

四,同步FIFO的配置与调用

  1. 首先在右侧搜索并选择FIFO
  2. 在弹出的界面选择保存路径和Verilog
  3. 选择位宽和深度,并选择异步或同步FIFO
  4. FIFO中的输入输出管脚选择
  5. 普通同步FIFO或先出数据FIFO模式
    普通FIFO读取数据会比读取使能满一个周期
    先出数据FIFO会和使能同步
  6. 性能选择
    上一检测:输入满后禁止输入
    下一检测:读取空后禁止读取
  7. 生成文件
    默认勾选这两个
  8. 代码调用
cpp 复制代码
/**************************************功能介绍***********************************
Date	: 
Author	: WZY.
Version	: 
Description: fifo功能测试
*********************************************************************************/
    
//---------<模块及端口声名>------------------------------------------------------
module fifo( 
    input 	wire			    clk		,
    input 	wire				rst_n	,
    input   wire    [7:0]       data    ,
    input   wire                rd_req  ,
    input   wire                wr_req  ,

    output  wire                empty   ,
    output  wire                full    ,
    output  wire    [7:0]       po_data ,
    output  wire    [7:0]       usedw     //数据个数
);								 
//---------<参数定义>--------------------------------------------------------- 
    
//---------<内部信号定义>-----------------------------------------------------
    
scfifo_8x256	scfifo_8x256_inst (
    .clock  ( clk ),
    .data   ( data ),
    .rdreq  ( rd_req ),
    .wrreq  ( wr_req ),
	.empty  ( empty ),
	.full   ( full),
	.q      ( po_data ),
	.usedw  ( usedw )
	);    
    
    
    
endmodule

五.仿真观察

仿真代码

cpp 复制代码
`timescale 1ns/1ns

module fifo_tb ();
//产生激励
reg         clk	    ;
reg         rst_n   ;
reg  [7:0]  data    ;
reg         rd_req  ;
reg         wr_req  ;
//参数定义
parameter  CYCLE = 20 ;
reg [1:0]   cnt ;


wire          empty    ;
wire          full     ;
wire  [7:0]   po_data  ;
wire  [7:0]   usedw    ;
//产生时钟
always #(CYCLE/2) clk = ~clk ;
//cnt
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= 2'd0;
    end
    else if (cnt == 2'd3) begin
        cnt <= 2'd0;
    end
    else begin
        cnt <= cnt + 1'd1;
    end
end
//写使能
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        wr_req <= 1'b0;
    end
    else if (cnt == 2'd3&&rd_req == 1'b0) begin
        wr_req <= 1'd1;
    end
    else begin
        wr_req <= 1'd0;
    end
end
//data
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        data <= 8'd0;
    end
    else if (data == 8'd255&&wr_req == 1'b1) begin
        data <= 8'd0;
    end
    else if (wr_req == 1'b1) begin
        data <= data + 1'b1;
    end
end
//读使能
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        rd_req <= 1'b0;
    end
    else if (full == 1'b1) begin
        rd_req <= 1'b1;
    end
    else if (empty == 1'b1) begin
        rd_req <= 1'b0;
    end
end

 

fifo fifo_inst( 
    .clk		(clk),
    .rst_n	    (rst_n),
    .data       (data),
    .rd_req     (rd_req),
    .wr_req     (wr_req), 
    .empty      (empty),
    .full       (full),
    .po_data    (po_data),
    .usedw      (usedw)//数据个数
);


initial begin
    clk = 1'b1;
    rst_n = 1'b0;
    #20
    rst_n = 1'b1;

end





endmodule

测试波形

相关推荐
2301_780789664 小时前
UDP和TCP的主要区别是什么
服务器·网络协议·web安全·网络安全·udp
尤老师FPGA7 小时前
使用DDR4控制器实现多通道数据读写(二十)
fpga开发
有书Show9 小时前
个人IP的塑造方向有哪些?
网络·网络协议·tcp/ip
HHRL-yx9 小时前
C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
网络·c++·tcp/ip
快乐觉主吖10 小时前
Unity网络通信的插件分享,及TCP粘包分包问题处理
tcp/ip·unity·游戏引擎
千宇宙航12 小时前
闲庭信步使用图像验证平台加速FPGA的开发:第二十一课——高斯下采样后图像还原的FPGA实现
图像处理·计算机视觉·fpga开发
千宇宙航12 小时前
闲庭信步使用图像验证平台加速FPGA的开发:第二十课——图像还原的FPGA实现
fpga开发
iblade13 小时前
网络:TCP序列号和滑动窗口,顺序保证
网络·tcp/ip·php
HHRL-yx15 小时前
C++网络编程 2.TCP套接字(socket)编程详解
网络·c++·tcp/ip
景彡先生15 小时前
STM32以太网开发详解:基于LwIP协议栈实现TCP/UDP通信(附网络摄像头案例)
网络·stm32·tcp/ip