verilog数字钟课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程设计题目:数字钟系统
学号:201420130228
学生姓名: 刘进辉
专业:通信工程
班级:1421301
指导教师:钟凯老师
2017年1 月1 日
目录
一.摘要 (3)
二.概念及原理 (4)
三.实验过程及分析 (5)
四.实验心得 (7)
五.参考文献 (7)
六.实验代码 (8)
七.评分表 (14)
摘要
在社会快速发展的今天,时钟在人们的生活中显得越发重要,因此设计数字钟就变得尤为重要。

本文介绍一种利用verilog语言产生多功能数字钟的设计方案,不仅让大家对数字钟更为了解,而且可以为人们的生活带来便利。

数字钟它具有时、分、秒的正常显示功能及调节时和分的特殊功能,此外,以24小时循环计数,具有整点报时功能,并且由按键输入进行对数字钟的校时、清零功能。

本文设计的数字钟方案由控制模块、计时模块、以及报时模块三大模块组成,满足所有的功能要求,并且代码是经modelsim软件编译和仿真所设计。

二.概念及原理
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。

由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路。

如图所示为数字钟的一般构成框图。

主要包括时间基准电路、计数器电路、控制电路。

其中的控制逻辑电路是比较灵活多样的,不断完善它可以增强数字钟的功能。

数字钟应该具有的功能有:显示时—分—秒、整点报时、小时和分钟可调等基本功能。

整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23。

在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,小时他的范围是从0~23,所以可以均用一个4位的二进制码显示十位和个位。

对于整点报时功能,本实验设计的是当进行正点发出一个高音信号和59分50、5254、56、58秒发出一个高音信号。

调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时;S2调整分钟,每按下一次,分钟增加一分钟。

另用外reset按键作为系统时钟复位,复位后全部显示00—00—00。

三.实验过程及分析
1.功能:显示时—分—秒、整点报时、小时和分钟可调等基本功能。

整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23。

仿真图:
由图可知:hour_g,minute_s,minute_g,second_s,second_g分别对应于时、分、秒的十和个位,显然可以正常显示并满足条件。

2.功能:对于整点报时功能,本实验设计的是当进行正点发出一个高音信号和59分50、5254、56、58秒发出一个高音信号。

仿真图:
上图可知在50、52、54、56、58秒时有一个高电平脉冲信号发出低音,在正点时有一个高脉冲信号发出高音。

3. 功能:调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时;S2调整分钟,每按下一次,分钟增加一分钟。

另用外reset 按键作为系统时钟复位,复位后全部显示00—00—00。

仿真图:
上图可知,通过按键S1,S2控制了时和分的校准功能,并且通过reset键控制清除功能。

四.实验心得
通过本次verilog的数字钟课程设计,不仅巩固了所学的相关知识,还对其有了更加深刻的认识。

学东西,基本功要学的扎实,这样会给上层建筑带来难以想象的益处,就如在本次实验中的测试模块的函数调用的内置变量的摆放位置的不当,导致程序无法得出自己想要的结果,还要不断的去检查,盲目的修改,耗时巨大。

另有一些编程的小技巧,这点钟凯老师的功劳很大,虽然原理一样,但是用不同的方式去编写,有时会取得不一样的结果。

这次实验考验的不仅是学生的基本功,而且考察学生自我学习,自我查找相关资料主动学习的能力,一路自己做下来,会收获你想象不到的东西。

这或许就是能力的提高吧。

在最后感谢钟凯老师的耐心解疑,学生受益匪浅。

六.参考文献
【1】《数字系统设计与Verilog HDL》第五版王金明编著电子工业出版社【2】刘君,常明,秦娟,《基于硬件描述语言(VHDL)的数字时钟设计》,天津理工大学学报,2007,第23卷第4期,40-41。

【3】王开军,姜宇柏,《面向CPLD/FPGA的VHDL设计》,机械工业出版社,2006,28-65。

六.实验代码
module
kongzhi_count(clk,S1,S2,reset,hour_s,hour_g,minute_s,minute_g,second_s,second_g,cout_1,cou t_2,alarm_clock_low,alarm_clock_high);
input clk,S1,S2,reset;
output reg[3:0] hour_s,hour_g,minute_s,minute_g,second_s,second_g ;
output wire cout_1,cout_2;
output reg alarm_clock_low,alarm_clock_high;
reg R1,R2;
always @(posedge clk)
begin
if(S1==1)
begin
R1=1;
end
else if(S2==1)
begin
R2=1;
end
end
always @(posedge clk) //秒个位显示
begin
if(~reset)
second_g <= 0;
else if(second_g==9)
second_g <= 0;
else
second_g <= second_g + 1;
end
always @(posedge clk) //秒十位显示
begin
if(~reset)
second_s<= 0;
else if(second_g==9)
begin
if(second_s==5)
second_s<= 0;
else
second_s <= second_s + 1;
end
end
assign cout_1=((second_g==9)&&(second_s==5))?1:0; always @(posedge clk) //分个位显示
begin
if(~reset)
begin
minute_g <= 0;
end
else if(R2==1)
begin
if(minute_g==9)
minute_g <= 0;
else
begin
minute_g<= minute_g+ 1;
end
R2<=0;
end
else if(cout_1)
begin
second_g<=0;
second_s<=0;
if(minute_g==9)
minute_g <= 0;
else
minute_g<= minute_g+ 1;
end
end
always @(posedge clk) //分十位显示
begin
if(~reset)
begin
minute_s <= 0;
end
else if(R2==1)
begin
if(minute_g==9)
begin
if(minute_s==5)
minute_g <= 0;
else
minute_s <= minute_s + 1;
end
R2<=0;
end
else if(cout_1)
begin
second_g<=0;
second_s<=0;
if(minute_g==9)
begin
if(minute_s==5)
minute_g <= 0;
else
minute_s <= minute_s + 1;
end
end
end
assign
cout_2=(((minute_g==9)&&(minute_s==5)&&(cout_1==1))||((minute_g==9)&&(minute_s==5)& &(S2==1)))?1:0;
always @(posedge clk) //时个位显示
begin
if(~reset)
begin
hour_g <= 0;
end
else if(R1==1)
begin
if(hour_g==9)
hour_g <= 0;
else if((hour_s==2)&&(hour_g==3))
hour_g <= 0;
else
begin
hour_g <= hour_g+ 1;
end
R1<=0;
end
else if(cout_2)
begin
second_g<=0;
second_s<=0;
minute_g<=0;
minute_s<=0;
if(hour_g==9)
hour_g <= 0;
else if((hour_s==2)&&(hour_g==3))
hour_g <= 0;
else
hour_g <= hour_g+ 1;
end
end
always @(posedge clk) //时十位显示begin
if(~reset)
begin
hour_s<= 0;
end
else if(R1==1)
begin
if((hour_g==3)&&(hour_s==2)) hour_s <= 0;
else if(hour_g==9)
begin
hour_s <= hour_s + 1;
end
R1<=0;
end
else if(cout_2)
begin
second_g<=0;
second_s<=0;
minute_g<=0;
minute_s<=0;
if((hour_g==3)&&(hour_s==2))
hour_s <= 0;
else if(hour_g==9)
hour_s <= hour_s + 1;
end
end
always @(posedge clk) //低音警报begin
if(!reset)
begin
alarm_clock_low<=0;
end
else if((minute_g==9)&&(minute_s==5))
if(((second_s==4)&&(second_g==9))||((second_s==5)&&(second_g==1))||((second_s==5)&&(sec ond_g==3))||((second_s==5)&&(second_g==5))||((second_s==5)&&(second_g==7)))
alarm_clock_low<=1;
else
alarm_clock_low<=0;
end
always @(posedge clk) //高音警报
begin
if(!reset)
begin
alarm_clock_high<=0;
end
else if(cout_2)
alarm_clock_high<=1;
else
alarm_clock_high<=0;
end
Endmodule
module clock_test();
reg clk,reset,S1,S2;
wire[3:0] hour_s,hour_g,minute_s,minute_g,second_s,second_g;
wire cout_1,cout_2,alarm_clock_low,alarm_clock_high;
parameter cycle = 100;
kongzhi_count
u1(.clk(clk),.S1(S1),.S2(S2),.reset(reset),.hour_s(hour_s),.hour_g(hour_g),.minute_s(minute_s),.m inute_g(minute_g),.second_s(second_s),.second_g(second_g),.cout_1(cout_1),.cout_2(cout_2),.a larm_clock_low(alarm_clock_low),.alarm_clock_high(alarm_clock_high));
always
#(cycle/2) clk = ~clk;
initial
begin
clk = 0;
reset = 1;
S1=0;
S2=0;
#300 reset = 0; #100 reset = 1;
#100 S1=1;
#100 S1=0;
#100 S2=1;
#100 S2=0;
#100 S1=1;
#100 S1=0;
#100 S2=1;
#100 S2=0;
end endmodule
东华理工大学
课程设计评分表
学生姓名:刘进辉班级:1421301 学号:201420130228课程设计题目:数字钟系统。

相关文档
最新文档