1、FPGA实验二基于HDL的十进制计数器FPGA课程报告设计题目:基于HDL的十进制计数器学生班级:学生学号:学生姓名:指导教师:时 间:成 绩:一、实验目的:1.掌握基于语言的ISE设计全流程;2.熟悉、应用VerilogHDL描述数字电路;3.掌握基于Verilog的组合和时序逻辑电路的设计方法。二、实验原理:本次实验是使用Verilog HDL进行编写十进制计数器与显示器代码而进行的实验,实验原理图如下: 本次实验的内容包括十进制计数器模块,七段译码显示器模块,以及消抖模块。 十进制计数器:对输入时钟进行计数 输入:CLK -待计数的时钟CLR -异步清零信号,当CLR =1,输出复位为0
2、,当CLR =0,正常计数ENA-使能控制信号,当ENA=1,电路正常累加计数,否则电路不工作输出:SUM3:0- 计数值的个位。即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。COUT -计数值的十位进位,即:只有在时钟CLK上升沿检测到SUM=9时,COUT将被置1,其余情况下COUT=0;LED显示驱动模块:输入:sum3:0 -待显示的数值out6:0 -驱动数码管的七位数值七段数码管的字符显示真值表如下:消抖模块:三、实验过程:1.首先建立一个新的工程,添加一个新的Verilog Module,在其中编写十进制计数模块的代码,如下:module liao1(C
3、LR,CLK,ENA,SUM,COUT ); input CLR,CLK,ENA;output3:0 SUM;output COUT;reg3:0 SUM;reg COUT;always(posedge CLK or posedge CLR) if(CLR) begin SUM=4b0000; COUT=1b0; end else if(ENA) beginif(SUM=9) begin SUM=4b0000; COUT=1b1; end else begin SUM=SUM+1b1; COUT=1b0; end endendmodule然后执行综合,确认无误后,新建一个Test Bench
4、WaveForm文件,进行仿真,仿真图如下:2.再新建一个Verilog Module,在其中编写七段数码显示模块的代码,如下:module liao2(SUM,out );input3:0 SUM;output6:0 out;reg 6:0 out;always (SUM) begin case(SUM) 4b0000: out=7b0000001; 4b0001: out=7b1001111; 4b0010: out=7b0010010; 4b0011: out=7b0000110; 4b0100: out=7b1001100; 4b0101: out=7b0100100; 4b0110:
5、 out=7b0100000; 4b0111: out=7b0001111; 4b1000: out=7b0000000; 4b1001: out=7b0000100; default :out=7b0000001; endcase endendmodule执行综合,确认无误后新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:3.添加消抖模块,然后再新建一个Verilog Module,编写例化文件,制成顶层文件,其例化文件代码如下:module liao(CLK_50M,CLK,CLR,ENA,COUT,out );input CLR,CLK,ENA;input CL
6、K_50M;output6:0 out;output COUT;wire3:0 SUM;debounce_module u1(CLK_50M,CLR,CLK,clk_out);liao1 u2(CLR,clk_out,ENA,SUM,COUT);liao2 u3(SUM,out);endmodule保存之后形成顶层文件:4.执行综合,确认无误后,根据实验指导书进行锁引脚操作: 锁引脚完成后,修改、编辑约束文件: 5. 生成下载配置文件,下载到开发板进行经行验证。四、实验思考题:1. 如何用两个或一个always 实现十进制计数模块?写出相应代码。module liao1(CLR,CLK,ENA
7、,SUM,COUT ); input CLR,CLK,ENA;output3:0 SUM;output COUT;reg3:0 SUM;reg COUT;always(posedge CLK or posedge CLR) if(CLR) begin SUM=4b0000; COUT=1b0; end else if(ENA) beginif(SUM=9) begin SUM=4b0000; COUT=1b1; end else begin SUM=SUM+1b1; COUT=1b0; end endendmodule2.如何用always,或assign实现数码管的驱动设计? 写出相应代码。
8、module liao2(SUM,out );input3:0 SUM;output6:0 out;reg 6:0 out;always (SUM) begin case(SUM) 4b0000: out=7b0000001; 4b0001: out=7b1001111; 4b0010: out=7b0010010; 4b0011: out=7b0000110; 4b0100: out=7b1001100; 4b0101: out=7b0100100; 4b0110: out=7b0100000; 4b0111: out=7b0001111; 4b1000: out=7b0000000; 4b
9、1001: out=7b0000100; default :out=7b0000001; endcase endendmodule3.比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境。答:通过做实验一与实验二,可以看出原理图输入法非常直观,而且便于理解,但是需要大量的时间来寻找元器件并进行布线;HDL输入法可以按功能分成多个模块,按需调用,有利于自顶向下的设计,但需要较强的逻辑理解能力。五、实验体会: 通过本次实验,我基本上掌握了基于HDL语言的ISE设计流程,也熟悉了应用Verilog HDL来描述数字电路,而且也掌握了基于Verilog HDL的组合和时序逻辑电路的设计方法。在本次实验中因为在写例化文件时出了一个小错误,结果使得我最后结果错误,真是让我意识到了在实验中不能忽视任何一个细节,必须面面俱到才能保证最后的成功,通过这次实验相信对我以后的学习生活都会有很大的帮助。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1