一.FIFO简介
FIFO (First In First Out,即先入先出),是一种数据缓冲器,用来实现数据先入先出的读写方式。
二,FIFO实现原理
FIFO是采用一种先入先出的实现原理
就如图按照D1到D10的顺序输入那么读取的时候也是按照D1到D10的顺序读取.
三,FIFO应用场景
FIFO存储器主要是作为缓存,应用在同步时钟系统和异步时钟系统中,在很多的设计中都会使用;如:多比特数据做跨时钟域处理、前后带宽不同步等都用到了FIFO。
比如下边图1就是多比特数据做跨时钟域处理
图2为带宽不同的数据处理
四,同步FIFO的配置与调用
- 首先在右侧搜索并选择FIFO
- 在弹出的界面选择保存路径和Verilog
- 选择位宽和深度,并选择异步或同步FIFO
- FIFO中的输入输出管脚选择
- 普通同步FIFO或先出数据FIFO模式
普通FIFO读取数据会比读取使能满一个周期
先出数据FIFO会和使能同步
- 性能选择
上一检测:输入满后禁止输入
下一检测:读取空后禁止读取
- 生成文件
默认勾选这两个
- 代码调用
/**************************************功能介绍***********************************
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
五.仿真观察
仿真代码
`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
测试波形