电子钟.docx

上传人:b****8 文档编号:11436854 上传时间:2023-03-01 格式:DOCX 页数:12 大小:19.79KB
下载 相关 举报
电子钟.docx_第1页
第1页 / 共12页
电子钟.docx_第2页
第2页 / 共12页
电子钟.docx_第3页
第3页 / 共12页
电子钟.docx_第4页
第4页 / 共12页
电子钟.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

电子钟.docx

《电子钟.docx》由会员分享,可在线阅读,更多相关《电子钟.docx(12页珍藏版)》请在冰豆网上搜索。

电子钟.docx

电子钟

为期两周的课设已经接近尾声了,在这2周中,我学到了很多,对EDA的认识也进一步加深了。

从一个刚入门的学习者,渐渐的爱上了这门技术,虽然说对于EDA的知识还有很多要学习和提高,但是在这2周中我还是感受到这门课程的魅力所在。

在拿到数字钟这个课题时,我和我的合作伙伴对这个课题感到比较轻松,脑海中一下子出现了许多设计念头,于是我们就分头去寻找这方面的资料,通过图书馆的书籍资料,网络上的虚拟资料。

在2天的找资料的过程中,我开始觉得所谓的数字钟并非我想象的那么简单。

一开始我想到的数字钟只是一般的计数功能并未涉及到调时,调分,和闹铃功能。

在如何显示方面也没有细细的考虑过。

在看过一些资料后,越来越感觉到数字钟课题并非手到擒来。

在与伙伴商量后,我们以一本参考书的资料为基础开始展开细致设计。

我们一开始的输入是有三个模块,输入模块,计数模块,和显示模块。

对于计数模块我们通过分频方法很快就得到了1HZ的频率用于计数,再通过计数进位标志实现秒,分,时的互相关联,再显示模块,我们通过7段数码管扫描显示也的到了实现。

但是在输入模块,我们却遇到了障碍,如何通过硬件上的有限的开关和按钮来实现呢。

我们首先想到了,做一个可以输入数字的键盘和开关(16*16),可是在想到键盘设计本身就是一个非常复杂的过程,想到2周能做好的话有一定的难度,于是我们果断的放弃了这一计划。

那么如何实现输入,这个问题摆在我们面前,我感到了课设以来前所未有的压抑感。

通过四个开关控制0—9的输入,但是如何控制是输入的是哪一位,如何进行调时,闹铃控制?

都是难题。

在冥想了2天后,我才发现自己陷如了思维的局限性中,为什么一定通过输入来完成调时呢,我们不可以通过他本身的计数功能来调时,这样虽然没有像我们所想的输入调时那样方便,但是它的简单在于充分利用了1HZ频率,通过干扰进位标志进行调时。

这一个方法想到后,其他的闹铃功能和报时功能也都迎刃而解了。

经过3天的编程和功能完善,我们基本实现了所有的功能,各个模块的编译和仿真也都实现了,第二个星期,实验室开放,我和伙伴就开始进行硬件上的实现了,在完成顶层设计后,我们成功的下载在硬件上了。

通过调时后,基本实现了全部功能,并通过了老师的检查。

到此本次课设基本上实现了所有的功能,但在有些功能的实现中,还有待提高。

比如说对于调时功能,只能等待调时,这样对于调时的机动性不好,如果控制不好,过了应调时间的话,就必须在等一次循环后才能调时,这样就很浪费时间了。

还有就是闹钟功能并未完全实现它,我们只是编写了一个特定的程序来闹铃,闹铃时间已经事先安排好了,无法再通过手动调节了,这样就缺少了人性化。

这在课设结束以后,要进一步的改进,争取获得一款高性能的人性化的数字钟。

通过本次课设,我不仅学到了关于EDA的许多专业知识,同时也让我感觉到团队合作的重要性。

其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。

如果我们一味的屋子里苦思冥想那么再给2周的时间或许也不会有数字钟诞生,所以我觉得与他人交流思想是取得成功的关键,在交流中,不仅强化了自己原有的知识体系也可以扩展自己的思维。

通过思考、发问、自己解惑并动手、改进的过程,才能真正的完成课题。

经过这次课程设计的过程,我相信在以后的课程设计中我们会吸取经验教训,做出更好的设计来。

评价答案

∙您已经评价过!

天外流星2007-07-0310:

24

满意答案

好评率:

0%

3.数码管的扫描显示:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;-字模输出模块

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSELIS

PORT(CLK:

INSTD_LOGIC;

Q:

OUTSTD_LOGIC_VECTOR(2DOWNTO0));--输入选通信号

ENDSEL;

ARCHITECTURESELAOFSELIS

BEGIN

PROCESS(CLK)

VARIABLECNT:

STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

IFCLK'EVENTANDCLK='1'THEN

CNT:

=CNT+1;

ENDIF;

Q<=CNT;

ENDPROCESS;

ENDSELA;

G:

整点报时功能:

libraryieee;--整点报时模块

useieee.std_logic_1164.all;

entitysstis

port(h1,h0,m1,m0,s1,s0:

instd_logic_vector(3downto0);

q1,q0:

instd_logic;-输入分,秒信号和时钟信号

q:

outstd_logic);--输出两个不同频率的音频信号

endsst;

architecturesss_arcofsstis

signalq3,q4:

std_logic;

begin

process(m1,m0,s1,s0)

begin

ifh1="0000"andh0<"0111"then

q3<='0';

q4<='0';

elsifm1="0101"andm0="1001"ands1="0101"then

ifs0="0000"ors0="0010"ors0="0100"ors0="0110"ors0="1000"then

q3<='1';

else--当计时到达59'50"52"54"56"58"鸣叫,鸣叫频率为500HZ,

q3<='0';

endif;

endif;

ifh1="0000"andh0<"0111"then

q3<='0';

q4<='0';

elsifm1="0000"andm0="0000"ands1="0000"ands0="0000"then

q4<='1';当整点时为最后一声整点报时,频率为1kHZ,

else

q4<='0';

endif;

endprocess;

q<=(q3andq0)or(q4andq1);

endsss_arc;

G:

闹钟功能模块:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYNALIS

PORT(M1,M0,H1,H0:

INSTD_LOGIC_VECTOR(3DOWNTO0);

en:

inSTD_LOGIC;

Q:

OUTSTD_LOGIC);

ENDNAL;

ARCHITECTURENAOOFNALIS

BEGIN

PROCESS(M1,M0,H1,H0,EN)

BEGIN

IFEN='0'THEN

IFH0="1000"ANDH1="0000"ANDM1="0000"ANDM0="0000"THEN

Q<='1';

ELSE

Q<='0';

ENDIF;

ELSEQ<='0';

endif;

ENDPROCESS;

ENDNAO;

评价答案

∙您已经评价过!

好:

0

∙您已经评价过!

一般:

0

∙您已经评价过!

不好:

0

∙您已经评价过!

原创:

0

∙您已经评价过!

非原创:

0

其他答案

其基本要求如下:

1.实现基本的计时功能,输入1kHz的时钟,采用24小时制计时,能显示时、分、秒。

2.校正功能;时分均有校时功能。

3.当计时器运行到59分49秒开始报时,每鸣叫1s就停叫1s,共鸣叫6,前5响为低音,频率为750Hz;最后1响为高音,频率为1KHz。

4.可设定夜间某个时段不报时。

5.设定闹钟,当按下闹铃开关时,可在规定时间闹铃,当开关复位时,闹铃停止。

方案一

根据方案的要求,可以用VHDL语言,采用自顶向下的设计方法。

可用分频的方法得到1HZ的时钟用与计数;用7段数码管来显示时间,需要6个数码管;同时可以根据不同的频率的输入来调节蜂鸣器的鸣叫声音,从而实现整点报时功能和闹铃功能。

对于闹铃功能,可以用一个触发器和一个寄存器来实现。

根据要求基本确定由以下模块组成:

1.秒计数模块:

秒计数,在频率为1HZ的时钟下以60次为循环计数,并产生进位信号影响分计数;

2.分计数模块:

分计数,在秒进位信号为高电平时,计数一次,同样以60次为一个循环计数,同时产生分进位信号影响时计数;

3.时计数模块:

时计数,在分进位信号为高电平时,计数一次,以24次为一个循环计数;

4.频率产生模块:

主要有2个部分,一个是产生1HZ的计数频率,一个是产生725HZ和500HZ的蜂鸣器鸣叫频率;

5.时间显示模块:

通过选中不同的数码管,同时进行一定频率的扫描显示时,分,秒。

6.时间设置模块:

设置调试使能端,可以调时,分。

基本功能是在使能端为高电平时,可以使时和分循环计数;

7.整点报时模块:

在秒计数到50秒时,同时分计数到59分开始,丰鸣器产生每个2秒的鸣叫(500HZ),到整点是产生750HZ的鸣叫。

8.闹钟模块:

在设定闹钟闹铃时间后,当闹钟使能端有效时,可在闹铃时间闹铃,通过人工拨0后停闹。

秒计数模块

VHDL源程序:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYMIANIS---------------秒计数模块-------------

PORT(RD,CLK:

INSTD_LOGIC;------------秒复位信号-----

SEC1,SEC0:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

CO:

OUTSTD_LOGIC);

ENDMIAN;

ARCHITECTUREMIANAOFMIANIS

BEGIN

PROCESS(CLK,RD)--秒计数进程

VARIABLECNT1,CNT0:

STD_LOGIC_VECTOR(3DOWNTO0);输出信号

BEGIN

IFRD='1'THEN----复位信号为1时,秒计数清零---

CNT1:

="0000";

CNT0:

="0000";

ELSIFCLK'EVENTANDCLK='1'THEN-输入时钟信号和清零信号

IFCNT1="0101"ANDCNT0="1000"THEN–当秒计数为58时进位信号为1

CO<='1';

CNT0:

="1001";-秒低位小于9时,加1

ELSIFCNT0<"1001"THEN

CNT0:

=CNT0+1;

ELSE

CNT0:

="0000";

IFCNT1<"0101"THEN-秒高位小于5时,加1

CNT1:

=CNT1+1;

ELSE

CNT1:

="0000";

CO<='0';

ENDIF;

ENDIF;

ENDIF;

SEC1<=CNT1;

SEC0<=CNT0;

ENDPROCESS;

ENDMIANA;

天外流星2007-07-0310:

22

B:

分计数模块

VHDL源程序:

LIBRARYIEEE;--分计数模块

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYMINAIS

PORT(EN,CLK:

INSTD_LOGIC;-输入时钟信号和进位信号

MIN1,MIN0:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出分计数和进位

CO:

OUTSTD_LOGIC);

ENDMINA;

ARCHITECTUREMINOFMINAIS

BEGIN

PROCESS(CLK)--分计数进程

VARIABLECNT1,CNT0:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

IFCLK'EVENTANDCLK='1'THEN时钟上升沿,en为1时分开始计数

IFEN='1'THEN

IFCNT1="0101"ANDCNT0="1000"THEN-当分计数到58时产生进位信号

CO<='1';

CNT0:

="1001";

ELSIFCNT0<"1001"THEN--分低位小于9时,cnt0加1

CNT0:

=CNT0+1;

ELSE

CNT0:

="0000";

IFCNT1<"0101"THEN

CNT1:

=CNT1+1;

ELSE

CNT1:

="0000";

CO<='0';

ENDIF;

ENDIF;

ENDIF;

ENDIF;

MIN1<=CNT1;

MIN0<=CNT0;

ENDPROCESS;

ENDMIN;

时计数模块

VHDL源程序:

LIBRARYIEEE;--时计数模块

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYHOURIS

PORT(EN,CLK:

INSTD_LOGIC;-输入时钟信号和分模块进位信号

H1,H0:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));-输出h0,h1

ENDHOUR;

ARCHITECTUREHOURAOFHOURIS

BEGIN

PROCESS(CLK)--小时计数进程

VARIABLECNT1,CNT0:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

IFCLK'EVENTANDCLK='1'THEN--时钟上升沿,en为1时小时开始计数

IFEN='1'THEN

IFCNT0="0011"ANDCNT1="0010"THEN

CNT0:

="0000";

CNT1:

="0000";

ELSIFCNT0<"1001"THEN

CNT0:

=CNT0+1;

ELSE

CNT0:

="0000";

CNT1:

=CNT1+1;

ENDIF;

ENDIF;

ENDIF;

H1<=CNT1;

H0<=CNT0;

ENDPROCESS;

ENDHOURA;

天外流星2007-07-0310:

23

D:

频率产生模块:

1.500HZ和1KHZ的频率产生:

LIBRARYIEEE;--小时计数模块

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYCCCIS

PORT(CLK:

INSTD_LOGIC;

q1k,Q500:

OUTSTD_LOGIC);

ENDCCC;

ARCHITECTURECCCAOFCCCIS

SIGNALX:

STD_LOGIC;

BEGIN

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

X<=NOTX;

ENDIF;

q1k<=X;

ENDPROCESS;

PROESS(X)

VARIABLEY:

STD_LOGIC;

BEGIN

IFX'EVENTANDX='1'THEN

Y:

=NOTY;

ENDIF;

Q500<=Y;

ENDPROCESS;

ENDCCC;

2.1HZ的频率产生:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYFEN10IS

PORT(CLK:

INSTD_LOGIC;

Q:

OUTSTD_LOGIC);

ENDFEN10;

ARCHITECTUREFENAOFFEN10IS

BEGIN

PROCESS(CLK)

VARIABLECNT:

INTEGERRANGE0TO999;

BEGIN

IFCLK'EVENTANDCLK='1'THEN

IFCNT<999THEN

CNT:

=CNT+1;

Q<='0';

ELSE

CNT:

=0;

Q<='1';

ENDIF;

ENDIF;

ENDPROCESS;

ENDFENA;

天外流星2007-07-0310:

23

E:

时间显示模块:

1.数码管选中:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYBBBIS----用于选中对应的数码管----

PORT(SEC1,SEC0,MIN1,MIN0,H1,H0:

INSTD_LOGIC_VECTOR(3DOWNTO0);

SEL:

INSTD_LOGIC_VECTOR(2DOWNTO0);

Q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDBBB;

ARCHITECTUREBBBAOFBBBIS

BEGIN

PROCESS(SEL)

BEGIN

CASESELIS----由低位到高位依次显示秒,分,时-------

WHEN"000"=>Q<=SEC0;-当000时输出秒低位

WHEN"001"=>Q<=SEC1;-001时输出秒高位

WHEN"011"=>Q<=MIN0;-当011时输出分低位

WHEN"100"=>Q<=MIN1;-当100时输出分高位

WHEN"110"=>Q<=H0;--当110时输出时低位

WHEN"111"=>Q<=H1;当111时输出时高位

WHENOTHERS=>Q<="1111";

ENDCASE;

ENDPROCESS;

ENDBBB;

2.译码显示:

libraryieee;

useieee.std_logic_1164.all;-字模输出模块

entitydispais

port(d:

instd_logic_vector(3downto0);--输入选通信号

q:

outstd_logic_vector(6downto0));

enddispa;

architecturedispa_arcofdispais

begin

process(d)

begin

casedis

when"0000"=>q<="0111111";

when"0001"=>q<="0000110";

when"0010"=>q<="1011011";

when"0011"=>q<="1001111";

when"0100"=>q<="1100110";

when"0101"=>q<="1101101";

when"0110"=>q<="1111101";

when"0111"=>q<="0100111";

when"1000"=>q<="1111111";

when"1001"=>q<="1101111";

whenothers=>q<="0000000";

endcase;

endprocess;

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

当前位置:首页 > 初中教育 > 语文

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

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