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

测试波形

相关推荐
Novproxy_Z2 小时前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
垆边人似月.2 小时前
RDMA 文件传输踩坑(五):READY 发送成功后,为什么出现 Work Request Flushed Error?
服务器·网络·tcp/ip
qetfw4 小时前
UOS DHCP Relay:跨网段分配与 IP、DNS、网关验证
linux·服务器·网络·tcp/ip·uos
尹人入圣4 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
szxinmai主板定制专家5 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
叼烟扛炮6 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
叼烟扛炮6 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
lazy H13 小时前
【计算机网络】第 15 篇:Java BIO、NIO 与高并发网络通信——从 Socket 理解 I/O 模型
网络·后端·tcp/ip·计算机网络·nio·408
IT古董15 小时前
Modbus TCP 详解:工业设备通信协议与 MES 集成实战
网络·网络协议·tcp/ip
叼烟扛炮16 小时前
Linux 学习笔记(四十五):Web 安全基石——Cookie、Session 与 HTTPS 原理解析
linux·前端·网络·笔记·学习·tcp/ip·安全