FPGA实验二基于HDL的十进制计数器.docx
《FPGA实验二基于HDL的十进制计数器.docx》由会员分享,可在线阅读,更多相关《FPGA实验二基于HDL的十进制计数器.docx(9页珍藏版)》请在冰豆网上搜索。
![FPGA实验二基于HDL的十进制计数器.docx](https://file1.bdocx.com/fileroot1/2022-11/29/b227ae45-0c19-480a-913f-e756301c3e5c/b227ae45-0c19-480a-913f-e756301c3e5c1.gif)
FPGA实验二基于HDL的十进制计数器
《FPGA》课程报告
设计题目:
基于HDL的十进制计数器
学生班级:
学生学号:
学生姓名:
指导教师:
时间:
成绩:
一、实验目的:
1.掌握基于语言的ISE设计全流程;
2.熟悉、应用VerilogHDL描述数字电路;
3.掌握基于Verilog的组合和时序逻辑电路的设计方法。
二、实验原理:
本次实验是使用VerilogHDL进行编写十进制计数器与显示器代码而进行的实验,实验原理图如下:
本次实验的内容包括十进制计数器模块,七段译码显示器模块,以及消抖模块。
十进制计数器:
对输入时钟进行计数
输入:
CLK-------待计数的时钟
CLR---------异步清零信号,当CLR=1,输出复位为0,当CLR=0,正常计数
ENA---------使能控制信号,当ENA=1,电路正常累加计数,否则电路不工作
输出:
SUM[3:
0]----------计数值的个位。
即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。
COUT------------计数值的十位进位,即:
只有在时钟CLK上升沿检测到SUM=9时,COUT将被置1,其余情况下COUT=0;
LED显示驱动模块:
输入:
sum[3:
0]-------待显示的数值
out[6:
0]----------驱动数码管的七位数值
七段数码管的字符显示真值表如下:
消抖模块:
三、实验过程:
1.首先建立一个新的工程,添加一个新的VerilogModule,在其中编写十进制计数模块的代码,如下:
moduleliao1(CLR,CLK,ENA,SUM,COUT
);
inputCLR,CLK,ENA;
output[3:
0]SUM;
outputCOUT;
reg[3:
0]SUM;
regCOUT;
always@(posedgeCLKorposedgeCLR)
if(CLR)
begin
SUM<=4'b0000;
COUT<=1'b0;
end
else
if(ENA)
begin
if(SUM==9)
begin
SUM<=4'b0000;
COUT<=1'b1;
end
else
begin
SUM<=SUM+1'b1;
COUT<=1'b0;
end
end
endmodule
然后执行综合,确认无误后,新建一个TestBenchWaveForm文件,进行仿真,仿真图如下:
2.再新建一个VerilogModule,在其中编写七段数码显示模块的代码,如下:
moduleliao2(SUM,out
);
input[3:
0]SUM;
output[6:
0]out;
reg[6:
0]out;
always@(SUM)
begin
case(SUM)
4'b0000:
out<=7'b0000001;
4'b0001:
out<=7'b1001111;
4'b0010:
out<=7'b0010010;
4'b0011:
out<=7'b0000110;
4'b0100:
out<=7'b1001100;
4'b0101:
out<=7'b0100100;
4'b0110:
out<=7'b0100000;
4'b0111:
out<=7'b0001111;
4'b1000:
out<=7'b0000000;
4'b1001:
out<=7'b0000100;
default:
out<=7'b0000001;
endcase
end
endmodule
执行综合,确认无误后新建一个TestBenchWaveForm文件,进行仿真,仿真图如下:
3.添加消抖模块,然后再新建一个VerilogModule,编写例化文件,制成顶层文件,其例化文件代码如下:
moduleliao(CLK_50M,CLK,CLR,ENA,COUT,out
);
inputCLR,CLK,ENA;
inputCLK_50M;
output[6:
0]out;
outputCOUT;
wire[3:
0]SUM;
debounce_moduleu1(CLK_50M,CLR,CLK,clk_out);
liao1u2(CLR,clk_out,ENA,SUM,COUT);
liao2u3(SUM,out);
endmodule
保存之后形成顶层文件:
4.执行综合,确认无误后,根据实验指导书进行锁引脚操作:
锁引脚完成后,修改、编辑约束文件:
5.生成下载配置文件,下载到开发板进行经行验证。
四、实验思考题:
1.如何用两个或一个always实现十进制计数模块?
写出相应代码。
moduleliao1(CLR,CLK,ENA,SUM,COUT
);
inputCLR,CLK,ENA;
output[3:
0]SUM;
outputCOUT;
reg[3:
0]SUM;
regCOUT;
always@(posedgeCLKorposedgeCLR)
if(CLR)
begin
SUM<=4'b0000;
COUT<=1'b0;
end
else
if(ENA)
begin
if(SUM==9)
begin
SUM<=4'b0000;
COUT<=1'b1;
end
else
begin
SUM<=SUM+1'b1;
COUT<=1'b0;
end
end
endmodule
2.如何用always,或assign实现数码管的驱动设计?
写出相应代码。
moduleliao2(SUM,out
);
input[3:
0]SUM;
output[6:
0]out;
reg[6:
0]out;
always@(SUM)
begin
case(SUM)
4'b0000:
out<=7'b0000001;
4'b0001:
out<=7'b1001111;
4'b0010:
out<=7'b0010010;
4'b0011:
out<=7'b0000110;
4'b0100:
out<=7'b1001100;
4'b0101:
out<=7'b0100100;
4'b0110:
out<=7'b0100000;
4'b0111:
out<=7'b0001111;
4'b1000:
out<=7'b0000000;
4'b1001:
out<=7'b0000100;
default:
out<=7'b0000001;
endcase
end
endmodule
3.比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境。
答:
通过做实验一与实验二,可以看出原理图输入法非常直观,而且便于理解,但是需要大量的时间来寻找元器件并进行布线;HDL输入法可以按功能分成多个模块,按需调用,有利于自顶向下的设计,但需要较强的逻辑理解能力。
五、实验体会:
通过本次实验,我基本上掌握了基于HDL语言的ISE设计流程,也熟悉了应用VerilogHDL来描述数字电路,而且也掌握了基于VerilogHDL的组合和时序逻辑电路的设计方法。
在本次实验中因为在写例化文件时出了一个小错误,结果使得我最后结果错误,真是让我意识到了在实验中不能忽视任何一个细节,必须面面俱到才能保证最后的成功,通过这次实验相信对我以后的学习生活都会有很大的帮助。