基于VHDL语言的电子钟设计.docx

上传人:b****5 文档编号:7664462 上传时间:2023-01-25 格式:DOCX 页数:24 大小:207.33KB
下载 相关 举报
基于VHDL语言的电子钟设计.docx_第1页
第1页 / 共24页
基于VHDL语言的电子钟设计.docx_第2页
第2页 / 共24页
基于VHDL语言的电子钟设计.docx_第3页
第3页 / 共24页
基于VHDL语言的电子钟设计.docx_第4页
第4页 / 共24页
基于VHDL语言的电子钟设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于VHDL语言的电子钟设计.docx

《基于VHDL语言的电子钟设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的电子钟设计.docx(24页珍藏版)》请在冰豆网上搜索。

基于VHDL语言的电子钟设计.docx

基于VHDL语言的电子钟设计

 

论文题目

数字钟设计

课程论文

要求

1.设计一个具有时、分、秒数字显示的计数器,且以24小时循环计时;

2.具有清零功能,且能对计时系统的小时,分钟进行调整;

3.具有整点报时功能。

 

设计过程

一、设计方案

1.硬件方案

1.1电路总原理及原理图

数字电子钟的逻辑框图如下图所示。

它由振荡器、分频器、计数器、译码器显示器和校时电路组成。

振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。

秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。

计数器的输出分别经译码器送显示器显示。

计时出现误差时,可以用校时电路校时、校分。

原理图如图一:

显示器

显示器

显示器

显示器

显示器

显示器

 

译码器

译码器

译码器

译码器

译码器

译码器

 

十进制

计数器

计数器

六进制

计数器

计数器

六进制

计数器

计数器

十进制

计数器

计数器

二进制

计数器

计数器

十进制

计数器

计数器

 

时十位时个位分十位分个位秒十位秒个位

555

计数器

分频器

计数器

校时

 

图一总原理图

 

1.2振荡器

用555多谐振荡器产生1000HZ的频率,原理图如图3.1.1。

1.3分频器

由于由555定时器和RC组成的多谐振荡器产生的频率比较很高,要得到秒脉冲,需要用分频电路。

例如,振荡器输出1KHz信号,通过10分频计数器(74LS90),经过3次10分频而获得1Hz方波信号作为秒脉冲信号。

用三片74LS90进行级联,因为每片为1/10分频器,3片级联正好获得1HZ的标准秒脉冲。

连接方法如图二:

图二用74LS90构成的分频电路

1.4计数器

秒脉冲信号经过6级计数器,分别得到“秒”个位、十位,“分”个位、十位以及“时”个位、十位的计时。

“秒”、“分”计数器为60进制,小时为24进制。

计数器是一种累计时钟脉冲数的逻辑部件。

计数器不仅用于时钟脉冲计数,还用于定时、分频、产生节拍脉冲以及数字运算等。

计数器是应用最广泛的逻辑部件之一。

按触发方式,把计数器分成同步计数器和异步计数器两种。

对于同步计数器,输入时钟脉冲时触发器的翻转是同时进行的,而异步计数器中的触发器的翻转则不是同时。

(1)60进制计数器(分、秒计数器)工作原理:

“秒”计数器电路与“分”计数器电路都是60进制,它由一级10进制计数器和一级6进制计数器连接构成,如图三所示,采用两片中规模集成电路74LS90串接起来构成的“秒”、“分”计数器,实现时采用反馈清零法。

图三60进制计数器

(2)24进制计数器(时计数器)工作原理:

将两片74LS90集成块连接成二十四进制计数器,用反馈清零法实现功能。

计数器如图四:

图四24进制计数器

1.5译码器与数码管:

译码为编码的逆过程。

它将编码时赋予代码的含义“翻译”过来。

实现译码的逻辑电路成为译码器。

译码器输出与输入代码有唯一的对应关系。

74LS47是输出低电平有效的七段字形译码器,它在这里与数码管配合使用,下表列出了74LS47的真值表,表示出了它与数码管之间的关系。

输入

输出

字型

DCBA

abcdefg

0000

0000001

0

0001

1111001

1

0010

0010010

2

0011

0000110

3

0100

1001100

4

0101

0100100

5

0110

0100000

6

0111

0001111

7

1000

0000000

8

1001

0000100

9

译码是把给定的代码进行翻译,本设计即是将时、分、秒计数器输出的四位二进制数代码翻译为相应的十进制数,并通过显示器显示,通常显示器与译码器是配套使用的。

我们选用的七段译码驱动器(74LS47)和LA5611数码管。

译码显示电路如图五所示。

图五74LS47与LA5611的连接

1.6校时电路:

当开关K1、K2闭合、K3接左边门电路时,秒信号加至秒个位计数器,数字钟正常计时。

当K1断开、K2闭合、K3接左边门电路时,秒信号送入时个位计数器,进行时校对。

当K1闭合、K2断开、K3接左边门电路时,秒信号送入分个位计数器,进行分校对。

当K1和K2闭合、K3接右边门电路时,0.1s脉冲进行秒校对。

当秒校对后,K3接左边门电路,数字钟按校对后的时间工作。

电路中运用基本RS触发器,以防止开关K3抖动。

利用0.1s校对秒位计数器,能够很方便的校对成功,也十分准确。

原理图如图六:

图六校时电路

1.7元器件:

集成电路555定时器一片、74LS90十一片、74LS48六片、74LS00三片、74LS08一片、74LS86一片、共阳极数码管LA5611六片、电阻5.1K、2K各一个,100K四个、电容104PF两个。

2.软件方案

2.1秒(second)的设计

源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitysecondis

port(clk,reset,semin:

instd_logic;

enmin:

outstd_logic;

daout:

outstd_logic_vector(6downto0));

endentitysecond;

architectureartofsecondis

signalcount:

std_logic_vector(6downto0);

signalenmin_1,enmin_2:

std_logic;

begin

daout<=count;

enmin_2<=(seminandclk);

enmin<=(enmin_1orenmin_2);

process(clk,reset,semin)

begin

if(reset='0')then

count<="0000000";

enmin_1<='0';

elsif(clk'eventandclk='1')then

if(count(3downto0)="1001")then

if(count<16#60#)then

if(count="1011001")then

enmin_1<='1';count<="0000000";

else

count<=count+7;

endif;

else

count<="0000000";

endif;

elsif(count<16#60#)then

count<=count+1;

enmin_1<='0';

else

count<="0000000";enmin_1<='0';

endif;

endif;

endprocess;

endart;

秒计数模块仿真图七:

图七秒计数模块仿真图

秒计数模块

图八秒计数模块

2.2分(minute)的设计

源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityminuteis

port(clk,reset,clks,sethour:

instd_logic;

enhour:

outstd_logic;

daout:

outstd_logic_vector(6downto0));

endentityminute;

architectureartofminuteis

signalcount:

std_logic_vector(6downto0);

signalenhour_1,enhour_2:

std_logic;

begin

daout<=count;

enhour_2<=(sethourandclks);

enhour<=(enhour_1orenhour_2);

process(clk,reset,sethour)

begin

if(reset='0')then

count<="0000000";

enhour_1<='0';

elsif(clk'eventandclk='1')then

if(count(3downto0)="1001")then

if(count<16#60#)then

if(count="1011001")then

enhour_1<='1';count<="0000000";

else

count<=count+7;

enhour_1<='0';

endif;

else

count<="0000000";

endif;

elsif(count<16#60#)then

count<=count+1;

enhour_1<='0'after100ns;

else

count<="0000000";enhour_1<='0';

endif;

endif;

endprocess;

endart;

分计数模块仿真图九:

图九分计数模块仿真图

分计数模块

图十分计数模块

2.3时(hour)的设计

源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityhouris

port(clk,reset:

instd_logic;

daout:

outstd_logic_vector(5downto0));

endhour;

architecturertlofhouris

signalcount:

std_logic_vector(5downto0);

begin

daout<=count;

process(clk,reset)

begin

if(reset='0')then

count<="000000";

elsif(clk'eventandclk='1')then

if(count(3downto0)="1001")then

if(count<16#23#)then

count<=count+7;

else

count<="000000";

endif;

elsif(count<16#23#)then

count<=count+1;

else

count<="000000";

endif;

endif;

endprocess;

endrtl;

小时计数模块仿真图十一:

图十一小时模块仿真图

小时计数模块:

图十二小时计数模块

 

2.4报警模块(alert)的设计

源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityalertis

port(clk,clk1,reset,stop:

instd_logic;

dainm:

instd_logic_vector(6downto0);

dains:

instd_logic_vector(6downto0);

speak:

outstd_logic);

endalert;

architectureartofalertis

signals_speak:

std_logic;

signalenspeak:

std_logic;

begin

speak<=enspeakands_speak;

process(clk1,reset)

begin

if(reset='0')then

s_speak<='0';

elsif(clk1'eventandclk1='1')then

if(dainm="0000000")then

if(dains<="0010000"anddains>"0000000")then

s_speak<=clk;

else

s_speak<='0';

endif;

else

s_speak<='0';

endif;

endif;

endprocess;

process(stop,reset,dains)

begin

if(reset='0'ordains>"0010000")then

enspeak<='1';

elsif(stop'eventandstop='1')then

enspeak<='0';

endif;

endprocess;

endart;

报警模块的仿真图十三:

图十三报警模块仿真图

报警模块:

图十四报警模块

2.5时间设置扫描信号模块(settime)的设计

源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

entitysettimeis

port(clk1,reset:

instd_logic;

sec,min:

instd_logic_vector(6downto0);

hour:

instd_logic_vector(5downto0);

dp:

outstd_logic;

sel:

outstd_logic_vector(2downto0);

daout:

outstd_logic_vector(3downto0));

endsettime;

architectureartofsettimeis

signalcount:

std_logic_vector(2downto0);

begin

process(clk1,reset)

begin

if(reset='0')then

count<="000";

elsif(clk1'eventandclk1='1')then

if(count>="101")then

count<="000";

else

count<=count+1;

endif;

endif;

endprocess;

process(clk1,reset)

begin

if(reset='0')then

daout<="0000";

dp<='0';

sel<="111";

elsif(clk1'eventandclk1='1')then

casecountis

when"000"=>daout<=sec(3downto0);

dp<='0';

sel<="000";

when"001"=>daout(3)<='0';

daout(2downto0)<=sec(6downto4);

dp<='0';

sel<="001";

when"010"=>daout<=min(3downto0);

dp<='1';

sel<="010";

when"011"=>daout(3)<='0';

daout(2downto0)<=min(6downto4);

dp<='0';

sel<="011";

when"100"=>daout<=hour(3downto0);

dp<='1';

sel<="100";

when"101"=>daout(3downto2)<="00";

daout(1downto0)<=hour(5downto4);

dp<='0';

sel<="101";

whenothers=>daout<="0000";

dp<='0';

sel<="111";

endcase;

endif;

endprocess;

endart;

时间设置扫描信号模块仿真图十五:

图十五时间设置扫描信号模块

时间设置扫描模块:

图十六时间设置扫描信号模块

2.6译码模块(deled)的设计

源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydeledis

port(num:

instd_logic_vector(3downto0);

led:

outstd_logic_vector(6downto0));

enddeled;

architectureartofdeledis

begin

led<="1111110"whennum="0000"else

"0110000"whennum="0001"else

"1101101"whennum="0010"else

"1111001"whennum="0011"else

"0110011"whennum="0100"else

"1011011"whennum="0101"else

"1011111"whennum="0110"else

"1110000"whennum="0111"else

"1111111"whennum="1000"else

"1111011"whennum="1001"else

"1110111"whennum="1010"else

"0011111"whennum="1011"else

"1001110"whennum="1100"else

"0111101"whennum="1101"else

"1001111"whennum="1110"else

"1000111"whennum="1111";

endart;

译码模块的仿真图十七:

图十七译码模块仿真图

译码模块

图十八译码模块

2.7总原理图

图十九总原理图

整个电路的仿真图二十:

图二十整个电路的仿真图

2.8电路安装

reset:

清零;setmin、sethour:

校分,校时电。

CLK:

接频率为1HZ的CP脉冲;

代表扫描显示的驱动信号管脚SEL2,SEL1,SEL0同字符点阵显示模块的四位扫描驱动地址SEL2~SEL0相连,最高位悬空。

代表7段字码驱动信号led0,led1,led2,led3,led4,led5,led6的管脚分别同扫描数码管的段输入a,b,c,d,e,f,g相连。

代表扬声器驱动信号的管脚speak同扬声器驱动接口speaker相连。

2.9性能测试及分析

将校时、校分控制开关sethour和setmin均接高电平,接通电源,数码管能正常显示数字,6个数码管分别显示时、分、秒,扫描显示电路设计正确。

将分校时按键开关setmin按下接低电平,分会一个进位,则“分”校时电路能正确校时,同理,测试时校时控,校时一样,说明校对电路设计正确。

当分计数到59分59秒时下个时钟信号过来扬声器就会响,则整点报时电路设计正确。

将reset接低电平,数字钟准确清零。

通过对电路各个功能进行综合测试,本数字钟各项功能指标均达到设计要求,则本设计取得圆满成功。

二、设计收获和体会

通过本次课程设计让我了解了数字钟的工作原理和设计过程。

数字钟实际上就是一个计数器,只要对计数器的进位进行相应的设计就可以成为一个数字钟。

在此次设计中,主要是对秒、分为六十进制,时为二十四进制的计数器的设计。

而整个数字钟又是由振荡器、分频器、计数器、译码器、显示器等几部分组成。

然而数字钟的设计也不仅仅只有用集成电路才能完成,本实验用的是VHDL语言编写编译建模设计成的。

由于刚学VHDL语言,刚开始设计时遇到了很多困难,在经过一段时间的查阅资料以及老师的指导和同学之间的相互讨论后完成了设计,但程序即使编译成功仿真还是遇到了很多困难,比如说不知道该如何添加激励信号。

在经过一次次试验和修改后仿真终于正确,仿真无误后就根据元件引脚进行元器件之间的连线。

在硬件电路的连线过程中,也不是一开始就出来了预想中的结果,一开始不知道1HZ的信号怎么添加、各引脚的电位是什、脉冲应该如何添加,经过一番讨论和老师的指导后终于出来了结果。

实验也完成了。

通过本次课程设计,让我对计数器有了更深刻的理解,也对用VHDL语言设计实验有了更好的了解。

进一步掌握了有关数字钟的工作原理及相关设计知识。

特别是对其各工作模块的功能有了更深一步的了解。

实验过程中熟悉了对MAX+plusⅡ软件的操作及应用,也提高了个人独立分析问题及解决问题的能力。

在设计过程中,对VHDL语言的运用能力也得到了提高。

同时,还深刻体会到了VHDL在功能设计中所具有的优越性。

4.参考文献

1.吕思宗,施齐云主编.数字电路实验与课程设计,哈尔滨:

哈尔滨工程大学出版社,2001年.

2.曹昕燕,周凤臣,聂春燕主编.EDA设计实验与课程设计,北京:

清华大学出版社,2006年.

3.卢结成,高世忻,陈力生,田红民主编.电子电路实验及应用课题设计(第二版),合肥:

中国科学技术大学出版社,2006.

 

赣南师范学院2009--2010学年第二学期数字电路课程设计

课程设计题目:

数字钟设计

设计要求:

1.设计一个具有时、分、秒数字显示的计数器,且以24小时循环计时;

2.具有清零功能,且能对计时系统的小时,分钟进行调整;

3.具有整点报时功能。

 

教师评语:

 

教师签字:

年月日

行政班级电子信息工程08级学号080802067姓名李英华

选课班级电子信息工程08级任课教师杨汉祥成绩_________

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

当前位置:首页 > 农林牧渔 > 林学

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

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