数电课设vhdl数字钟设计.docx
《数电课设vhdl数字钟设计.docx》由会员分享,可在线阅读,更多相关《数电课设vhdl数字钟设计.docx(21页珍藏版)》请在冰豆网上搜索。
![数电课设vhdl数字钟设计.docx](https://file1.bdocx.com/fileroot1/2023-4/21/d37eb888-c5f6-4cc1-9a25-ce07130d3b74/d37eb888-c5f6-4cc1-9a25-ce07130d3b741.gif)
数电课设vhdl数字钟设计
大连理工大学本科实验报告
题目:
数字钟的设计
课程名称:
数字电路课程设计
学院(系):
电子信息与电气工程学部
专业:
*************
班级:
*********
学生姓名:
****
学号:
********
完成日期:
*********
成绩:
2012年12月28日
实验题目:
多功能数字钟的设计
一、设计要求
1.能够显示基本的数字钟并能自主运行。
2.数字钟能够进行调时,包括小时分钟秒钟都能调。
3.在接近整点时led灯会闪烁提示,并且整点时另一个led灯会提示。
4.数字钟能够转变成秒表并能运行与暂停,秒表能够进行一键清零。
5.数字钟还能够转变成倒计时,倒计时范围可手动调节,在倒计时停止时会有led灯闪烁提示。
二、设计分析与系统方案设计
1.数字钟的基本功能部分,包括时、分、秒的显示,手动调时,以及整点报时部分。
基本模块是由振荡器、分频器、计数器、译码器、显示器等几部分组成。
利用硬件中提供的50MHZ晶振,经过分频得到周期为1s的时钟脉冲。
将该信号送入计数器进行计算,并把累加结果以“时”“分”“秒”的形式通过译码器由数码管显示出来。
进入手动调时功能时,通过按键改变控制计数器的时钟周期,使用0.5s的时钟脉冲进行调时计数(KEY1调秒,LOAD2调分,LOAD3调时),并通过译码器由七位数码管显示。
从59分50秒开始,数字钟进入整点报时功能。
每隔两秒提示一次。
(本设计中以两个LED灯代替蜂鸣器,进行报时)
2.多功能数字钟的秒表功能部分,计时范围从00分00.00秒至59分59.99秒。
可由输入信号(RST1)异步清零,并由按键(EN1)控制计时开始与停止。
将硬件中的50MHZ晶振经过分频获得周期为0.01秒的时钟脉冲,将信号送入计数器进行计算,并把累计结果通过译码器由七位数码管显示。
3.多功能数字钟的倒计时功能部分,可通过按键(LOAD6调秒,LOAD7调分,LOAD8调时)设定倒计时开始时刻。
倒计时的时钟与数字钟的时钟相同,每迎到一个时钟上升沿,则计数器减一。
计数器减至00时,分钟位、秒钟位恢复至59,时钟位恢复至23。
倒计时结束时(即00时00分00秒)。
本设计通过数据选择器控制译码器,使数码管独立显示,各功能之间互不影响。
当LOAD4为高电平,则对秒表信号进行译码,数码管显示秒表数据;当LOAD4为低电平,LOAD5为高电平,则对倒计时信号进行译码,数码管显示倒计时信号数据;当LOAD4,LOAD5全为低电平,则对正常时钟信号进行译码,数码管显示时钟信号数据。
系统总体结构框图
三、系统以及模块硬件电路设计
硬件模块包含与,或,非多个基本逻辑单元,由硬件芯片内部提供,软件编程是为了目的性的操作硬件。
50MHZ分频如下
根据上式得到周期分别为1s,0.01s,0.5s的时钟。
系统硬件电路设计图如下
实验接口引脚连接如下
接口
名称
类型
(输入/输出)
结构图上
的信号名
引脚号
说明
clk
Input
Pin_N2
2
50MHzclock信号
En1
Input
Pin_P2
1
秒表运行使能段
EN2
Input
Pin_B13
2
倒计时运行使能段
KEY1
Input
Pin_N23
5
秒钟调节按键
Led1
Output
Pin_AF23
7
接近整点显示
Led2
Output
Pin_AB21
7
整点显示
Load1
Input
Pin_V2
1
时钟运行使能端
Load2
Input
Pin_U4
1
数字钟分钟调节按键
Load3
Input
Pin_V1
1
数字时钟调节按键
Load4
Input
Pin_T7
1
选择秒表显示
Load5
Input
Pin_A13
4
选择倒计时显示
Load6
Input
Pin_AF14
3
倒计时初始秒钟设定
Load7
Input
Pin_AD13
8
倒计时初始分钟设定
Load8
Input
Pin_AC13
8
倒计时初始时钟设定
q1[0]
Output
Pin_AF10
8
秒钟低位数码管显示
q1[1]
Output
Pin_AB12
8
q1[2]
Output
Pin_AC12
8
q1[3]
Output
Pin_AD11
8
q1[4]
Output
Pin_AE11
8
q1[5]
Output
Pin_V14
8
q1[6]
Output
Pin_V13
8
q2[0]
Output
Pin_V20
6
秒钟高位数码管显示
q2[1]
Output
Pin_V21
6
q2[2]
Output
Pin_W21
6
q2[3]
Output
Pin_Y22
6
q2[4]
Output
Pin_AA24
6
q2[5]
Output
Pin_AA23
6
q2[6]
Output
Pin_AB24
6
q3[0]
Output
Pin_AB23
6
分钟低位数码管显示
q3[1]
Output
Pin_V22
6
q3[2]
Output
Pin_AC25
6
q3[3]
Output
Pin_AC26
6
q3[4]
Output
Pin_AB26
6
q3[5]
Output
Pin_AB25
6
q3[6]
Output
Pin_Y24
6
q4[0]
Output
Pin_Y23
6
分钟高位数码管显示
分钟高位数码管显示
q4[1]
Output
Pin_AA25
6
q4[2]
Output
Pin_AA26
6
q4[3]
Output
Pin_Y26
6
q4[4]
Output
Pin_Y25
6
q4[5]
Output
Pin_U22
6
q4[6]
Output
Pin_W24
6
q5[0]
Output
Pin_U9
1
q5[1]
Output
Pin_U1
1
q5[2]
Output
Pin_U2
1
小时低位数码管显示
q5[3]
Output
Pin_T4
1
q5[4]
Output
Pin_R7
1
q5[5]
Output
Pin_R6
1
q5[6]
Output
Pin_T3
1
q6[0]
Output
Pin_T2
1
小时高位数码管显示
q6[1]
Output
Pin_P6
1
q6[2]
Output
Pin_P7
1
q6[3]
Output
Pin_T9
1
q6[4]
Output
Pin_R5
1
q6[5]
Output
Pin_R4
1
q6[6]
Output
Pin_R3
1
rst1
Input
Pin_P1
1
秒表异步清零
Rst2
Input
Pin_C13
4
倒计时异步清零
四、系统的程序设计
1.分频模块
process(clk)
begin
ifrising_edge(clk)then
ifp1=49then
p1<=0;cp1<='1';
else
p1<=p1+1;cp1<='0';
endif;
endif;
endprocess;
process(cp1)
begin
ifrising_edge(cp1)then
ifp2=999then
p2<=0;cp2<='1';
else
p2<=p2+1;cp2<='0';
endif;
endif;
endprocess;
process(cp2)
begin
ifrising_edge(cp2)then
ifp3=999then
p3<=0;cp3<='1';
elsep3<=p3+1;cp3<='0';
endif;
endif;
endprocess;
process(cp2)
begin
ifrising_edge(cp2)then
ifa="1001"thena<="0000";a1<='1';
elsea<=a+1;a1<='0';
endif;
endif;
endprocess;
process(cp2)
begin
ifrising_edge(cp2)then
ifclfsa=499then
clfsa<=0;hlfs<='1';
else
clfsa<=clfsa+1;hlfs<='0';
endif;
endif;
endprocess;
(1)分频模块进行了三次大的分频
Ø首先乘以50得到CP1也就是0.000001s的信号
Ø在CP1的基础上继续分频乘以1000得到cp2就是0.001s信号
Ø在cp2的基础上分频乘以1000得到cp3就是1s的信号
(2)利用cp2(0.001s)信号加一个模10计数器变成al信号即为0.01s信号用于秒表计时
(3)利用cp2(0.001s)信号加一个模500计数器变成hlfs信号即为0.5s信号用于时钟以及秒表的设定
2.数字钟模块
process(cp3,load1,key1)
begin
ifrising_edge(cp3)then
ifload1='1'then
ifkey1='0'then
ifqq2="0101"andqq1="1001"
thenqq1<="0000";qq2<="0000";
elsifqq1="1001"then
qq1<="0000";qq2<=qq2+1;
elseqq1<=qq1+1;
endif;
endif;
elseifload1='0'then
ifqq2="0101"andqq1="1001"
thenqq1<="0000";qq2<="0000";cp4<='1';
elsifqq1="1001"then
qq1<="0000";qq2<=qq2+1;cp4<='0';
elseqq1<=qq1+1;cp4<='0';
endif;
ifqq2="0101"anden='1'then--整点报时
caseqq1is
when"0001"=>led1<='1';
when"0011"=>led1<='1';
when"0101"=>led1<='1';
when"0111"=>led1<='1';
when"1001"=>led2<='1';
whenothers=>led1<='0';led2<='0';
endcase;
elseled1<='0';led2<='0';
endif;
endif;
endif;
endif;
endprocess;
process(hlfs,cp4,load2)
begin
ifload2='1'thenclkx<=hlfs;elseclkx<=cp4;endif;
ifrising_edge(clkx)then
ifqq4="0101"andqq3="1001"
thenqq3<="0000";qq4<="0000";cp5<='1';
elsifqq3="1001"then
qq3<="0000";qq4<=qq4+1;cp5<='0';
elseqq3<=qq3+1;cp5<='0';
endif;
endif;
ifqq3="1001"andqq4="0101"
thenen<='1';
elseen<='0';
endif;
endprocess;
process(hlfs,cp5,load1)
begin
ifload3='1'thenclkx1<=hlfs;elseclkx1<=cp5;endif;
ifrising_edge(clkx1)then
ifqq5="0011"andqq6="0010"then
qq5<="0000";qq6<="0000";
elsifqq5="1001"then
qq5<="0000";qq6<=qq6+1;
elseqq5<=qq5+1;
endif;
endif;
endprocess;
数字钟模块在load1=1,key1=0时进行秒钟手动调节
Load1=0时运行秒钟并设定整点报时
Load2=1时进行分钟手动调节
Load2=0时运行分钟
Load3=1时进行时钟手动调节
Load3=0时运行时钟
3.秒表模块
process(a1,rst1,en1)--秒表计数器
begin
ifrst1='1'thenb<="0000";c<="0000";--秒表异步清零
elsifrising_edge(a1)then
ifen1='1'then
ifb="1001"andc="1001"
thenb<="0000";c<="0000";c1<='1';
elsifb="1001"then
b<="0000";c<=c+1;c1<='0';
elseb<=b+1;c1<='0';
endif;
endif;
endif;
endprocess;
process(c1,rst1,en1)
begin
ifrst1='1'thend<="0000";e<="0000";
elsifrising_edge(c1)then
ifen1='1'then
ifd="1001"ande="0101"
thend<="0000";e<="0000";e1<='1';
elsifd="1001"then
d<="0000";e<=e+1;e1<='0';
elsed<=d+1;e1<='0';
endif;endif;
endif;
endprocess;
process(e1,rst1,en1)
begin
ifrst1='1'thenf<="0000";g<="0000";
elsifrising_edge(e1)then
ifen1='1'then
iff="1001"andg="0101"
thenf<="0000";g<="0000";
elsiff="1001"then
f<="0000";g<=g+1;
elsef<=f+1;
endif;
endif;
endif;
endprocess;
秒表模块中Rse1=1时秒表异步清零利用上升沿a1当en1=1时运行秒表并进行进位处理与时钟相类似,en1=0时秒表暂停。
4.倒计时模块
process(cp3,rst2,en2,clkx2,load6,hlfs)--倒计时计数器
begin
ifload6='1'thenclkx2<=hlfs;elseclkx2<=cp3;endif;
ifrst2='1'thenz2<="0000";z1<="0000";alz1<='1';--倒计时异步清零
elsifrising_edge(clkx2)then
ifen2='1'then
ifz2="0000"andz1="0000"
thenz2<="0101";z1<="1001";alz1<='1';
elsifz1="0000"then
z1<="1001";z2<=z2-1;alz1<='0';
elsez1<=z1-1;alz1<='0';
endif;
ifalz5='1'then
ifz1="0001"andz2="0000"
thenled3<='1';elseled3<='0';
endif;endif;
endif;
endif;
endprocess;
process(alz1,rst2,en2,load7,clkx3,hlfs)
begin
ifload7='1'thenclkx3<=hlfs;elseclkx3<=alz1;endif;
ifrst2='1'thenz4<="0000";z3<="0000";alz2<='1';
elsifrising_edge(clkx3)then
ifz4="0000"andz3="0000"
thenz4<="0101";z3<="1001";alz2<='1';
elsifz3="0000"then
z3<="1001";z4<=z4-1;alz2<='0';
elsez3<=z3-1;alz2<='0';
endif;
ifalz4='1'then
ifz4<="0000"andz3<="0000"
thenalz5<='1';
elsealz5<='0';endif;
endif;
endif;
endprocess;
process(clkx4,alz2,rst2,en2,load8,hlfs)
begin
ifload8='1'thenclkx4<=hlfs;elseclkx4<=alz2;endif;
ifrst2='1'thenz6<="0000";z5<="0000";
elsifrising_edge(clkx4)then
ifz6="0000"andz5="0000"
thenz6<="0010";z5<="0011";
elsifz5="0000"then
z5<="1001";z6<=z6-1;
elsez5<=z5-1;
endif;
ifz5="0000"andz6="0000"thenalz4<='1';elsealz4<='0';endif;
endif;
endprocess;
倒计时模块中当LOAD4为低电平,LOAD5为高电平时,数码管显示倒计时。
当EN2为高电平,倒计时开始;当EN2为低电平,倒计时中止。
当RST2为高电平,倒计时归零。
由LOAD8,LOAD7,LOAD6分别对倒计时初始时刻的时、分、秒进行设定。
5.功能选择模块
process(qq1,qq2,qq3,qq4,qq5,qq6,b,c,d,e,f,g,load4,load5,z1,z2,z3,z4,z5,z6)
begin
ifload4='1'thenvis1<=b;vis2<=c;vis3<=d;vis4<=e;vis5<=f;vis6<=g;
elsifload5='1'thenvis1<=z1;vis2<=z2;vis3<=z3;vis4<=z4;vis5<=z5;vis6<=z6;
elsevis1<=qq1;vis2<=qq2;vis3<=qq3;vis4<=qq4;vis5<=qq5;vis6<=qq6;
endif;
endprocess;
对系统的功能进行选择load4=1为运行秒表
Load5=1为运行倒计时
其余情况为运行时钟。
6.显示模块
process(vis1,vis2,vis3,vis4,vis5,vis6)
begin
casevis1is
when"0000"=>q1<="1000000";
when"0001"=>q1<="1111001";
when"0010"=>q1<="0100100";
when"0011"=>q1<="0110000";
when"0100"=>q1<="0011001";
when"0101"=>q1<="0010010";
when"0110"=>q1<="0000010";
when"0111"=>q1<="1111000";
when"1000"=>q1<="0000000";
when"1001"=>q1<="0010000";
whenothers=>null;
endcase;
casevis2is
when"0000"=>q2<="1000000";
when"0001"=>q2<="1111001";
when"0010"=>q2<="0100100";
when"0011"=>q2<="0110000";
when"0100"=>q2<="0011001";
when"0101"=>q2<="0010010";
when"0110"=>q2<="0000010";
when"0111"=>q2<="1111000";
when"1000"=>q2<="0000000";
when"1001"=>q2<="0010000";
whenothers=>null;
endcase;
casevis3is
when"0000"=>q3<="1000000";
when"0001"=>q3<="1111001";
when"0010"=>q3<="0100100";
when"0011"=>q3<="0110000";
when"0100"=>q3<="0011001";
when"0101"=>q3<="0010010";
when"0110"=>q3<="0000010";
when"0111"=>q3<="1111000";
when"1000"=>q3<="0000000";
when"1001"=>q3<="0010000";
whenothers=>null;
endcase;
casevis4is
when"0000"=>q4<="1000000";
when"0001"=>q4<="1111001";
when"0010"=>q4<="0100100";
when"0011"=>q4<="