写fifo这篇博客的主要原因是想强调异步fifo在跨时钟域处理以及读写数据宽度不同的异步fifo的设计。本篇文章先从简单开始,即先讨论ip调用——异步fifo使用。
异步fifo,顾名思义与同步fifo最大的区别是在时钟上,异步fifo的读写是中国不同。本次设计,通过调用quartus ii自带的ip核(具体的ip调用生成在上篇文章已有说明,不会的可以回顾一下)。写时钟采用系统主时钟,运用pll_ip核生成读时钟。主时钟50MHz,读时钟11MHz(相位偏移30°,在ip核配置窗口中设定),为了区分读写时钟,在写时钟下降沿写入数据(同时wren使能),在读时钟上升沿读出数据(rden使能)。
具体的建模代码如下:
//---------------------异步fifo实现----------------------//
/*
异步fifo的设计,这里描述的是指读和写时钟不同的异步fifo,
写入时钟采用的是主时钟50MHz,读时钟采用的是pll的输出时钟rd_clk,
其频率为11MHz,相位偏移30°。这里主要是进行一个异步fifo的模拟。
*/
wire rd_clk;
reg rdreq_sig;
wire wrreq_sig;
wire rdempty;
wire wrfull;
wire [D_WID - 1 : 0] asyn_dout;
asynchron_fifo as