硬件描述最终报告.docx
- 文档编号:9263146
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:13
- 大小:516.45KB
硬件描述最终报告.docx
《硬件描述最终报告.docx》由会员分享,可在线阅读,更多相关《硬件描述最终报告.docx(13页珍藏版)》请在冰点文库上搜索。
硬件描述最终报告
深圳大学实验报告
课程名称:
硬件描述语言
实验项目名称:
基于DE2和Quatus软件的时钟设计
学院:
电子科学与技术
专业:
电子科学与技术
指导教师:
报告人:
学号:
班级:
实验报告提交时间:
一.实验目的:
通过学习HDL硬件描述语言,然后基于DE2开发板和quatus软件进行时钟设计,按照分别编写出秒脉冲产生模块、秒计时模块、分钟计时模块、小时计时模块以及数码管显示模块,接着进行调用各个模块,使用quatus软件进行仿真,最后再实物烧写程序调试。
二.实验内容、过程及结果
整体设计思路:
HDL硬件描述语言采用自顶向下的设计:
从顶层进行功能划分和结构设计。
通过DE2板自带的时钟频率,通过分频器进行分频成1HZ的脉冲,输入到秒计数器中,秒计数器每30秒产生一次时钟翻转,将产生的时钟又传给下一个分钟计数模块,分钟又将自己进位产生的时钟信号传给小时计数器,形成一个完整时钟。
最后通过译码模块将时分秒译码出来,时钟基本功能完成。
图1:
整体模块图
各个模块如下:
一:
分频器模块:
(1)目的:
将输入的27Mhz信号分解为1Hz信号。
(2)思路:
每次上升沿来临时,中间变量加一,加到13499999时输出的变量反转一次,则可以实现27Hz到1HZ信号的转变。
仿真效果图:
将中间变量13499999变成10,从图中可以看出,每过11个周期,one_second端信号翻转一次,说明分频器功能实现。
图2:
分频器秒脉冲
实验现象:
以一个led灯作为分频器的输出,程序烧写到DE2中观测到LED灯每秒中闪烁一次,说明程序功能实现。
代码如下:
moduledivider(one_second,reset,clk);//分频器模块
outputone_second;
inputreset,clk;
regone_second;
reg[23:
0]cnt;
always@(posedgeclk)
begin
if(reset)
begin
cnt<=0;
one_second<=0;
end//同步复位
elseif(cnt===13499999)//中间变量为13499999时执行,时钟频率为27Mhz,从而形
//成1HZ的时钟
begin
cnt<=0;
one_second<=~one_second;//每0.5秒翻转一次
end
else
cnt<=cnt+1;//中间变量不为13499999时,执行cnt加一运算
end
endmodule
二:
60进制计数器
目的:
当输入时钟信号时,使用always语句,当来时钟的上升沿时,计数器加一,到59时,输入进位信号,进位信号当做下个时钟信号的输入。
思路:
图3:
60进制仿真实验
图4:
加入译码模块的仿真图
代码:
modulesecond(qout,cout,reset,clk);
output[7:
0]qout;
outputcout;
inputclk,reset;
reg[7:
0]qout;
regcout;
always@(posedgeclkorposedgereset)//clk上升沿时刻计数
begin
if(reset)qout<=0;//同步复位
else
begin
if(qout[3:
0]==9)//低位是否为9,是则
begin
qout[3:
0]<=0;//回0,并判断高位是否为5
if(qout[7:
4]==5)
begin
qout[7:
4]<=0;
cout<=1'b1;
end
else
qout[7:
4]<=qout[7:
4]+1;//高位不为5,则加1
end
else//低位不为9,则加1
begin
qout[3:
0]<=qout[3:
0]+1;
cout<=0;
end
end
end
endmodule
三:
24进制计数器
思路:
与60进制计数器类似,当输入时钟信号时,时钟加一,加到24时,不需要进位。
仿真:
图5:
24进制计数器
modulehour(qout,reset,clk);
output[7:
0]qout;
inputclk,reset;
reg[7:
0]qout;
regcout;
always@(posedgeclkorposedgereset)//clk上升沿时刻计数
begin
if(reset)qout<=0;//同步复位
else
begin
if(qout[3:
0]==3&&qout[7:
4]==2)
begin
qout<=0;//判断是否为23,是则归零
end
elseif(qout[3:
0]==9)//低位是否为9,是则
begin
qout[3:
0]<=0;
qout[7:
4]<=qout[7:
4]+1;
end
else//低位不为9,则加1
begin
qout[3:
0]<=qout[3:
0]+1;
end
end
end
endmodule
四:
译码器模块
(1)目的:
将输入的数以固定的数字编码输出。
(2)思路:
将数码管0~9十个数字的编码编号,当输入0~9中的数字时,用case语句选择将其输出。
(3)现象:
以四个拨码开关作为输入,当输入不同的数字编码时,数码显示相应的编码。
代码如下:
moduledecode4_7(decodeout,indec);
output[6:
0]decodeout;
input[3:
0]indec;//4位十进制表示1位十进制数
reg[6:
0]decodeout;
always@(indec)
begin
case(indec)//用case语句进行译码//此处数码管为共阴
4'd0:
decodeout=7'b1000000;
4'd1:
decodeout=7'b1111001;
4'd2:
decodeout=7'b0100100;
4'd3:
decodeout=7'b0110000;
4'd4:
decodeout=7'b0011001;
4'd5:
decodeout=7'b0010010;
4'd6:
decodeout=7'b0000010;
4'd7:
decodeout=7'b1111000;
4'd8:
decodeout=7'b0000000;
4'd9:
decodeout=7'b0010000;
default:
decodeout=7'bz;
endcase
end
endmodule
五,各模块综合情况:
通过在一个总的模块当中调用各个子模块,从而实现时钟功能,同时实现置数和复位功能。
总的仿真图如下:
图6:
总体仿真效果图
说明:
reset复位端
clk时钟输入
one_minute分的时钟信号
one_hour小时的时钟信号
second0,minute1,hour2时钟,分钟,秒钟的输出
decodeout0,decodeout1,decodeout2,decodeout3,decodeout4,decodeout5译码后的时钟信号输出
引脚分配图:
三.实验结果:
(1)在烧入到实物电路板后得到的结果:
可以正常计时
(2)按下复位键后的结果:
秒钟分钟小时全部置数为0
4.实验总结和心得体会:
(1)在此次的数字钟设计过程中,我更进一步地熟悉有关数字电路的知识和具体应用。
学会了利用QuarterII软件进行原理图的绘制,硬件描述语言VHDL的编写,程序的仿真等工作。
更深层次的了解到VHDL语言的书写语法规则和各个引脚分配,并能根据仿真结果分析设计的存在的问题和缺陷,从而进行程序的调试和完善。
(2)在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如在对具体模块的仿真的过程中,往往没有考虑到整体设计的层面以及与上下模块接口的设计。
再加上器件对信号的延时等问题,实际下载硬件电路上后会出现一系列的问题,因此仿真图和电路连接图还是有一定区别的。
此次的数字钟设计重在于按键的控制和各个模块代码的编写,虽然能把键盘接口和各个模块的代码编写出来,并能正常显示,但对于各个模块的优化设计还有一定的缺陷和不足。
这就造成了在当初根据仿真结果认为不存在问题的程序,烧录到电路板中,却出现无法预料到的各种突发情况。
(3)在模块设立的明细下,程序的初步编写和编译通过都十分的简单,然而,对每个子模块的编译过程,还是会出现一些错误,比如,定义的端口没有给引脚。
中间变量在未定义和定义过程中出现的一些无法预料的情况。
在完善代码的过程当中,我们更加熟悉了Verilog代码的语法规则、代码编写习惯和开发流程,以及相应的开发模式。
(4)在完成整个计时器代码的过程中,学习到了很多课堂上不能充分理解的知识,如在代码编写过程中,遇到的各种语法错误和中间变量为定义的各种情况。
通过自己摸索和与同学的讨论,更进一步的了解对于硬件语言所需要掌握的基础知识。
在学习和编写的过程中,慢慢体会整个硬件语言程序的编写路程和思维模式。
在今后的学习中一定会更加注意对一个程序层次结构和模块调用的思想的运用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬件 描述 最终 报告