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的参数有数据深度和数据宽度。数据宽度是指存储数据的宽度。深度是指存储器可以存储多少个数据。