原理
异步fifo:先进先出的存储单元,读写使用不同的时钟
不同于ram,fifo不能指定地址读写
两个难点:
1)读写时钟同步可能产生亚稳态,如果不加以处理,可能让亚稳态在整个fifo系统中传递,导致严重的错误。
2)空满标志的确定
解决:
1)二级寄存加格雷码转换
2)由格雷码的特性确定空满标志
读写指针的定义在考虑空满状态的情况下,需比地址多定义一位,用以判断空满
实现
代码
参考的网上大佬的代码
个人感觉代码非常精简
module my_fifo #(parameter DATA_WIDTH = 4,parameter DATA_DEPTH = 128)(
rst , //复位
wr_clk , //写时钟
wr_en , //写使能
rd_clk , //读时钟
rd_en , //读使能
din , //输入数据
dout , //输出数据
vld , //输出有效信号
empty , //满标注
full //空标志
);
//求底数为2的对数的值 求位宽
function integer log2b(input integer data);
begin
for(log2b = 0; data > 0 ; log2b = log2b + 1)begin
data = data >> 1;
end
end
endfunction
//接口定义
input rst ;//复位
input wr_clk ;//写时钟
input wr_en ;//写使能
input rd_clk ;//读时钟
input rd_en ;//读使能
input [DATA_WIDTH - 1:0] din