Ip核调用——FIFO学习(一)

FIFO-first in first out,正面意思很好理解。这部分着重介绍同步FIFO,之后再介绍异步FIFO。

通过fifo的学习,同时为大家介绍quartus ii 中的ip核的调用。具体步骤如下:在MegaWizard Plug-in Manager中搜索fifo,即可进入fifo的io核编辑界面。

Ip核调用——FIFO学习(一)_第1张图片

 

编辑界面如下:选择8bit数据位宽,fifo深度32字节(红色标注1、2表示),3表示用作同步fifo(单时钟)。

Ip核调用——FIFO学习(一)_第2张图片

这一页按如下配置。

Ip核调用——FIFO学习(一)_第3张图片

接下来是优化配置界面,第一个选项卡表示是否输出端使用触发器打一拍输出,主要是为了提高电路的稳定性(如降低亚稳态的可能性)。

Ip核调用——FIFO学习(一)_第4张图片

EDA选项默认跳过;

最后界面如下,可勾上xxx_inst.v文件,方便例化。

Ip核调用——FIFO学习(一)_第5张图片

配置完fifo的ip核之后,需要简单写一个文件,描述数据写入至fifo中,同时给出相应的读写信号。具体的代码如下:

//----------------------逻辑功能实现------------------------//
//fifo是一个队列,我们只负责将东西先后排列即可,
//当rden信号使能时(即有人来取东西),取出的顺序是
//先排的先取出,故我们只需描述数据存入的电路即可(针对同步FIFO)
//计数,公共64个,wren和rden各一半
reg 	 	[BIT_WID - 1 : 0]  	word_cnt;
always @ (posedge clk, negedge rst_n) begin
	if (!rst_n)
		word_cnt <= {BIT_WID{1'b0}};
	else if (word_cnt == DEEPTH)
		word_cnt <= {BIT_WID{1'b0}};
	else
		word_cnt <= word_cnt + 1'b1;
end

assign wren = (word_cnt >= 6'd0 && word_cnt <= 6'd31) ? 1'b1 : 1'b0;
assign rden = (word_cnt >= 6'd32 && word_cnt <= 6'd63) ? 1'b1 : 1'b0;

//写入数据到fifo
always @ (negedge clk, negedge rst_n) begin
	if (!rst_n)
		data_buf <= {D_WID{1'b0}};
	else if (word_cnt >= 6'd0 && word_cnt <= 6'd31)
		data_buf <= word_cnt;
end

 接下来看功能仿真:相关描述见图中文字。

 

Ip核调用——FIFO学习(一)_第6张图片

具体的,这是写入的数据:

 这是取出的数据,和写入数据相同(内容和顺序)

综上,fifo的读写控制是正确的。

 

下一次继续介绍异步FIFO的使用。

 

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