大连理工大学数字电路课程设计报告多功能数字时钟设计.docx
《大连理工大学数字电路课程设计报告多功能数字时钟设计.docx》由会员分享,可在线阅读,更多相关《大连理工大学数字电路课程设计报告多功能数字时钟设计.docx(31页珍藏版)》请在冰豆网上搜索。
大连理工大学数字电路课程设计报告多功能数字时钟设计
大连理工大学本科实验报告
题目:
多功能数字时钟设计
课程名称:
数字电路与系统课程设计
学院(系):
信息与通信工程学院
专业:
电子信息工程
班级:
学生姓名:
学号:
完成日期:
2014年7月16日
2014年7月16日
题目:
多功能数字时钟设计
1设计要求
1)具有“时”、“分”、“秒”及“模式”的十进制数字显示功能;
2)具有手动校时、校分功能,并能快速调节、一键复位(复位时间12时00分00秒);
3)具有整点报时功能,从00分00秒起,亮灯十秒钟;
4)具有秒表功能(精确至百分之一秒),具有开关键,可暂停、可一键清零;
5)具有闹钟功能,手动设置时间,并可快速调节,具有开关键,可一键复位(复位时间12时00分00秒),闹钟时间到亮灯十秒钟进行提醒;
6)具有倒计时功能(精确至百分之一秒),可手动设置倒计时时间,若无输入,系统默认60秒倒计时,且具有开关键,计时时间到亮灯十秒钟进行提醒,可一键复位(复位时间默认60秒)。
2设计分析及系统方案设计
2.1模式选择模块:
按键一进行模式选择,并利用数码管显示出当前模式。
模式一:
时钟显示功能;模式二:
时钟调节功能;模式三:
闹钟功能;模式四:
秒表功能;模式五:
倒计时功能。
2.2数字钟的基本功能部分:
包括时、分、秒的显示,手动调时,以及整点报时部分。
基本模块是由振荡器、分频器、计数器、译码器、显示器等几部分组成。
利用DE2硬件中提供的50MHZ晶振,经过分频得到周期为1s的时钟脉冲。
将该信号送入计数器进行计算,并把累加结果以“时”“分”“秒”的形式通过译码器由数码管显示出来。
具有复位按键1,在时钟模式下按下复位键后对时钟进行复位,复位时间12时00分00秒。
进入手动调时功能时,通过按键调节时间,每按下依次按键2,时钟时针加一,按下按键2一秒内未松手,时钟时针每秒钟加十;按键1对分针进行控制,原理与时针相同并通过译码器由七位数码管显示。
从00分00秒开始,数字钟进入整点报时功能(本设计中以一个LED灯代替蜂鸣器,进行报时),亮灯10秒钟进行提示。
2.3多功能数字钟的秒表功能部分:
计时范围从00分00.00秒至59分59.99秒。
可由复位键0异步清零,并由开关1控制计时开始与停止。
将DE2硬件中的50MHZ晶振经过分频获得周期为0.01秒的时钟脉冲,将信号送入计数器进行计算,并把累计结果通过译码器由七位数码管显示
2.4多功能数字钟的闹钟功能部分:
进入闹钟功能模式后,通过按键2(设定小时)和按键1(设定分钟)设定闹钟时间,当按下按键一秒内未松手时,可进行快速设定时间。
当时钟进入闹钟设定的时间(判断时钟的时信号时针,分针分别与闹钟设定的时信号时针、分针是否相等),则以LED灯连续亮10秒钟进行提示,并由开关0控制闹钟的开和关。
2.5多功能数字钟的倒计时功能部分:
可通过按键3(设定分针)和按键2(设定秒针)设定倒计时开始,当按下按键一秒内未松手时,可进行快速设定时间。
当没有手动时间设定时,系统默认为60秒倒计时。
倒计时的时钟与数字钟的时钟相同,每迎到一个1s时钟上升沿,则计数器减一。
计数器减至00时,分钟位、秒钟位保持为00。
倒计时结束时(即00分00秒),倒计时信号灯亮10秒钟进行提示,并由开关2控制倒计时的开始于停止。
本设计通过数据选择器控制译码器,使数码管独立显示,各功能之间互不影响。
当mode=“000”时,时钟功能,则对时钟信号进行译码,数码管显示时钟数据;
当mode=“001”时,时间校准功能,则对时钟信号进行译码,数码管显示闹钟数据;
当mode=“010”时,闹钟功能,则对闹钟信号进行译码,数码管显示闹钟信号数据;
当mode=“011”时,秒表功能,则对秒表信号进行译码,数码管显示秒表信号数据。
当mode=“100”时,则倒计时功能,对倒计时钟信号进行译码,数码管显示倒计时信号数据。
系统总体结构框图如下所示:
3系统以及模块硬件电路设计
3.1分频电路参数计算:
3.2系统硬件电路设计
系统硬件模拟图:
3.3系统与引脚分配
接口名称
类型(输入/输出)
引脚号
说明
clk
IN
PIN_N2
晶振50MHz时钟输入
selectmode
IN
PIN_W26
模式选择按键
rst
IN
PIN_G26
复位按键
add
IN
PIN_P23
高位设置键
dec
IN
PIN_N23
地位设置键
startnz
IN
PIN_N25
闹钟开关
startmb
IN
PIN_N26
秒表开关
startdjs
IN
PIN_P25
倒计时开关
lednz
OUT
PIN_AE23
闹钟提示灯
leddjs
OUT
PIN_AE22
倒计时提示灯
ledbs
OUT
PIN_Y18
整点报时提示灯
qss[6]
OUT
PIN_N9
时针高位数码管显示
qss[5]
OUT
PIN_P9
qss[4]
OUT
PIN_L7
qss[3]
OUT
PIN_L6
qss[2]
OUT
PIN_L9
qss[1]
OUT
PIN_L2
qss[0]
OUT
PIN_L3
qsg[6]
OUT
PIN_M4
时针低位数码管显示
qsg[5]
OUT
PIN_M5
qsg[4]
OUT
PIN_M3
qsg[3]
OUT
PIN_M2
qsg[2]
OUT
PIN_P3
qsg[1]
OUT
PIN_P4
qsg[0]
OUT
PIN_R2
qms[6]
OUT
PIN_W24
秒针高位数码管显示
qms[5]
OUT
PIN_U22
qms[4]
OUT
PIN_Y25
qms[3]
OUT
PIN_Y26
qms[2]
OUT
PIN_AA26
qms[1]
OUT
PIN_AA25
qms[0]
OUT
PIN_Y23
qmg[6]
OUT
PIN_Y24
秒针低位数码管显示
qmg[5]
OUT
PIN_AB25
qmg[4]
OUT
PIN_AB26
qmg[3]
OUT
PIN_AC26
qmg[2]
OUT
PIN_AC25
qmg[1]
OUT
PIN_V22
qmg[0]
OUT
PIN_AB23
qgs[6]
OUT
PIN_AB24
模式显示高位(默认全灭)
qgs[5]
OUT
PIN_AA23
qgs[4]
OUT
PIN_AA24
qgs[3]
OUT
PIN_Y22
qgs[2]
OUT
PIN_W21
qgs[1]
OUT
PIN_V21
qgs[0]
OUT
PIN_V20
模式显示低位
qgg[6]
OUT
PIN_V13
qgg[5]
OUT
PIN_V14
qgg[4]
OUT
PIN_AE11
qgg[3]
OUT
PIN_AD11
qgg[2]
OUT
PIN_AC12
qgg[1]
OUT
PIN_AB12
qgg[0]
OUT
PIN_AF10
qfs[6]
OUT
PIN_R3
分针高位数码管显示
qfs[5]
OUT
PIN_R4
qfs[4]
OUT
PIN_R5
qfs[3]
OUT
PIN_T9
qfs[2]
OUT
PIN_P7
qfs[1]
OUT
PIN_P6
qfs[0]
OUT
PIN_T2
qfg[6]
OUT
PIN_T3
分针低位数码管显示
qfg[5]
OUT
PIN_R6
qfg[4]
OUT
PIN_R7
qfg[3]
OUT
PIN_T4
qfg[2]
OUT
PIN_U2
qfg[1]
OUT
PIN_U1
qfg[0]
OUT
PIN_U9
4系统的VHDL设计
4.1顶层设计
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityliyabinis--实体声明,及系统输入与输出
port(clk,rst,add,dec,selectmode,startmb,startnz,startdjs:
instd_logic;
qgs,qgg,qss,qsg,qfs,qfg,qms,qmg:
bufferstd_logic_vector(6downto0);
ledbs,lednz,leddjs:
outstd_logic
);
end;
architecturedataofliyabinis
componentmode--模式循环模块元件例化
port(selectmode:
instd_logic;
mode:
bufferstd_logic_vector(2downto0)
);
endcomponent;
componentgnxz--功能选择模块元件例化
port(zt:
instd_logic_vector(2downto0);
sz1,sz2,sz3,sz4,sz5,sz6:
instd_logic_vector(3downto0);--时钟显示信号
mb1,mb2,mb3,mb4,mb5,mb6:
instd_logic_vector(3downto0);--秒表显示信号
nz3,nz4,nz5,nz6:
instd_logic_vector(3downto0);--闹钟显示信号
djs1,djs2,djs3,djs4,djs5,djs6:
instd_logic_vector(3downto0);--倒计时显示信号
s1,s2,s3,s4,s5,s6,s7,s8:
outstd_logic_vector(3downto0)--输出,送入显示模块用数码管进行显示
);
endcomponent;
componentfp--分频模块元件例化
port(clk,rst:
instd_logic;
clk10ms,clk100ms,clk1s:
outstd_logic);
endcomponent;
componentsz--时钟模块元件例化
port(zt:
instd_logic_vector(2downto0);
clk,clk100ms,rst,add,dec:
instd_logic;
sz1,sz2,sz3,sz4,sz5,sz6:
bufferstd_logic_vector(3downto0);
ledbs:
outstd_logic
);
endcomponent;
componentnz--闹钟模块元件例化
port(startnz,add,dec,rst,clk,clk100ms:
instd_logic;
zt:
instd_logic_vector(2downto0);
sz2,sz3,sz4,sz5,sz6:
instd_logic_vector(3downto0);--时钟显示信号
nz3,nz4,nz5,nz6:
bufferstd_logic_vector(3downto0);--闹钟显示信号]
lednz:
outstd_logic--闹钟提示灯输出
);
endcomponent;
componentmb--秒表模块元件例化
port(zt:
instd_logic_vector(2downto0);
clk,rst,startmb:
instd_logic;
mb1,mb2,mb3,mb4,mb5,mb6:
bufferstd_logic_vector(3downto0)
);
endcomponent;
componentdjs--倒计时模块元件例化
port(rst,startdjs,add,dec,clk,clk100ms:
instd_logic;
zt:
instd_logic_vector(2downto0);
djs1,djs2,djs3,djs4,djs5,djs6:
bufferstd_logic_vector(3downto0);
leddjs:
outstd_logic
);
endcomponent;
componentxs--显示模块元件例化
port(xsin:
instd_logic_vector(3downto0);--
xsout:
outstd_logic_vector(6downto0)
);
endcomponent;
signalclk10ms,clk100ms,clk1s,clk1m,clk1h:
std_logic;--分频脉冲信号级进位脉冲信号
signalsz1,sz2,sz3,sz4,sz5,sz6,sz33,sz55:
std_logic_vector(3downto0);--时钟显示信号
signalnz3,nz4,nz5,nz6:
std_logic_vector(3downto0);--闹钟显示信号
signalmb1,mb2,mb3,mb4,mb5,mb6:
std_logic_vector(3downto0);--秒表显示信号
signaldjs1,djs2,djs3,djs4,djs5,djs6:
std_logic_vector(3downto0);--倒计时显示信号
signals1,s2,s3,s4,s5,s6,s7,s8:
std_logic_vector(3downto0);--显示信号
signalzt:
std_logic_vector(2downto0);
begin--结构体
------------------------
------模式循环模块------
------------------------
u1:
modeportmap(selectmode,zt);
------------------------
------功能选择模块-----
------------------------
u2:
gnxzportmap(zt,sz1,sz2,sz3,sz4,sz5,sz6,
mb1,mb2,mb3,mb4,mb5,mb6,
nz3,nz4,nz5,nz6,
djs1,djs2,djs3,djs4,
s1,s2,s3,s4,s5,s6,s7,s8);
------------------------
--------分频模块--------
------------------------
u3:
fpportmap(clk,rst,clk10ms,clk100ms,clk1s);
------------------------
--------时钟模块--------
------------------------
u4:
szportmap(zt,clk1s,clk100ms,rst,add,dec,sz1,sz2,sz3,sz4,sz5,sz6,ledbs);
------------------------
--------闹钟模块-------
------------------------
u5:
nzportmap(startnz,add,dec,rst,clk1s,clk100ms,
zt,sz2,sz3,sz4,sz5,sz6,nz3,nz4,nz5,nz6,lednz);
------------------------
--------秒表模块--------
------------------------
u6:
mbportmap(zt,clk10ms,rst,startmb,mb1,mb2,mb3,mb4,mb5,mb6);
------------------------
--------倒计时模块------
------------------------
u7:
djsportmap(rst,startdjs,add,dec,clk10ms,clk100ms,
zt,djs1,djs2,djs3,djs4,djs5,djs6,leddjs);
-----------------------------
---------显示模块------------
-----------------------------
show1:
xsportmap(s1,qmg);
show2:
xsportmap(s2,qms);
show3:
xsportmap(s3,qfg);
show4:
xsportmap(s4,qfs);
show5:
xsportmap(s5,qsg);
show6:
xsportmap(s6,qss);
show7:
xsportmap(s7,qgg);
show8:
xsportmap(s8,qgs);
end;--结束
4.2分频模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfpis
port(clk,rst:
instd_logic;
clk10ms,clk100ms,clk1s:
outstd_logic);
end;
architecturedataoffpis
begin
--50兆分频,产生clk1s,作为始时钟的秒计时脉冲
process(clk,rst)
variablenum:
integerrange0to49999999;
begin
ifrst='0'then
num:
=0;
elsifrising_edge(clk)then
ifnum=49999999then
num:
=0;
clk1s<='1';
else
num:
=num+1;
clk1s<='0';
endif;
endif;
endprocess;
--5兆分频,产生clk100ms(即clk0.1s),作为快速调整时间的脉冲信号
process(clk,rst)
variablenum:
integerrange0to4999999;
begin
ifrst='0'then
num:
=0;
elsifrising_edge(clk)then
ifnum=4999999then
num:
=0;
clk100ms<='1';
else
num:
=num+1;
clk100ms<='0';
endif;
endif;
endprocess;
--5兆分频,产生clk10ms(即clk0.01s)作为秒表计时脉冲
process(clk,rst)
variablenum:
integerrange0to499999;
begin
ifrst='0'then
num:
=0;
elsifrising_edge(clk)then
ifnum=499999then
num:
=0;
clk10ms<='1';
else
num:
=num+1;
clk10ms<='0';
endif;
endif;
endprocess;
end;
4.3模式循环模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymodeis--实体声明
port(selectmode:
instd_logic;
mode:
bufferstd_logic_vector(2downto0)
);
end;
architecturedataofmodeis
begin
process(selectmode)
begin
ifrising_edge(selectmode)then--模式循环计数器
ifmode="100"then
mode<="000";
elsemode<=mode+1;
endif;
endif;
endprocess;
end;
4.4功能选择模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitygnxzis--实体声明
port(zt:
instd_logic_vector(2downto0);
sz1,sz2,sz3,sz4,sz5,sz6:
instd_logic_vector(3downto0);--时钟显示信号
mb1,mb2,mb3,mb4,mb5,mb6:
instd_logic_vector(3downto0);--秒表显示信号
nz1,nz2,nz3,nz4,nz5,nz6:
instd_logic_vector(3downto0);--闹钟显示信号
djs1,djs2,djs3,djs4,djs5,djs6:
instd_logic_vector(3downto0);--倒计时显示信号
s1,s2,s3,s4,s5,s6,s7,s8:
outstd_logic_vector(3downto0)--输出,送入显示模块用数码管进行显示
);
end;
architecturedataofgnxzis
begin
process(zt,sz1,sz2,sz3,sz4,sz5,sz6,--选择译码器数日信号
nz3,nz4,nz5,nz6,
mb1,mb2,mb3,mb4,mb5,mb6,
djs1,djs2,djs3,djs4,djs5,djs6)
begin
ifzt="000"then--1时钟显示
s1<=sz1;s2<=sz2;s3<=sz3;s4<=sz4;s5<=sz5;s6<=sz6;s7<="0001";s8<="1111";
elsifzt="001"then--2调整
s1<=sz1;s2<=sz2;s3<=sz3;s4<=sz4;s5<=sz5;s6<=sz6;s7<="0010";s8<="1111";
elsifzt="010"then--3闹钟
s1<="0000";s2<="0000";s3<=nz3;s4<=nz4;s5<=nz5;s6<=nz6;s7<="0011";s8<="1111";
elsifzt="0