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

测试波形

相关推荐
s090713616 分钟前
Xilinx FPGA使用 FIR IP 核做匹配滤波时如何减少DSP使用量
算法·fpga开发·xilinx·ip core·fir滤波
老蒋新思维4 小时前
创客匠人峰会新解:AI 时代知识变现的 “信任分层” 法则 —— 从流量到高客单的进阶密码
大数据·网络·人工智能·tcp/ip·重构·创始人ip·创客匠人
XINVRY-FPGA5 小时前
XC7Z030-2SBG485I Xilinx Zynq-7000 系列 SoC FPGA
嵌入式硬件·fpga开发·硬件工程·fpga
Smile_2542204189 小时前
解决本地 Windows 开发机无法注册到 PowerJob 服务器的问题
java·tcp/ip
她是太阳,好耀眼i11 小时前
配置FTP目录文件以http网址方式访问并下载
网络·网络协议·http
崇子嵘12 小时前
Hdlbits
fpga开发
sc.溯琛12 小时前
数据链路层复习总结
网络·网络协议·智能路由器
qq192263812 小时前
探索STM32G431实现无感FOC驱动:从高频注入到滑膜观测器
网络协议
非凡ghost12 小时前
Audacity(免费开源跨平台音频软件)中文绿色版
网络·网络协议·音视频·软件需求
乾元13 小时前
Syslog / Flow / Telemetry 的 AI 聚合与异常检测实战(可观测性)
运维·网络·人工智能·网络协议·华为·自动化·ansible