FIFO一般用于不同时钟域之间的数据传递,FIFO根据FIFO工作的时钟域,可以分为同步FIFO与异步FIFO:同步FIFO是读时钟与写时钟为同一时钟,在时钟上升沿同时发生读写操作。异步FIFO是读写时钟为不同时钟,读写时钟彼此相互独立。
设计关键点:区分读空和写满这两种不同的状态,即FIFO在被写满后不能再写入,从而覆盖原有数据;再被读空后不能再进行读操作,防止读取无效数据。
将FIFO抽象为环形数组,并用两个指针,即读指针与写指针控制FIFO的读写;当fifo_rd完成一次读操作,fifo_rd加1;当fifo_wr完成一次写操作,fifo_wr加1。
由于再写即满的状态与再读即空的状态不同,可以用指针的状态表示。
一、同步FIFO 的RTL代码以及tb文件
所设计的FIFO深度为16.
其verilog代码如下:
module sync_fifo(
input clk,
input rst_n,
input rd,
input wr,
input [7:0] data_in,
output reg [7:0] data_out,
output reg full,
output reg empty);
reg [3:0] rp;
reg [3:0] wp;
reg [7:0] memory [15:0];
//产生读指针和写指针的地址,以及根据写指针将数据写入fifo中,根据读指针将数据从fifo中读出
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
data_out<=8'h00;
full<=0;
empty<=0;
rp<=4'b0000;
wp<=4'b0000;
end
else if(wr&&!full)
begin
memory[wp]<=data_in;
wp<=wp+1'b1;
end
else if(rd&&!empty)
begin
data_out<=memory[rp];
rp<=rp+1'b1;
end
else
begin
data_out<=data_out;
wp<=wp;
rp<=rp;
end
end
//产生读空信号
always@(posedge clk)
begi

本文介绍了同步FIFO和异步FIFO的设计原理,包括读写时钟的处理和状态判断。同步FIFO在同一时钟域内操作,而异步FIFO则涉及跨时钟域的数据传递,需要采用两级寄存器同步和格雷码来消除亚稳态。文中给出了Verilog代码示例和异步FIFO的空满状态判断方法。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



