EDA闹钟系统设计.docx

上传人:b****4 文档编号:3930538 上传时间:2022-11-26 格式:DOCX 页数:19 大小:187.24KB
下载 相关 举报
EDA闹钟系统设计.docx_第1页
第1页 / 共19页
EDA闹钟系统设计.docx_第2页
第2页 / 共19页
EDA闹钟系统设计.docx_第3页
第3页 / 共19页
EDA闹钟系统设计.docx_第4页
第4页 / 共19页
EDA闹钟系统设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

EDA闹钟系统设计.docx

《EDA闹钟系统设计.docx》由会员分享,可在线阅读,更多相关《EDA闹钟系统设计.docx(19页珍藏版)》请在冰豆网上搜索。

EDA闹钟系统设计.docx

EDA闹钟系统设计

 

毕业设计

课程基于VHDL语言的毕业设计

题目闹钟系统设计

院系四川师范大学成都学院

专业班级通信工程

学生姓名冯崇飞

学生学号2007101010

指导教师梅芳芳

 

 

2010年3月12日

课程设计任务书

课程EDA技术课程设计

题目闹钟系统的设计

专业电子信息工程姓名学号

主要内容、基本要求、主要参考资料等

主要内容:

设计并制作一个带闹钟功能的24小时计时器。

它包括以下几个组成部分:

1、显示屏,由4个七段数码管组成,用于显示当前时间(时:

分)或设置的闹钟时间;

2、数字键,实现‘0’—‘9’的输入,用于输入新的时间或新的闹钟时间;

3、TIME(时间)键,用于确定新的时间设置;

4、ALARM(闹钟)键,用于确定新的闹钟时间设置,或显示已设置的闹钟时间;

5、扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声

基本要求:

1、计时功能:

这是本计时器设计的基本功能,每隔一分钟计时一次,并在显示屏上显示当前时间。

2、闹钟功能:

如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声。

3、设置新的计时器时间:

用户用数字键输入新的时间,然后按"TIME"键确认。

在输入过程中,输入数字在显示屏上从右到左依次显示。

例如,用户要设置新的时间12:

34,则按顺序输入“1”,“2”,“3”,“4”,与之对应,显示屏上依次显示的信息为:

“1”,“12”,“123”,“1234"。

如果用户在输入任意几个数字后较长时间内,例如5s,没有按任何键,则计时器恢复到正常的计时显示状态。

主要参考资料:

[1]潘松著.EDA技术实用教程(第二版).北京:

科学出版社,2005.

[2]康华光主编.电子技术基础模拟部分.北京:

高教出版社,2006.

[3]阎石主编.数字电子技术基础.北京:

高教出版社,2003.

完成期限2010.3.12

指导教师

专业负责人

2010年3月8日

一、总体设计思想

1.基本原理

数字闹钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。

秒计数器的计数时钟CLK为1Hz的标准信号。

当数字闹钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号时、分、秒的计时结果通过6个数码管来动态显示。

因此,通过模式选择信号KEY1、KEY2控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定闹钟分、时5个状态。

当数字闹钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位,分的进位;当数字闹钟处于调整时间状态时,被调的分或时会一秒一秒地增加;当数字钟处于闹钟定时状态时,可以设定小时和分;当计时到所设定的时刻时,驱动扬声器,持续1分钟。

2.设计框图

 

 

二、设计步骤和调试过程

1、总体设计电路

(1)CLK为外部时钟信号,RESET为复位信号.

(2)当KEY为高电平(KEY='1')时,表示用户按下数字键("0"~"9").

(3)当ALARM_BUTTON为高电平时,表示用户按下"ALARM"键.

(4)当TIME_BUTTON为高电平时,表示用户按下"TIME"键.

(5)当LOAD_NEW_A为高电平时,控制(闹钟时间寄存器)加载新的闹钟时间值.

(6)当LOAD_NEW_C为高电平时,控制(时钟计数器)设置新的时间值.

(7)当SHOW_NEW_TIME为高电平时,控制(七段数码显示电路)显示新的时间值,即用户通过数字键输入的时间;否则,当SHOW_NEW_TIME为低电平时,根据SHOW_A信号的值控制显示当前时间或闹钟时间.

根据设计要求及端口设置,需要五个状态来实现:

S0:

表示电路初态即正常时钟计数状态,完成前面设计功能

(1)的工作.

S1:

接收键盘输入状态.在状态S0时用户按下数字键后进入此状态.在此状态下,显示屏上显示的是用户键入的数字.

S2:

设置新的闹钟时间.在状态S1时用户按下ALARM键后进入此状态.

S3:

设置新的计时器时间.在状态S1时用户按下TIME键后进入此状态.

S4:

显示闹钟时间.在状态S0时用户直接按下ALARM键后进入此状态.

在此状态下,显示屏上显示的是所设置的闹钟时间.注意:

在此状态下,用户按下ALARM键后,显示屏上保持显示闹钟时间,经过一段时间以后,再返回状态S0。

2、模块设计和相应模块程序

(1)顶层文件:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYclockIS

PORT(CLK12MHZ:

INSTD_LOGIC;

CLK8HZ:

INSTD_LOGIC;

SPKOUT:

OUTSTD_LOGIC;

CLK:

INSTD_LOGIC;

KEY1:

INSTD_LOGIC;

KEY2:

INSTD_LOGIC_VECTOR(1DOWNTO0);

H1,H2,M1,M2,S1,S2:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

END;

ARCHITECTUREoneOFclockIS

COMPONENTshizhong

PORT(clk:

instd_logic;

md1:

instd_logic;

md2:

instd_logic_vector(1downto0);

clken:

outstd_logic;

h1,h2,m1,m2,s1,s2:

outstd_logic_vector(3downto0));

ENDCOMPONENT;

COMPONENTNoteTabs

PORT(clk:

INSTD_LOGIC;

ToneIndex:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDCOMPONENT;

COMPONENTToneTaba

PORT(Index:

INSTD_LOGIC_VECTOR(3DOWNTO0);

Tone:

OUTSTD_LOGIC_VECTOR(10DOWNTO0);

en:

instd_logic);

ENDCOMPONENT;

COMPONENTSpeakera

PORT(clk:

INSTD_LOGIC;

Tone:

INSTD_LOGIC_VECTOR(10DOWNTO0);

SpkS:

OUTSTD_LOGIC);

ENDCOMPONENT;

SIGNALTone:

STD_LOGIC_VECTOR(10DOWNTO0);

SIGNALToneIndex:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALclken:

STD_LOGIC;

SIGNALen:

STD_LOGIC;

BEGIN

u1:

ShizhongPORTMAP(clk=>CLK,md1=>KEY1,md2=>KEY2,clken=>en,

h1=>h1,h2=>h2,m1=>m1,m2=>m2,s1=>s1,s2=>s2);

u2:

NoteTabsPORTMAP(clk=>CLK8HZ,ToneIndex=>ToneIndex);

u3:

ToneTabaPORTMAP(Index=>ToneIndex,Tone=>Tone,en=>en);

u4:

SpeakeraPORTMAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);

END;

(2)时钟控制模块:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityshizhongis

port(clk:

instd_logic;

md1:

instd_logic;

md2:

instd_logic_vector(1downto0);

clken:

outstd_logic;

h1,h2,m1,m2,s1,s2:

outstd_logic_vector(3downto0));

endshizhong;

architectureoneofshizhongis

signalhou1:

std_logic_vector(3downto0);

signalhou2:

std_logic_vector(3downto0);

signalmin1:

std_logic_vector(3downto0);

signalmin2:

std_logic_vector(3downto0);

signalseth1:

std_logic_vector(3downto0);

signalseth2:

std_logic_vector(3downto0);

signalsetm1:

std_logic_vector(3downto0);

signalsetm2:

std_logic_vector(3downto0);

signalsec1:

std_logic_vector(3downto0);

signalsec2:

std_logic_vector(3downto0);

begin

-----------------------------------------------小时十位

h110:

process(clk,hou2,min1,min2,sec1,sec2,md1,md2)

begin

ifclk'eventandclk='1'then

if(hou1="0010"andhou2="0011")and(min1="0101"andmin2="1001")

and(sec1="0101"andsec2="1001")then

hou1<="0000";

elsifhou1="0010"andhou2="0011"andmd1='0'

andmd2="01"then--当时间为23点且处于校时状态时

hou1<="0000";

elsif(hou2="1001"and(min1="0101"andmin2="1001")

and(sec1="0101"andsec2="1001"))or(hou2="1001"andmd1='0'andmd2="01")

then

hou1<=hou1+1;

endif;

endif;

endprocessh110;

-----------------------------------------------小时个位

h220:

process(clk,min1,min2,sec1,sec2,md1,md2,hou1)

begin

ifclk'eventandclk='1'then

if(hou1="0010"andhou2="0011")and(min1="0101"andmin2="1001")

and(sec1="0101"andsec2="1001")then

hou2<="0000";

elsifhou2="1001"and(min1="0101"andmin2="1001")

and(sec1="0101"andsec2="1001")then

hou2<="0000";

elsif(hou2="1001"andmd1='0'andmd2="01")

or(hou1="0010"andhou2="0011")then

hou2<="0000";--md<='1';--

elsif((min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001"))

or(md1='0'andmd2="01")then

hou2<=hou2+1;--speak<=clk;--

endif;

endif;

endprocessh220;

-----------------------------------------------分钟十位

m110:

process(clk,min2,sec1,sec2,md1,md2)

begin

ifclk'eventandclk='1'then

if(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001")then

min1<="0000";

elsifmin1="0101"andmin2="1001"and(md1='0'andmd2="00")then

min1<="0000";

elsif(min2="1001"and(sec1="0101"andsec2="1001"))

or(min2="1001"andmd1='0'andmd2="00")then

min1<=min1+1;

endif;

endif;--endif;

endprocessm110;

----------------------------------------------分钟个位

m220:

process(clk,sec1,sec2,md1,md2)

begin

ifclk'eventandclk='1'then

ifmin2="1001"and(sec1="0101"andsec2="1001")then

min2<="0000";

elsifmin2="1001"and(md1='0'andmd2="00")then

min2<="0000";

elseif(sec1="0101"andsec2="1001")or(md1='0'andmd2="00")then

min2<=min2+1;

endif;

endif;endif;

endprocessm220;

---------------------------------------------秒十位

s110:

process(clk)

begin

ifclk'eventandclk='1'then

if(sec1="0101"andsec2="1001")then

sec1<="0000";

elseifsec2="1001"then

sec1<=sec1+1;

endif;

endif;endif;

endprocesss110;

--------------------------------------------秒个位

s220:

process(clk)

begin

ifclk'eventandclk='1'then

ifsec2="1001"then

sec2<="0000";

elsesec2<=sec2+1;

endif;

endif;

endprocesss220;

-------------------------------------------时间设置小时部分

sethour1:

process(clk,seth2)

begin

ifclk'eventandclk='1'then

ifseth1="0010"andseth2="0011"then

seth1<="0000";

elsifseth2="1001"then

seth1<=seth1+1;

endif;

endif;

endprocesssethour1;

sethour2:

process(clk,md1,md2,seth1)

begin

ifclk'eventandclk='1'then

if(seth1="0010"andseth2="0011")orseth2="1001"then

seth2<="0000";

elsifmd1='1'andmd2="00"then

seth2<=seth2+1;

endif;

endif;

endprocesssethour2;

-------------------------------------------时间设置分钟部分

setmin1:

process(clk,setm2)

begin

ifclk'eventandclk='1'then

ifsetm1="0101"andsetm2="1001"then

setm1<="0000";

elsifsetm2="1001"then

setm1<=setm1+1;

endif;

endif;

endprocesssetmin1;

setmin2:

process(clk,md1,md2)

begin

ifclk'eventandclk='1'then

ifsetm2="1001"then

setm2<="0000";

elsifmd1='1'andmd2="01"then

setm2<=setm2+1;

endif;

endif;

endprocesssetmin2;

--------------------------------------------闹铃

speaker:

process(clk,hou1,hou2,min1,min2)

begin

ifclk'eventandclk='1'then

ifseth1=hou1andseth2=hou2andsetm1=min1andsetm2=min2then

clken<='1';

elseclken<='0';

endif;

endif;

endprocessspeaker;

disp:

process(md1,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2)

begin

ifmd1='0'then---------------计时时间显示和设置模式

h1<=hou1;h2<=hou2;

m1<=min1;m2<=min2;

s1<=sec1;s2<=sec2;

else-----------闹铃时间现实和设置模式

h1<=seth1;h2<=seth2;

m1<=setm1;m2<=setm2;

s1<="1111";s2<="1111";

endif;

endprocessdisp;

endone;

(3)乐曲演奏模块:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSpeakeraIS

PORT(clk:

INSTD_LOGIC;

Tone:

INSTD_LOGIC_VECTOR(10DOWNTO0);

SpkS:

OUTSTD_LOGIC);

END;

ARCHITECTUREoneOFSpeakeraIS

SIGNALPreCLK,FullSpkS:

STD_LOGIC;

BEGIN

DivideCLK:

PROCESS(clk)

VARIABLECount4:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

PreCLK<='0';--将CLK进行16分频,PreCLK为CLK的16分频

IFCount4>11THENPreCLK<='1';Count4:

="0000";

ELSIFclk'EVENTANDclk='1'THENCount4:

=Count4+1;

ENDIF;

ENDPROCESS;

GenSpkS:

PROCESS(PreCLK,Tone)--11位可预置计数器

VARIABLECount11:

STD_LOGIC_VECTOR(10DOWNTO0);

BEGIN

IFPreCLK'EVENTANDPreCLK='1'THEN

IFCount11=16#7FF#THENCount11:

=Tone;FullSpkS<='1';

ELSECount11:

=Count11+1;FullSpkS<='0';ENDIF;

ENDIF;

ENDPROCESS;

DelaySpkS:

PROCESS(FullSpkS)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音

VARIABLECount2:

STD_LOGIC;

BEGIN

IFFullSpkS'EVENTANDFullSpkS='1'THENCount2:

=NOTCount2;

IFCount2='1'THENSpkS<='1';

ELSESpkS<='0';

ENDIF;

ENDIF;

ENDPROCESS;

END;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYNoteTabsIS

PORT(clk:

INSTD_LOGIC;

ToneIndex:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

END;

ARCHITECTUREoneOFNoteTabsIS

COMPONENTMUSIC--音符数据ROM

PORT(address:

INSTD_LOGIC_VECTOR(7DOWNTO0);

inclock:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDCOMPONENT;

SIGNALCounter:

STD_LOGIC_VECTOR(7DOWNTO0);

BEGIN

CNT8:

PROCESS(clk,Counter)

BEGIN

IFCounter=138THENCounter<="00000000";

ELSIF(clk'EVENTANDclk='1')THENCounter<=Counter+1;ENDIF;

ENDPROCESS;

u1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1