数字时钟.docx
《数字时钟.docx》由会员分享,可在线阅读,更多相关《数字时钟.docx(12页珍藏版)》请在冰豆网上搜索。
![数字时钟.docx](https://file1.bdocx.com/fileroot1/2022-12/11/40156a4a-63f2-4077-9e11-43c1a26d4e7b/40156a4a-63f2-4077-9e11-43c1a26d4e7b1.gif)
数字时钟
郑州航空工业管理学院
EDA技术及应用课程设计说明书
2013届电子信息系工程专业1313084班级
题目多功能数字时钟
学号1313084
姓名洪*
指导教师王**程*张*
二О一五年六月二十五日
一、
数字时钟基本原理
这个时钟由六部分组成:
整分报时部分,led点亮部分,秒信号产生部分、计时处理部分、按键消抖处理部分,定数码管动态扫描显示部分六部分。
一个时钟的准确与否主要取决秒脉冲的精确度。
为了保证计时准确我们对系统时钟48MHz进行了48000000分频,从而得到1Hz的秒脉冲。
至于显示部分与LED数码管原理相同。
二,实现功能
能实现时钟的基本功能,能实现计时,暂停,清零功能。
另外增加了led闪烁,整分钟报时功能。
三,数字时钟的硬件设计
图1数字时钟原理图
原理图是对实验程序的综合,是程序看起来更简洁明了,本实验的原理图有两个输入clk,key,四个输出beep,dig,seg,led。
按键为两位的,clk为一位的,beep为一位的,dig,seg,led都为七位。
通过原理图把各个部分连接起来使程序连接为一个整体。
图2芯片图
图三管脚分配图
图四数码管图
图五实验结果图
表1元器件表
序号
器件名称
参数
数量
1
电阻
1000欧姆
14
2
10千欧姆
10
3
50欧姆
1
4
500欧姆
8
5
数码管
4位共阴极
2
6
钟振
12MHz,4引脚
1
7
独石电容
0.1μF
6
8
电解电容
50V,10μF
1
9
按键
4引脚
4
10
三极管
NPN
9
11
电路板
——
1
12
双排插头
10针
1
13
电源接插线
含20cm电源线
1
14
发光二极管
红
3
15
发光二极管
绿
3
16
底座
——
1
17
CPLD
4引脚,PLCC封装
1
四,数字时钟的Verilog实现
moduleclock(clk,key,dig,seg,led,beep);//模块名clock
inputclk;//输入
regbeep;//寄存器
outputbeep;//输入时钟
reg[24:
0]count1;//寄存器
input[1:
0]key;//输入按键
output[7:
0]dig;//数码管选择输出引脚
output[7:
0]seg;//数码管段输出引脚
output[7:
0]led;
reg[7:
0]seg_r;//定义数码管输出寄存器
reg[7:
0]dig_r;//定义数码管选择输出寄存器
reg[3:
0]disp_dat;//定义显示数据寄存器
reg[24:
0]count;//定义计数寄存器
reg[23:
0]hour;//定义现在时刻寄存器
regsec,keyen;//定义标志位
reg[1:
0]dout1,dout2,dout3;
reg[7:
0]led;//寄存器
wire[1:
0]key_done;//按键消抖输出
assigndig=dig_r;//输出数码管选择
assignseg=seg_r;//输出数码管译码结果
//整分报时部分
always@(posedgeclk)
begin
if(hour[7:
4]==0&hour[3:
0]<=3)//判断是否秒的十位为0秒的个位小于3
begin
count1=count1+1;//分频部分产生方波
if(count1==240000)
begin
count1=0;
beep=~beep;//蜂鸣器发出声音
end
end
end
//led点亮部分
always
begin
if(hour[3:
0]==0|hour[3:
0]==2|hour[3:
0]==4|hour[3:
0]==6|hour[3:
0]==8)
led=8'b10101010;//当秒的个位为2,4,6,8时led2468点亮
elseled=8'b01010101;//否则led1357点亮
end
//秒信号产生部分
always@(posedgeclk)//定义clock上升沿触发
begin
count=count+1'b1;
if(count==25'd24000000)//0.5S到了吗?
begin
count=25'd0;//计数器清零
sec=~sec;//置位秒标志
end
end
//按键消抖处理部分
assignkey_done=(dout1|dout2|dout3);//按键消抖输出
always@(posedgecount[17])
begin
dout1<=key;
dout2<=dout1;
dout3<=dout2;
end
always@(negedgekey_done[0])
begin
keyen=~keyen;//将琴键开关转换为乒乓开关
end
//数码管动态扫描显示部分
always@(posedgeclk)//count[17:
15]大约1ms改变一次
begin
case(count[17:
15])//选择扫描显示数据
3'd0:
disp_dat=hour[3:
0];//秒个位
3'd1:
disp_dat=hour[7:
4];//秒十位
3'd2:
disp_dat=4'ha;//显示"-"
3'd3:
disp_dat=hour[11:
8];//分个位
3'd4:
disp_dat=hour[15:
12];//分十位
3'd5:
disp_dat=4'ha;//显示"-"
3'd6:
disp_dat=hour[19:
16];//时个位
3'd7:
disp_dat=hour[23:
20];//时十位
endcase
case(count[17:
15])//选择数码管显示位
3'd0:
dig_r=8'b11111110;//选择第一个数码管显示
3'd1:
dig_r=8'b11111101;//选择第二个数码管显示
3'd2:
dig_r=8'b11111011;//选择第三个数码管显示
3'd3:
dig_r=8'b11110111;//选择第四个数码管显示
3'd4:
dig_r=8'b11101111;//选择第五个数码管显示
3'd5:
dig_r=8'b11011111;//选择第六个数码管显示
3'd6:
dig_r=8'b10111111;//选择第七个数码管显示
3'd7:
dig_r=8'b01111111;//选择第八个数码管显示
endcase
end
always@(posedgeclk)
begin
case(disp_dat)
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示3
4'h4:
seg_r=8'h99;//显示4
4'h5:
seg_r=8'h92;//显示5
4'h6:
seg_r=8'h82;//显示6
4'h7:
seg_r=8'hf8;//显示7
4'h8:
seg_r=8'h80;//显示8
4'h9:
seg_r=8'h90;//显示9
4'ha:
seg_r=8'hbf;//显示-
default:
seg_r=8'hff;//不显示
endcase
if((count[17:
15]==3'd2)&sec)
seg_r=8'hff;
end
//计时处理部分
always@(negedgesecornegedgekey_done[1])//计时处理
begin
if(!
key_done[1])//是清零键吗?
begin
hour=24'h0;//是,则清零
end
elseif(!
keyen)
begin
hour[3:
0]=hour[3:
0]+1'b1;//秒加1
if(hour[3:
0]==4'ha)
begin
hour[3:
0]=4'h0;
hour[7:
4]=hour[7:
4]+1'b1;//秒的十位加一
if(hour[7:
4]==4'h6)
begin
hour[7:
4]=4'h0;
hour[11:
8]=hour[11:
8]+1'b1;//分个位加一
if(hour[11:
8]==4'ha)
begin
hour[11:
8]=4'h0;
hour[15:
12]=hour[15:
12]+1'b1;//分十位加一
if(hour[15:
12]==4'h6)
begin
hour[15:
12]=4'h0;
hour[19:
16]=hour[19:
16]+1'b1;//时个位加一
if(hour[19:
16]==4'ha)
begin
hour[19:
16]=4'h0;
hour[23:
20]=hour[23:
20]+1'b1;//时十位加一
end
if(hour[23:
16]==8'h24)
hour[23:
16]=8'h0;
end
end
end
end
end
end
endmodule
五,课程设计总结
这次课程设计虽然只有短短的几天,但我的收获却很大。
通过这次实习,我掌握了EDA设计的基本流程(即设计输入—编译—调试—仿真—下载),领会了自顶而下结构化设计的优点,并具备了初步的EDA程序设计能力。
我感觉,这个程序最难的地方在于顶层模块的设计,因为顶层模块需要将各个子模块按照电路原理有机地结合起来,这需要扎实的理论功底,而这正是我所欠缺的。
相比而言,子模块的设计就容易多了,因为Verilog语言和C语言有很多相似之处,只要明白了实验原理,就不难完成,水平的高下只体现在程序的简洁与否。
Verilog源程序的编写很容易出现错误,这就需要耐心的调试。
因为很多情况下,一长串的错误往往是由一个不经意的小错误引起的。
当程序屡调屡错的时候,最好和其他同学沟通交流一下,他们不经意的一句话,就可能给我启发,使问题迎刃而解。
这次设计,给我感触最深的还是行为态度问题。
人的能力有大有小,但只要端正态度,不抛弃,不放弃,任何人都能取得令自己满意的成绩。
在此,我由衷的感谢在这次课程设计中给了我巨大帮助的老师和同学们!
六,指导教师评语
成绩指导教师签名