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

测试波形

相关推荐
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
Estar.Lee3 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
傻啦嘿哟3 小时前
代理IP在后端开发中的应用与后端工程师的角色
网络·网络协议·tcp/ip
向阳12184 小时前
Dubbo HTTP接入之triple协议
网络协议·http·dubbo
Estar.Lee6 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
友友马6 小时前
『 Linux 』网络层 - IP协议(一)
linux·网络·tcp/ip
hgdlip10 小时前
主IP地址与从IP地址:深入解析与应用探讨
网络·网络协议·tcp/ip
今天我刷leetcode了吗11 小时前
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
tcp/ip·docker·电脑
lwprain12 小时前
安装支持ssl的harbor 2.1.4 docker 19.03.8 docker-compose 1.24.0
网络协议·ssl·harbor
软件技术员12 小时前
Let‘s Encrypt SSL证书:acmessl.cn申请免费3个月证书
服务器·网络协议·ssl