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

测试波形

相关推荐
上海云盾安全满满10 小时前
高防 IP 是如何帮助数藏行业防刷
网络·网络协议·tcp/ip
吠品11 小时前
免费SSL证书自动化申请:DNS代理验证
网络协议·自动化·ssl
捷米研发三部15 小时前
CC-Link转Modbus TCP协议转换网关实现三菱 PLC与传感器通讯在快递分拣中心的应用案例
网络·网络协议
嵌入式-小王15 小时前
每天掌握一个网络协议----ARP协议
网络·网络协议·arp
阿珊和她的猫17 小时前
HTTP 状态码 301 和 302 的区别与使用场景
网络·网络协议·http
9527华安17 小时前
国产安路FPGA开发设计培训课程,提供开发板+工程源码+视频教程+技术支持
fpga开发·fpga·安路·视频教程·培训·安路fpga
让学习成为一种生活方式19 小时前
植物中验证蛋白相互作用的Pull-down和Co-IP技术--文献精读181
网络·网络协议·tcp/ip
普普通通的南瓜19 小时前
IP证书在关键信息基础设施安全防护中的实践与挑战
网络·数据库·网络协议·tcp/ip·安全·ssl
YFLICKERH1 天前
【加密协议】SSL/TLS 协议工作流程
网络协议·ssl/tls
UVM_ERROR1 天前
硬件设计实战:解决Valid单拍采样失效问题(附非阻塞赋值与时序对齐核心要点)
驱动开发·fpga开发·github·芯片