异步FIFO(一)

写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	 	 	 	 	asyn_fifo_in1 
(
	.data  	 		 	 	  	(data_buf  ),
	.rdclk  	 	 		 	 	(rd_clk 	  ),
	.rdreq  	 	 	  	 	 	(rdreq_sig ),
	.wrclk  	 	  	 	 	 	(clk 	 	  ),
	.wrreq  	 	 	 	  	 	(wrreq_sig ),
	.q  	 	 	 	 	   	(asyn_dout ),
	.rdempty  	 	 	 	 	(rdempty   ),
	.wrfull  	 	 	 	 	(wrfull 	  )
);


rd_pll	 	 	 	rd_pll_i1 
(
	.inclk0  	 	(clk 	 	   	),
	.c0   	 	 	(rd_clk  	 	)
);

assign wrreq_sig = (word_cnt >= 6'd0 && word_cnt <= 6'd31 && !rdreq_sig) ? 1'b1 : 1'b0; 	//写使能信号产生;


always @ (posedge rd_clk, negedge rst_n) begin
	if (!rst_n)
		rdreq_sig <= 1'b0;
	else if (rdempty)
		rdreq_sig <= 1'b0;
	else if (wrfull)
		rdreq_sig <= 1'b1;
end

接下来看仿真结果:

异步FIFO(一)_第1张图片

 写入输入同上一篇,写入0-31,以下是读出的数据:

由仿真结果知,异步fifo的读写功能正常。

有关时钟域的异步fifo或者位宽同步的的其他知识,将于下一节阐述!

你可能感兴趣的:(FPGA设计开发)