基于verilog的同步FIFO设计
工具 vivado2016.2
同步fifo
FIFO的英文全称为first in first out,顾名思义就是先进先出的意思。fifo又分为同步fifo与异步fifo,fifo通常作为不同时钟域之间的数据传递,以及不同数据接口之间数据匹配。这次主要进行同步FIFO的研究。
- 同步fifo原理框图
由上图可知fifo主要有输入:clk,rst_n,read,write,data_in.输出:full,emty,data_out。与普通存储器不同的是fifo没有外部读写地址的输入,因此fifo使用较为简单,同样这也造成无法无法随意访问任意地址,只能顺序输出。
FIFO设计难点以及主要参数
fifo主要参数有,fifo深度,fifo宽度,空标志,满状态。
fifo设计的主要难点:
fifo设计主要难点在于如何判断fifo的满状态以及空标志。如果不能准确判断fifo的满状态可能造成写的数据被覆盖。同样如果不能准确判断fifo的空可能造成读书的数据错误。博主在设计这两个状态是就出现了相应的问题,最后进行修改才能正确进行读写。
以下是博主第一次进行设计的同步fifo,代码如下:
`timescale 1ns / 1ps
//
module snfifo1(
input clk,
input rst_n,
input[3:0] data_in,
input write,
input read,
output[3:0] data_out,
output full,
output emty
);
reg[3:0] fifo_reg[3:0];//depth4
reg[1:0] w_head,R_tail;
reg[1:0] count;
reg [3:0] dout;
reg f,e;
parameter MAX = 3;
//*************update w_head*************
always @ (posedge clk)
if(!rst_n)
w_head <= 2'd0;
else if(write && !full)
w_head <= w_head + 1'b1;
//else if(full) w_head <= 3'd0;
//*************update R_tail*************
always @ (posedge clk)
if(!rst_n)
R_tail <= 2'd0;
else if(read && !emty)
R_tail <= R_tail + 1'b1;
//else if(emty) R_tail <= 3'd0;
//**************count************
always @(posedge clk)
if(!rst_n)
begin
count <= 2'd0;
end
else
case({read,write})
2'b00:
count <= count;
2&#