FPGA fifo储存器

FPGA实验报告



一、概述

1、目的及意义:

了解并掌握FIFO的使用,学习如何使用添加内置IP核。

2、主要功能:

FIFO队列是一种数据缓冲器,用于数据的缓存。他是一种先入先出的存储器,即最先写入的数据,最先读。FIFO的参数有数据深度和数据宽度。数据宽度是指存储数据的宽度。深度是指存储器可以存储多少个数据。

二、原理及步骤

1、原理框图:

先入先出
在这里插入图片描述

实现流程
在这里插入图片描述

2、工作原理

FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
FIFO存储器的读写方式如下图:

在这里插入图片描述

3、功能模块简介

	RST_N 复位模块 (计数器清零)
	Time_cnt 计数器 (产生64分帧,作为写入的模拟信号,同时控制写入读取的时间)
	FIFO_INST 内置IP核(控制数据的写入读出 输出数据满空状态)

4、实验步骤

1、首先根据老师上课演示建立一个空工程,然后在工程中导入FIFO IP核(选定64的深度)生成_inst文件,导入top文件。 

2、完善fifo_top文件,修改模块名与inst文件一致,并进行编译。
3、生成vt文件,并完善vt文件内容,进行仿真验证。
4、修改fifo_top文件,验证存储器存储大小,以及读写方式。

三、程序设计及描述

代码:

module fifo_top(
	input  CLK,//时钟信号
	input RST_N,//复位信号
	output reg [7:0]wrdata,//写入数据
	output reg [5:0]time_cnt,//计数
	output [7:0]rddata,//读取数据
	output wren,rden,//使能信号
	output [7:0]usedw,//FIFO-数据个数
	output full,empty//FIFO-空状态 FIFO-满状态
	);
	
	reg  [5:0] time_cnt_n;//计数器
	reg  [7:0] wrdata_n;    

	always @ (posedge CLK or negedge RST_N)//clk上升沿  res_n下降沿
      begin
			if(!RST_N)//复位信号为0 
				begin
					time_cnt <= 1'b0;//计数器更新
				end
			else//复位信号为1
				begin
					time_cnt <= time_cnt_n;//上升沿更新
				end
		end
		
	//计数器更新
	always @ (*)//64分频,产生0-63的计数值
		begin
	        if(time_cnt == 6'd63)//time_cnt 6位 十进制 63  
					begin
						time_cnt_n = 1'b0;//清零
					end
	        else  
					begin
						time_cnt_n = time_cnt + 1'b1;//加一
					end
		end
	assign wren = (time_cnt >= 1'b0 && time_cnt <= 5'd31) ? 1'b1 : 1'b0;//当time_cnt大于0 且 小于31时 wren为1 读数据
	
	//
	always @ (negedge CLK or negedge RST_N)//clk上升沿  res_n下降沿
		begin
	        if(!RST_N)//rst为0时  
					begin 
						wrdata <= 1'b0;
					end
	        else  //rst为1时
					begin
						wrdata <= wrdata_n;
					end
		end
	always @ (*)//生成测试用写入数据即计数值
		begin
	        if(time_cnt >= 1'b0 && time_cnt <= 5'd31)  
					begin
						wrdata_n = time_cnt;
					end
	        else  
					begin
						wrdata_n = wrdata;
					end
			  
		end
	//64分频中,前一半用来写入,后一半用来读出
	assign rden = (time_cnt >= 6'd32 && time_cnt <= 6'd63) ? 1'b1:1'b0;
	
	//IP核调用
	FIFO  FIFO_inst(
	        .clock         (CLK),
	        .wrreq         (wren),
	        .data         (wrdata),
	        .rdreq         (rden),
	        .q            (rddata),        
	        .empty         (empty),
	        .full         (full),
	        .usedw         (usedw));
endmodule

四、仿真与综合测试

1、 仿真代码

initial                                                
begin                                                  
	CLK=0;
	RST_N=0;
	#10 RST_N=1;
	#10000 $stop;
end                                                    
always                                                 
// optional sensitivity list                           
// @(event1 or event2 or .... eventn)                  
begin                                                  
#10 CLK=~CLK;                                          
end                                                    
endmodule

2、 仿真图

由图可以观察出FIFO的读写方式,通过使能信号控制读写。![在这里插入图片描述](https://img-blog.csdnimg.cn/20210526135053222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2MzAzNjEz,size_16,color_FFFFFF,t_70)

读写相互独立
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

存入40个数,我们可以观察到第一次未读取晚完的数并没有被第二次写入覆盖,而是遵循先入先出的规则继续输出。

五、拓展

在这里插入图片描述

1、数据写满后不能继续写入,会显示FULL信号以阻止FIFO继续写入数据导致数据溢出。
在这里插入图片描述

2、数据读完不能继续读出,会显示empty信号以阻止FIFO继续读出数据导致无效输出。
3、usedw是当前存储器中数据个数的表示,可以以usedw为标志来觉得存储器是否可以继续写入和读出数据。

六、总结

1、64*8为64个八位二进制的数。
2、FIFO队列是一种数据缓冲器,用于数据的缓存。他是一种先入先出的存储器,即最先写入的数据,最先读。FIFO的参数有数据深度和数据宽度。数据宽度是指存储数据的宽度。深度是指存储器可以存储多少个数据。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值