基于VerilogHDL设计的数字时钟.docx
《基于VerilogHDL设计的数字时钟.docx》由会员分享,可在线阅读,更多相关《基于VerilogHDL设计的数字时钟.docx(16页珍藏版)》请在冰豆网上搜索。
基于VerilogHDL设计的数字时钟
基于Verilog-HDL设计的数字时钟
————————————————————————————————作者:
————————————————————————————————日期:
ﻩ
深圳大学考试答题纸
(以论文、报告等形式考核专用)ﻫ二○ 18 ~二○19 学年度第 一 学期
课程编号
1602080001
课程名称
硬件描述语言与逻辑综合
主讲教师
刘春平
评分
学号
姓名
李思豪
专业年级
电子科学与技术16级1班
教师评语:
题目:
基于VerilogHDL设计的数字时钟
摘要:
本文利用VerilogHDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Altera QuartusⅡ6.0和cyclnoeII EP2C35F672C6完成综合、仿真。
此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中
关键词:
VerilogHDL;硬件描述语言;FPGA
一、实验任务3
实验目的ﻩ3
实验要求ﻩ3
二、设计思路ﻩ3
三、实验结果ﻩ10
四、总结与收获ﻩ14
1、实验任务
实验目的
1.深入了解基于quartusii工具的复杂时序逻辑电路的设计。
2.理解并熟练利用EDA工具进行综合设计。
3.熟练掌握芯片烧录的流程及步骤。
4.掌握VerilogHDL语言的语法规范及时序电路描述方法。
实验要求
设计一个带秒表功能的24小时数字钟,它包括以下几个组成部分:
① 显示屏,由6个七段数码管组成,用于显示当前时间(时:
分,秒)或设置的秒表时间;
②复位键复位所有显示和计数
③设置键,用于确定新的时间设置,三个消抖按键分别用于时分秒的设置
④ 秒表键,用于切换成秒表功能
基本要求
(1)计时功能:
这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。
(2) 秒表功能:
设置时间,进行倒计时功能
(3)设置新的计时器时间:
按下设置键后,用户能通过时分秒三个消抖按键对时间进行设置。
二、设计思路
1、总原理框图:
原理如上图所示,时钟由分频器模块,数码管显示模块,计时器模块三个模块构成,每个模块实现如下的不同功能,最后通过在顶层模块的调用,来实现时钟功能。
2.顶层模块:
顶层模块调用三个字模块,并且定义输入输出口,代码输入所示:
modulemyclock2(daojishi,stop,clk,reset,shi,fen,miao,miaoout1,miaoout2,fenout1,fenout2,shiout1,shiout2);
inputclk,reset,stop,shi,fen,miao,daojishi;
output[6:
0]miaoout1,miaoout2,fenout1,fenout2,shiout1,shiout2;
wire[3:
0] miao1,miao2,fen1,fen2,shi1,shi2;
wireclk_1hz;
divider_1HZdivider1hz(clk_1hz,reset,clk);
countcount1(daojishi,shi,fen,miao,stop,miao1,miao2,fen1,fen2,shi1,shi2,reset,clk_1hz);
decode4_7d0(miaoout1,miao1);
decode4_7d1(miaoout2,miao2);
decode4_7 d2(fenout1,fen1);
decode4_7d3(fenout2,fen2);
decode4_7d4(shiout1,shi1);
decode4_7d5(shiout2,shi2);
endmodule
输入输出端口类型功能表:
引脚名
类型
功能
daojishi
input
秒表倒计时模式
stop
input
暂停按键
clk
input
晶振脉冲
reset
input
复位按键
shi
input
小时调节按键
fen
input
分钟调节按键
miao
input
秒调节按键
miaoout1
output
秒个位数码管输出
miaoout2
output
秒十位数码管输出
fenout1
output
分个位数码管输出
fenout2
output
分十位数码管输出
shiout1
output
时个位数码管输出
shiout2
output
时十位数码管输出
三个子模块的原理和代码:
(1)分频模块:
分频模块的作用主要是要获得各种频率的时钟信号。
输入信号27MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对27MHZ信号分频。
通过计数的方式,当计数从0开始到13999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。
对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。
模块代码如下:
moduledivider_1HZ(clk_1hz,reset,clk);
outputclk_1hz;
inputreset,clk;
reg clk_1hz;
reg[23:
0] count;
always @(posedgeclk)
begin
if(reset)
begin
count<=0;
clk_1hz<=0;
end
else
begin
ﻩif(count==13499999)
ﻩbegin
ﻩcount<=0;
ﻩﻩclk_1hz<=~clk_1hz;
ﻩend
ﻩelse
ﻩcount<=count+1;//计数
ﻩﻩ
end
end
endmodule
(2)译码显示模块:
一、数码管显示:
通过传入响应的十进制数,运用case语句转换输出相应的7位二进制显示码,送入数码管显示。
代码如下:
moduledecode4_7(temp,indec);
output[6:
0] temp;
input[3:
0]indec;
reg[6:
0]temp;
always @(indec)
begin
case(indec)//用case 语句进行译码
4'd0:
temp[6:
0]=7'b1000000;
4'd1:
temp[6:
0]=7'b1111001;
4'd2:
temp[6:
0]=7'b0100100;
4'd3:
temp[6:
0]=7'b0110000;
4'd4:
temp[6:
0]=7'b0011001;
4'd5:
temp[6:
0]=7'b0010010;
4'd6:
temp[6:
0]=7'b0000010;
4'd7:
temp[6:
0]=7'b1111000;
4'd8:
temp[6:
0]=7'b0000000;
4'd9:
temp[6:
0]=7'b0010000;
default:
temp=7'bz;
endcase
end
endmodule
(3)、计时器模块:
秒计数:
在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。
分钟计数:
在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。
小时计数:
脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。
如果有复位信号,则时分秒全部清零。
计时器模块还包含了设置时间 和秒表切换的功能
部分代码如下:
module count(daojishi,shi,fen,miao,stop,miao1,miao2,fen1,fen2,shi1,shi2,reset,clk_1hz);
inputreset,clk_1hz,stop,daojishi;
inputshi,fen,miao;
output miao1,miao2,fen1,fen2,shi1,shi2;
reg[3:
0] miao1,miao2,fen1,fen2,shi1,shi2;
always @(posedgeclk_1hz)
begin
if(reset)
begin
miao1<=0;miao2<=0;fen1<=0;fen2<=0;shi1<=0;shi2<=0;
end
if(stop==1)
begin //秒调节
if(miao==0)
begin
miao1<=miao1+1;
if(miao1==9)
begin
miao1<=0;
miao2<=miao2+1;
if(miao2==5)
begin
miao2<=0;
end
end
end
if(fen==0)//分调节
begin
fen1<=fen1+1;
if(fen1==9)
begin
fen1<=0;
fen2<=fen2+1;
if(fen2==5)
begin
fen2<=0;
end
end
end
if(shi==0)//时调节
begin
shi1<=shi1+1;
if(shi1==9||((shi1==3)&&(shi2==2)))
begin
shi1<=0;
shi2<=shi2+1;
if(shi2>=2)
begin
shi2<=0;
end
end
end
end
if((!
reset)&&(stop==0))
begin
if(daojishi==0) //时钟程序
begin
ﻩ miao1<=miao1+1;
if(miao1==9)
begin
ﻩ miao1<=0;
miao2<=miao2+1;
if(miao2==5)
begin
miao2<=0;
fen1<=fen1+1;
if(fen1==9)
begin
fen1<=0;
fen2<=fen2+1;
if(fen2==5)
begin
fen2<=0;
shi1<=shi1+1;
if((shi1==9)||((shi1==3)&&(shi2==2)))
begin
shi1<=0;
shi2<=shi2+1;
if(shi2==2)
begin
shi2<=0;
end
end
end
end
end
end
end
else //倒计时程序
begin
if(!
((shi1==0)&&(shi2==0)&&(fen1==0)&&(fen2==0)&&(miao2==0)&&(miao1==0)))
begin
miao1<=miao1-1;
if(miao1==0)
begin
ﻩﻩmiao1<=9;
miao2<=miao2-1;
if(miao2==0)
begin
miao2<=5;
fen1<=fen1-1;
if(fen1==0)
begin
fen1<=9;
fen2<=fen2-1;
if(fen2==0)
begin
fen2<=5;
shi1<=shi1-1;
if(shi1==0)
begin
shi1<=9;
shi2<=shi2-1;
if(shi2==0)
begin
shi2<=0;
end
end
end
end
end
end
end
end
end
end
endmodule
3.引脚排布:
如下所示:
引脚分布图
二、实验结果
(1)波形仿真
在Quartus II中利用仿真波形进行功能或时序仿真的基本步骤如下:
(1)创建新的矢量波形文件(*.vwf).
(2)添加输入、输出节点。
(3)编译输入节点的波形。
(4)完成矢量波形文件的创建之后,用户即可以对设计进行功能或时序仿真。
(5)仿真启动后,状态窗口会同时自动打开,在状态窗口中显示仿真进度及所用时间。
(6)默认情况下,仿真器报告窗口内在仿真过程中会显示仿真波形部分,其中还包括当前仿真器的设置信息和仿真信息等。
下面我们单独对三个子模块分别进行仿真并分析仿真结果:
(1)分频器模块仿真结果:
分频器仿真图
仿真分析:
我们取时钟信号的周期是20ns,为了让仿真结果更明显,取每三个时钟周期让秒脉冲clk_1hz翻转一次,而不是1349999翻转一次。
并且让reset复位信号在仿真的160ns-300ns有效。
结果如图所示,在每三个时钟信号出现时,秒脉冲都会翻转一次,在reset信号有效时,秒脉冲无输出,仿真结果符合预计要求。
(2)显示译码模块仿真结果:
数码管输出数字8仿真图
数码管输出数字8仿真图
仿真结果分析:
indec是我们要输出的十进制数,temp是连接7段数码的7位二进制数,已知数码管为共阴极数码管。
我们设定indec为8,从图中可以看见temp[7:
0]都是0;所以7个数码管都会被点亮,就是显示8。
我们再设定indec为1,可以预见1在数码管中应该是亮两个,如第二图所示只有temp[1]和temp[2]是0,所以就是亮两个灯,显示1。
仿真结果符合设计要求。
(3)计时器模块仿真结果:
计数器计数仿真图
计数器复位测试仿真图
仿真结果:
miao1,miao2,fen1,fen2,shi1,shi2分别是秒分时的个位和十位,时钟脉冲clk_1hz每一个上升沿,miao1就加1,miao1再依次进位给更高的为。
如图所示,当miao1计数到9的时候,miao2加1,当miao2计数到5的时候,fen1加1,时钟计数功能实现,仿真符合设计要求。
图二是复位信号reset的测试,当reset为1有效时,累计的时间清零。
如图所以,当reset=1时,miao1,miao2,fen1,fen2,shi1,shi2全部变0,仿真符合技术要求。
此模块还有设置时间和倒计时的功能,但是在波形仿真中不够直观,所以不做波形仿真。
(2)DE2开发板实现
将开发板插入电脑中,烧录进程序,进行各项功能测试,包括计时功能,时间调节功能,秒表功能,复位功能,暂停功能。
实验过程记录:
(1)烧录程序完成,DE2立刻开始从0秒计数,依次向分钟,小时进位,当时间为
23:
59:
59时,下一秒全部跳0;时钟功能实现。
(2)复位功能测试:
switch0为复位信号按键,拨下该按键,时间清零,复位功能实现。
(3)暂停功能测试:
switch1为暂停信号按键,拨下该按键,时间暂停,暂停功能实现。
(4)时间设置测试:
消抖按钮key0,key1,key2,分别是秒分时设置键。
按下暂停键,
计数停止,每按一下key0,秒加一;每按一下key1,分加一;每按一下key2,小时加一。
时间设置完成,回拨暂停键,时钟从设置的时间开始计时。
时间设置功能实现。
(5)秒表倒计时功能测试:
switch2为倒计时信号按键,拨下该键后,时钟开始倒计时,倒计时功能实现。
测试完成,所有测试结果符合设计要求,完成verilong时钟设计。
四、总结与心得体会
在QuartusII开发环境下,采用自顶向下的设计方法有利于在早期发现结构设计中的错误,避免不必要的重复设计。
再结合基于FPGA 的可编程实验板,轻轻松松就能实现各种电子产品的设计,现场观察实验测试结果。
大大缩短了产品的设计周期和调试周期,提高了设计的可靠性和成功率,充分体现了可编程逻辑器件在数字电路设计中的优越性。
在经过了四个星期的编写和仿真后,终于完成了设计要求,这次设计,我克服了很多关于设计问题方面的困难,特别是对verilog语法和规则的不熟悉导致很多困难,最后使我对QuartusII软件的使用有了更进一步的了解,同时也积累了一些经验。
很多时候我们想要的功能,写出来的代码,并不是正确的,需要不断的调试,要理论联系实际,这样才能更快的完成设计任务。