FIFO: First in, First out。代表先进的数据先出 ,后进的数据后出。FIFO按读数据和写数据工作的时钟域是否相同分为同步FIFO和异步FIFO。由于同步FIFO设计较于简单,故本文仅讨论异步FIFO的设计。
一、异步FIFO结构简述
由图可见,异步FIFO的核心部件就是一个 双端口 RAM ;左右两边的长条矩形是地址控制器,负责控制地址自增、将二进制地址转为格雷码以及产生空满信号;SYN模块为同步器,由两个D触发器构成,负责将写地址同步至读时钟域、将读地址同步至写时钟域。
二、双端口RAM设计
module RAM #(
parameter DEPTH=256, //RAM存储深度
parameter WIDTH_A=8, //RAM地址总线宽度
parameter WIDTH_D=16 //RAM数据总线宽度
)
(
input r_clk,
input w_clk,
input rst_n,
input [WIDTH_A-1:0] w_addr, //写地址
input [WIDTH_D-1:0] w_data, //写数据
input w_en, //写使能
input [WIDTH_A-1:0] r_addr, //读地址
output reg [WIDTH_D-1:0] r_data, //读数据
input r_en //读使能
);
reg [WIDTH_D-1:0] mem [DEPTH-1:0]; //16x256存储器
//RAM写数据
always @ (posedge w_clk or negedge rst_n)begin
if (!rst_n)
mem<='{default:0};
else if (w_en)
mem[w_addr]<=w_data;
end
//RAM读数据
always @ (posedge r_clk or negedge rst_n)begin
if (!rst_n)
r_data<=0;
else if (r_en)
r_data<=mem[r_addr];
end
endmodule