EDA课程设计报告(电子钟)2要点.docx

上传人:李医生 文档编号:11737352 上传时间:2021-09-02 格式:DOCX 页数:16 大小:554.03KB
返回 下载 相关 举报
EDA课程设计报告(电子钟)2要点.docx_第1页
第1页 / 共16页
EDA课程设计报告(电子钟)2要点.docx_第2页
第2页 / 共16页
EDA课程设计报告(电子钟)2要点.docx_第3页
第3页 / 共16页
EDA课程设计报告(电子钟)2要点.docx_第4页
第4页 / 共16页
EDA课程设计报告(电子钟)2要点.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《EDA课程设计报告(电子钟)2要点.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告(电子钟)2要点.docx(16页珍藏版)》请在三一文库上搜索。

1、EDAM程设计报告数字钟设计班级: 学号: 姓名:一、设计任务设计一台能显示时、分、秒的数字钟。具体要求如下:(1)由实验箱上的时钟信号经分频产生秒脉冲;(2)计时计数器用24进制计时电路;(3)可手动校时,能分别进行时、分的校正;(4)整点报时;选做:可设置闹时功能,当计时计到预定时间时,扬声器发出闹铃信号,闹铃时 间为4s,并可提前终止闹铃。二、试验目的(1)掌握时十进制、六进制和二十四进制计数器的设计方法。(2)掌握多位计数器相连的设计方法。(3)掌握多位共阴极扫描显示数码管的驱动及编码。三、总体设计方案本数字系统实现数字钟的基本的计时功能, 输入8Hz的时钟,通过分频产生 1Hz的时钟

2、信号,采用24/12小时制计时,能显示时、分、秒。本系统还具有校 正功能,可以进行时分的校时,当计时器运行到59分59秒开始报时,另外还可 以设定闹钟,当按下闹铃开关时,可在规定时间闹铃,当开关复位时,闹铃停止。本数字钟实际上是一个对频率(1Hz)进行计数的计数电路。由于计数的起始 时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时分频后的 1Hz时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。数字钟的基本组成本数字钟的实现可分为以下几个模块:(1)秒计数模块:秒计数,在频率为 1Hz的时钟下以60次为循环计数,并 产生进位信号影响分计数;(2) 分计数模块:分计数,

3、在秒进位信号为高电平时,计数一次,同样以60次为一个循环计数,同时产生分进位信号影响时计数;(3) 时计数模块:时计数,在分进位信号为高电平时,计数一次,以24/12 次为一个循环计数;(4)频率产生模块:产生8Hz的计数频率,通过分频得到1Hz频率;(5) 时间显示模块:数码管通过动态显示,同时进行一定频率的扫描显示时,分,秒。(6) 时间设置模块:设置调试使能端,可以调时,分,秒。基本功能是在使能端为高电平时,可以使时和、分和秒循环计数;(7) 整点报时模块:在秒计数到50秒时,同时分计数到59分开始,蜂鸣 器产生四个时钟周期的鸣叫,到整点是产生两个时钟周期的鸣叫(8) 闹钟模块:在设定闹

4、钟闹铃时间后,当闹钟使能端有效时,可在闹铃 时间闹铃,通过人工拨0后停闹。一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器 和定时器组成。干电路系统由秒信号发生器、“时”,“分”,“秒”计数器、 译码器及显示器、电路组成。分频器电路:通常,数字钟的晶体振荡器输出频率较高, 为了得到1Hz的秒 信号输入,需要对振荡器的输出信号进行分频。 通常实现分频器的电路是计数器 电路,当计数满时则产生相应的跳变,从而得到想要的的分频后频率。时间计数单元:时间计数单元有时计数、分计数和秒计数等几个部分。 时计 数单元一般为12进制计数器或24进制计数器。译码驱动及显示单元:计数器实现了对时间

5、的累计以8421BC则形式输出, 为了将计数器输出的8421BC则显示出来。试验箱上有几种模式可供选择,选择 模式5则自带有显示译码器,代码中就可以直接送四位 bcd码给相应端口就行。校时电源电路:当重新接通电源或走时出现误差时都需要对时间进行校正。 通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计 数将高电平信号加到需要校正的计数单元的输入端,相应的时分秒数值随着时钟 脉冲信号跳变,校正好后,再按下使能键变为低电平,转入正常计时状态。整点报时电路:一般时钟都应具备整点报时电路功能,即在时间出现整点时, 数字钟会自动报时,以示提醒。其作用方式是发出连续的或有节奏的音频声波

6、, 较复杂的也可以是实时语音提示。本设计的总体设计原理结构框图如下:图1数字钟的系统框图该系统由振荡器、分频器、“时、分、秒”计数器、译码器及显示器、校时 电路、整点报时电路等组成。石英晶体振荡器和分频器产生整个系统的时基信号, 它直接决定计时系统的精度。“秒计数器”采用六十进制计数器,每累计60秒向 “分计数器”进位;“分计数器”采用六十进制计数器,每累计 60分向“时计数 器”进位;“时计数器”采用二十四进制计数器, 按照“24翻1”规律计数。”时、 分、秒”计数器的输出经译码器送显示器显示。 校时电路用来当计时出现误差时 对“时、分、秒”进行校对调整。整点报时电路是根据计时系统的输出状态

7、产生 一脉冲信号,然后去触发音频发生器实现报时。本程序实现的功能并不复杂,故本课程设计并未采用例化语句,而是将各个 模块的功能整合到一起,采用一个结构体多个进程来实现。四、调试过程程序完成后,首先要做的便是仿真,观察仿真图,改变相应的输入参数值看 是否达到所要求的结果输入时钟信号如下:40 9 ns80. Q ns120.p nsISO.p ns200.p nsEkicent国 hxiur E S l*JB iB :El XXE EY-nLrLrLrWLrLrmj-LrLrLnLTLrLrLrLrLrLrLrLrLrxmini temini t2 ilaoCLaxix 获IK wex XXIX

8、* 637setBKB |B:相应的产生仿真图如下:WlOOl:3 I B I g l3 ;El 5t:nc2 I; DCinni从图中可以看出,仿真结果正常,分秒可以正常跳变从图中可以看出,闹铃功能正常实现。图中实现的是调节分位的时间,其它 位的时间调节方法一致。从图中可以看出整点报时功能也能实现,产生高电平使得蜂鸣器发声。调时功能测试,从图中可以看出,可以正常调节时间I才才*HrHr节部分RTL图五、实验心得:本次课程设计是通过所学的EDAa识,自主设计使用物品,将所学的知识运 用到实处,感觉收获很大,以前学的时候都是学的理论上的知识, 并没有运用到 实际做具体的功能器件上来,通过这次的课

9、程设计使我将理论的知识联系到实际运用中来, 巩固了以前学习的知识, 并且有了新的收获, 进一步熟悉了软件运用和实验箱的使用,增强了自我动手能力。学习EDA程已经过去一段时间,好多知识开始模糊,所以在实验过程中要经常翻阅书本查询相关知识, 实验的过程也将书本的知识进一步强化, 对书本的知识有了新的认识, 受益匪浅。 在程序设计过程中容易将各个复合语句的范围用错, 从而出现意想不到的结果, 逻辑出现紊乱, 有时是漏掉了某些语句或者是一些语法错误, 这些在编译的时候都会有相应的出错提示, 顺着提示去改正相对比较容易, 不过也出现过几次错误出现的地方和提示出错的地方不一致, 费了很大力气才解决,还有一

10、种就是,编译可以通过,但是结果不与预想的一致,一般进程process end process不会出错,原因主要是进程中的逻辑顺序或嵌套没有安排好,比如ifelseend if语句,如果if语句结束的位置用错,即endif 的位置不对,不会提示出错但是不能达到想要的结果,这就需要从头认真分析各逻辑关系,重新考虑end if 位置,总之课程设计虽然辛苦,但是却有其中的乐趣,尤其是解决问题后的成就感,学以致用,感觉很充实。口现代信息社会里很有用的一门学科, 以后一定会再次用到, 现在打好基础, 为以后的学习和工作奠定基础,培养兴趣。参考文献:EDAK术与VHDL(第二版).潘松 黄继业.清华大学出版

11、社.2008 六、程序清单library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shuzizhong isport(clk1,set,naol,change,s1,s2,s3:instd_logic; 秒 分 时 校 验-s1,s2,s3;闹铃设置 naol, 调时间启动键 changeminite1:out std_logic_vector(3 downto 0);minite2:out std_logic_vector(3 downto 0);second1,second2, hour

12、1,hour2:out std_logic_vector(3 downto 0);cout:out std_logic);end entity;architecture one of shuzizhong issignal clk,temp:std_logic;beginpro:process(clk1)variable n:integer:=0 ;beginif clk1event and clk1=1 thenif n=4 then temp=not temp;n:=0;else n:=n+1;end if;end if;end process pro;clk=temp;pro1:proc

13、ess(clk,set,s1,s2,s3,change,naol)variablemsecond1,msecond2,mminite1,mminite2,mhour11,mhour12,mhour21,mhour22:std_logic_vector(3 downto 0);variablemminite10,mminite20,mhour110,mhour120,mhour210,mhour220:std_logic_vec tor(3 downto 0);beginif (clkevent and clk=1) thenif(naol=1) then -qidong dinshiif s2

14、=1 thenmminite10:=mminite10+1;if mminite10=1010then mminite10:=0000;mminite20:=mminite20+1;if mminite20=0110then mminite20:=0000;end if;end if;end if; 分校验if s3=1 thenmhour110:=mhour110+1;mhour210:=mhour210+1;if mhour110=1010 then mhour110:=0000;mhour120:=mhour120+1;end if;if mhour110=0011 and mhour1

15、20=0001thenmhour110:=0001;mhour120:=0000;end if;thenifmhour210=1010mhour210:=0000;mhour220:=mhour220+1;end if;if mhour210=0100and mhour220=0010then mhour210:=0000;mhour220:=0000;end if;end if; 时校验end if;if set=1 then 启动校验if s1=1then msecond1:=msecond1+1;if msecond1=1010then msecond1:=0000;msecond2:=

16、msecond2+1;if msecond2=0110then msecond2:=0000;end if;end if;end if; 秒校验if s2=1thenmminite1:=mminite1+1;if mminite1=1010then mminite1:=0000;mminite2:=mminite2+1;if mminite2=0110then mminite2:=0000;end if;end if;end if; 分校验if s3=1 thenmhour11:=mhour11+1;mhour21:=mhour21+1;thenandthenifmhour11=1010mho

17、ur11:=0000;mhour12:=mhour12+1;end if;ifmhour11=0011mhour12=0001thenmhour11:=0001;mhour12:=0000;end if;ifmhour21=1010mhour21:=0000;mhour22:=mhour22+1;end if;if mhour21=0100and mhour22=0010then mhour21:=0000;mhour22:=0000;end if;end if; 时校验elsemsecond1:=msecond1+1; 正常计时工作if msecond1=1010then msecond1:

18、=0000;msecond2:=msecond2+1;if msecond2=0110then msecond2:=0000;mminite1:=mminite1+1;if mminite1=1010then mminite1:=0000;mminite2:=mminite2+1;if mminite2=0110then mminite2:=0000;mhour11:=mhour11+1;mhour21:=mhour21+1;if mhour11=1010 then mhour11:=0000;mhour12:=mhour12+1;end if;if mhour11=0011 and mhou

19、r12=0001then mhour11:=0001;mhour12:=0000;end if;12小时制if mhour21=1010 then mhour21:=0000;mhour22:=mhour22+1;end if;if mhour21=0100and mhour22=0010then mhour21:=0000;mhour22:=0000;end if;24小时制end if; end if;end if; end if;end if;if naol=0 thensecond1=msecond1;second2=msecond2;minite1=mminite1;minite2=

20、mminite2;if change=0 then hour1=mhour11;hour2=mhour12;else hour1=mhour21;hour2=mhour22;12/24 小时制转换end if; elsesecond1=0000;second2=0000;minite1=mminite10;minite2=mminite20;if change=0 then hour1=mhour110;hour2=mhour120;else hour1=mhour210;hour2=mhour220;12/24 小时制转换end if;end if;if (msecond1=0000 or

21、msecond1=0001) and (msecond2=0000) and(mminite1=0000) and (mminite2=0000)-and(msecond10010)and(msecond2=0000)then cout=1;else if change=0 thenif (mminite1=mminite10) and (mminite20=mminite2) and(mhour12=mhour120) and (mhour11=mhour110) and (msecond1=0100) and (msecond2=0000)then cout=1; else cout=0;

22、-整点报时end if;else if (mminite1=mminite10)and (mminite20=mminite2)and (mhour22=mhour220) and (mhour21=mhour210) and (msecond1=0101) and (msecond2=0000)then cout=1;elsecout=0;end if;end if;end if;end if;end process;end architecture one;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigne

23、d.all;entity shuzizhong isport(clk1,set,naol,change,s1,s2,s3:instd_logic; 秒 分 时 校 验-s1,s2,s3;闹铃设置 naol, 调时间启动键 changeminite1:out std_logic_vector(3 downto 0);minite2:out std_logic_vector(3 downto 0);second1,second2, hour1,hour2:out std_logic_vector(3 downto 0);cout:out std_logic);end entity;architec

24、ture one of shuzizhong issignal clk,temp:std_logic;beginpro:process(clk1)variable n:integer:=0 ;beginif clk1event and clk1=1 thenif n=4999999 then temp=not temp;n:=0;else n:=n+1;end if;end if;end process pro;clk=temp;pro1:process(clk,set,s1,s2,s3,change,naol)variablemsecond1,msecond2,mminite1,mminit

25、e2,mhour11,mhour12,mhour21,mhour22:std_logic_vector(3 downto 0);variablemminite10,mminite20,mhour110,mhour120,mhour210,mhour220:std_logic_vector(3 downto 0);beginif (clkevent and clk=1) thenif(naol=1) then -qidong dinshiif s2=1 thenmminite10:=mminite10+1;if mminite10=1010then mminite10:=0000;mminite

26、20:=mminite20+1;if mminite20=0110then mminite20:=0000;end if;end if;end if; 分校验if s3=1 thenmhour110:=mhour110+1;mhour210:=mhour210+1;if mhour110=1010 then mhour110:=0000;mhour120:=mhour120+1;end if;if mhour110=0011 and mhour120=0001thenmhour110:=0001;mhour120:=0000;end if;ifmhour210=1010 thenmhour21

27、0:=0000;mhour220:=mhour220+1;end if;if mhour210=0100and mhour220=0010then mhour210:=0000;mhour220:=0000;end if;end if; 时校验end if;if set=1 then 启动校验if s1=1then msecond1:=0000;msecond2:=0000;end if; 秒校验if s2=1thenmminite1:=mminite1+1;if mminite1=1010then mminite1:=0000;mminite2:=mminite2+1;if mminite2

28、=0110then mminite2:=0000;end if;end if;end if; 分校验if s3=1 thenmhour11:=mhour11+1;mhour21:=mhour21+1;ifmhour11=1010 thenmhour11:=0000;mhour12:=mhour12+1;end if;ifmhour11=0011andmhour12=0001thenmhour11:=0001;mhour12:=0000;end if;thenifmhour21=1010mhour21:=0000;mhour22:=mhour22+1;end if;if mhour21=0100

29、and mhour22=0010then mhour21:=0000;mhour22:=0000;end if;end if; 时校验elsemsecond1:=msecond1+1; 正常计时工作if msecond1=1010then msecond1:=0000;msecond2:=msecond2+1;if msecond2=0110then msecond2:=0000;mminite1:=mminite1+1;if mminite1=1010then mminite1:=0000;mminite2:=mminite2+1;if mminite2=0110then mminite2:

30、=0000;mhour11:=mhour11+1;mhour21:=mhour21+1;if mhour11=1010 then mhour11:=0000;mhour12:=mhour12+1;end if;if mhour11=0011 and mhour12=0001then mhour11:=0001;mhour12:=0000;end if;12小时制if mhour21=1010 then mhour21:=0000;mhour22:=mhour22+1;end if;if mhour21=0100and mhour22=0010then mhour21:=0000;mhour22

31、:=0000;end if;24小时制end if; end if;end if; end if;end if;if naol=0 thensecond1=msecond1;second2=msecond2;minite1=mminite1;minite2=mminite2;if change=0 then hour1=mhour11;hour2=mhour12;else hour1=mhour21;hour2=mhour22;12/24 小时制转换end if; elsesecond1=0000;second2=0000;minite1=mminite10;minite2=mminite20

32、;if change=0 then hour1=mhour110;hour2=mhour120;else hour1=mhour210;hour2=mhour220;12/24 小时制转换end if;end if;if (msecond1=0000 or msecond1=0001) and (msecond2=0000) and(mminite1=0000) and (mminite2=0000)and(msecond10010)and(msecond2=0000)then cout=1;else if change=0 thenif (mminite1=mminite10) and (m

33、minite20=mminite2) and(mhour12=mhour120) and (mhour11=mhour110) and (msecond1=0100) and (msecond2=0000)then cout=1; else cout=0;-整点报时end if;else if (mminite1=mminite10)and (mminite20=mminite2)and (mhour22=mhour220) and (mhour21=mhour210) and (msecond1=0101) and (msecond2=0000)then cout=1;elsecout=0;end if;end if;end if;end if;end process;end architecture one;

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1