数字闹钟的电子设计.doc

数字闹钟的电子设计

收藏

压缩包内文档预览:(预览前20页/共29页)
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:517091    类型:共享资源    大小:956.54KB    格式:RAR    上传时间:2015-11-12 上传人:QQ28****1120 IP属地:辽宁
3.6
积分
关 键 词:
毕业设计论文
资源描述:
数字闹钟的电子设计,毕业设计论文
内容简介:
1 数字设计 数字 闹钟 的电子设计 班 级: 04 通信 学 号: 20040734046 姓 名: 唐俊 nts 2 目 录 1、 设计目的 3 2、 设计选题 3 3、 设计要 求 3 4、 分析要求和 总体设 计 3 5、详细设计过程及遇到的困难与解决方法 4 6、顶 层设计 16 7、设计感想 19 附:参考文献及 程序 20 nts 3 一、 设计目的 : 1. 通过设计 ,掌握电子设计的一般思路 ,学习电子设计的一般方法 . 2. 通过设计 ,学习掌握 MAX-PLUS2 的使用方法 . 二、 设计选题 通过小组成员讨论 ,决定做数字钟的设 计 . 三、 设计要求 设计一个能进行时、分、秒计时的十二小时制或二十四小时制的数字钟,并具有定时与闹钟功能,能在设定的时间发出闹铃音,能非常方便地对小时、分钟和秒进行手动调节以校准时间,每逢整点,产生报时音报时。 四、 分析要求和总体设计 1. 根据老师所给设计要求规纳有以下需求的功能 : 1.计时功能 :这是本数字钟设计的基本功能 ,每隔一秒钟计时一次 ,并在显示屏上显示当前时间 . 2.闹钟功能 :如果当前时间与设置的闹钟时间相同 ,则扬声器发出报警声 . 3.校时功能 :设置新的时间作为当前时间 . 4.设置闹钟 :设置闹 钟时间 . 5.整点报时 :每逢整点则报时 . 2. 根据需求分析 ,我们采用自顶向下的方法确定数字钟的总体实现思路如下 : 要实现以上的功能 ,经过分析我们设计了四个模块 .分别是 :计时模块 ,校时功能模块 ,闹钟功能模块和选择显示模块 . 根据自顶向下的设计方法确定数字钟的设计方案 .为完全实现上面的 4 个功能 ,我们进一步向下进行功能划分 ,得到更详细的设计方案如下 : 数字钟 计时模块 校时功能模块 闹钟功能模块 选择显示模块 模24计数器 模60计数器 数字钟校时 闹钟校时 显示设置时间 显示计数时间 显示闹钟 nts 4 3. 各模块具体实现的功能及彼此之间的数据流流动方向 : 1.计时模块 : 计时器的设计采用一般的计数器的设计方法 ,只是模 60 的秒计数器满 60 送进位输出 ,作为分计数器的 CLK 时钟信号 .同理 , 模 60 的分计数器满 60 送进位输出 ,作为时计数器的 CLK 时钟信号 ,这样就实现了电子时钟计数的雏形 ,以上是计时模块内部的数据流流向 ;由于要显示 ,所以必须还要有一个输出来表示现在的计数值 ,这个计数值应该送到选择显示模块进行显示 ,这是计时模块与外部的数据交换 . 2. 校时功能模块 : 校时电路用来完成对计时时间以及闹钟时间的修改与校正 ,修改后的时间应该要送到相应的计数模块作为新计数的起始值 ,所以要有输出端将修改后的数值送到相应的计数模块 . 3. 闹钟功能模块 : 比较当时的时间是否与闹钟设置的时间相等 ,如果相同则应该发出通知 ,告诉用户时间到了 ,有点类似于比较器 .因此要能从计时模块获得当时时间 ,从校时模块获得设置的闹钟时间 ,要能将结果输出作为提示 . 4. 选择显示模块 根据所在的状态 ,选择输出正在设置的新计数时间或新闹钟时间或当前计数时间 . 五、 详细设计 过程及遇到的困难与解决方法 1. 计时模块的设计 1.模 60 的计数器的设计 : (a).实现方案 : 采用一般的计数器的设计方法 ,每来一个 CLK 时钟信号 (T 为 1 秒 ),计数值加 1;如果计数到 59,输出一个 进位 ,表示一个周期 . (b).实现过程中的问题及解决方案 : 通过以上分析 ,我做了初步的设计 ,在机子上 输入草稿上的程序后 ,通过提示 ,发现以下的几个错误 : nts 5 对于第一个提示错误 ,我通过将 SIGNAL 中的 BUFFER 去掉即可 ,由于我输出的Q_OUT中定义的是 BUFFER,所以 为了省时间 直接拷贝 ,粗心而导致的错误 .因为这里不是在定义引脚 ,而只是内部的连接线定义 ,但 BUFFER 是相当于带输出缓冲器并可以回读的引脚 ,所以肯定是错误的 . 上面这个图是我改正了几个小错后才保存的 ,其它一些错误的提示就没有在上面 . 还有两个 错误是 : 我在定义端口时 ,定义了输出 EN,并且在 PROCESS 的敏感参数表中列出来了 ,但在后面却没有用到 ,所以提示出错 . 在 PROCESS的敏感参数表中忘记写 CLK信号 ,却写了一个输出引脚 ,这是致命性的错误 . 在输入过程中的手误 ,将 QL=9 写成了 QL=9,提示出错 ,明显要么写成QL=”1001”. 其它 ,逻辑上倒没有出错 ,因为这是参照 EDA 教材上 187 页的具有异步复位 同步置数功能的计数器改写的 . 仿真图如下 ,为了便于观察分析 ,我在这设的 END TIME 是 13 微秒 . nts 6 以上是我在单独设计模 60 计数器时 写下的 ,但在顶层设计时 ,发现如果按上面这个设计结果 ,将无法将新设置的时间作为新的起始计数时间 .经分析只要增加一个输入用来接受新的设置值 ,相应用一个 OK 信号控置便能实现 .因此 ,增加了两个输入 .出现这种情况的主要原因是概要设计没做到位 .以下是修改后的仿真及相应模块的引脚图 : 分析可知 60 个脉冲要 12 微秒 ,为了观察的方便 ,我设置的 END TIME=13,为了检验计数到 59-0 和以设置的新时间为起始计数的功能是否实现 ,因此做了以下的输入 .从仿真结果可以方便的看出 ,功能得到了很好的实现 .在 OK 信号未来之前 ,计数 正常进行 ,到 59 则重新从 00 开始计数 ,如果 OK 信号一来 ,计数器对新设置的时间进行加载作为新起始计数值 .此功能实现基本上秒和分的计时功能得到了成功设计 . nts 7 2.模 24 计数器的设计 : (a).实现方案 : 采用一般的计数器的设计方法 ,每来一个 CLK 时钟信号 (T 为 1 秒 ),计数值加 1;如果计数到 23,输出一个进位 ,表示一个周期 .类似于模 60 计数器的设计方法 . (b).实现过程中的问题及解决方案 : 对于 COUNT 24 的设计 ,我是仿照 COUNT 60 改写的 ,语法上倒没怎么出错 ,不过刚粘贴修改后忘设当前 PROJECT,结果程序去运行 COUNT60 去了 ,而刚好我将文件移动了下位置 ,结果提示出错如下 .设了 PROJECT 后运行 ,语法没错 ,只是逻辑上出错了 ,因为我没改 ,所以它到 29 才变 ,后修改逻辑执行 ,得仿真如下 :(计数 24 约 END TIME=4.8 微秒 .为了便于分析 ,这里设成了 5.5 微秒 ) nts 8 分析程序的仿真结果 如上图 可知 :计数是以 24 为周期 ,当计数到 23 时 ,如果再有进位 ,就计数从 0重新开始 ,并给出一个进位信号 ,这个信号可以做为日期的 CLK信号 ,从而实现显示日期的功能 .同模 60 计数器的设计一样 ,从单个模块来看以上的 仿真结果自认为是正确的 .但在顶层设计时 ,发现如果按上面这个设计结果 ,将无法将新设置的时间作为新的起始计数时间 .经分析只要增加一个输入用来接受新的设置值 ,相应用一个 OK 信号控制便能实现 .因此 ,增加了两个输入 .出现这种情况的主要原因是概要设计没做到位 .以下是修改后的仿真及相应模块的引脚图 : nts 9 针对以上的问题是解决了 ,但后来仔细观察发现 COUT 从有了第一次进位后就保持了这个值 ,而在没有进位的时候也输出进位 ,带着这个问题 ,我分析出进位输出后 ,在低位进行加 1 时没有将进位清 0.因此 ,找到相应程序部分改成了 ELSE QL=QL+1;COUT=0;修改后进行仿真 ,仿真结果如下图 ,可知修改成功 .从这里也让我知道 ,在做单个模块时的仿真图一定要仔细分析 ,像这个错误如果不是发现的早 ,到后来的整体顶层设计时 ,计数功能将会出现严重的错误 ,那时候再来找原因 ,比现在可难多了 .这个系统还算比较小 ,如果更复杂的系统就更难找出错误了 .因此 ,每个模块设计的功能检测不能马虎 ,也体会到了 ,不是说一个模块做出来了 ,就完全在顶层设计不会出错的 ,譬如这里如果不增加输入端口 ,在顶层设计时 ,既使语法没错 ,逻辑功能也不能实现 . 总之 ,各模块要 完 全实现相应功能 ,并且要在设计前想好框架和各模块之间的数据流流程 ,在这一点上感觉我的这次设计做的很不到位 ,因此造成很多次基本功能实现了 ,可是有些功能却无法实现 ,又得返回去重新设计 ,全部返工很耗时间 ,因为每设计一个模块要仿真等等 .但是如果不仿真又不能完全肯定设计达到要求 .所以最好的方法是详细设计做到位 ,引脚及要实现的功能写在详细设计说明书里面 ,设计时根据设计说明的要求来 ,每步实现每步的功能 ,这样只要详细设计做到位 ,返工的可能性就少多了 . nts 10 对于 COUNT 24 的设计 ,我是用 COUNT 60 来 CTRL+C 和 CTRL+V 得到的 ,因此COUNT 24 出现了这个问题 ,返回去看 COUNT 60 的确也出现了相应问题 ,修改后仿真如下 : nts 11 2. 校时功能模块 (a).实现方案 : 对这个模块的功能实现 ,我原来想参照教材 P314 的实现方法 -用状态机的形式来控制 ,虽然实现起来也就是套用状态机的一般格式 ,但是我觉得有个缺陷 ,那就是平时用的电子手表会有设这么多个按键吗 ?一般都是几个按键灵活用 ,设置时间时是先选定是设置秒 分 时的哪一个 ,然后一直按一个按键来实现时间的调整 ,这时的状态完全是一个计时器的功能 ,我就是以这个思路来设 计的 .个人觉得方法也较简单 ,因为主体功能实现基本是用 60 和 24 的计数器的方法 . (b).实现过程中的问题及解决方案 对于 SET_TIME 模块的设计 ,花费了不少功夫 ,也出了不少的错误 ,以下是一些主要的调试出错过程 . 根据自己在草稿纸上的实现语句 ,在机子上运行出错信息如上 ,代码出错是可以理解的 ,学 C+到现在也不敢保证我写个几十行程序不会写错 ,不过这里一些错的确有点粗心 .根据提示分别进行修改 ,过程如下 : “OK”等没有定义 ,明显写了 ,但是提示却没有定义 ,肯定是定义时的语句问题 ,仔细观察发现 PORT( );没写完整 . nts 12 输入的过程中 ,由于粗心将 ART 输错 ,根据提示得到了相应的解决 . 修改相应提示错误后 ,编译得到 : 第二天调试了半天 ,结果与预料的完全背道而驰 ,连一个输出都没有 ,也就是说它无法达到 IF 中的条件 ,开始时我在想是不是变量名与系统有冲突 ,但想想如果是冲突应该是报语法错 ,而不是逻辑错 ,再分析发现原来我的秒 IN_MIN/分 IN_MIN/时IN_MIN 等 都 设 置 是 STD_LOGIC_VECTOR(3 DOWNTO 0) 最 大 才23+22+21+20=15,改成 8 位的 ,结果就有输出了 ,但却并不是希望 的结果 ,也就是逻辑上又错了 ,通过相应的改动 ,再进行调试结果如下 ,分析可知 ,这个运行结果是比较符合要求的 ,不过由于 END TIME 太小 ,看不到所有正确的运行结果 ,也就相当于没有软件工程中的测试文档 ,有时候的测试数据不是很理想 .后来分析 ,设置 60 个计数大约是12us,想测试到 59 后是否会回到 0,就得超过 12 微秒 .因此 ,在这设 END TIME=13.5 nts 13 分析可知时间设置 SET_TIME 模块得到了很好的实现 ,这相当于标志着我的设计基本差不多了 .因为 ,时间设置一成功 ,后面我想设计的模块基本上在这个模块的基础上改动 一些小地方就能实现 .譬如说 :日期的显示与设置 ,完全可以在此基础上进行 ,年份的设置的高两位即 2007 中的 20 可以用系统保存为缺省 ,年份的低两位 /月份 /日期就完全可以用 SET_TIME 的方法来设置 ,而对于闹钟就基本上一样的方法来实现设置闹钟时间了 . 由以上设计得到的相应模块的引脚图如下 : 3. 选择显示模块 (a).实现方案 : 这个模块的设计是最为简单的 ,因为它要实现的功能就是选择输出 ,在设计中有设置时间和显示时间不同的模块 ,显示相对应的时间 ,我的想法是 :用一个输出控制信号来选择输出 ,由前面的设计中我们知道设置时 间 按钮是 EN,如果 EN 有效就表示在设置时间 .因此 ,我们完全可以就用 EN 来控制 ,如果 EN 有效 ,就显示输出正在设置的值 ,否则显示当前时间值 .从分析就可以明确 ,只要一个 IF 语句基本上就能达到要求 .在这里 ,我 定义了一个输出用来告诉用户现在显示的是设置时间还是当前时间 ,即SET_LED 接指示灯 . (b).实现过程中的问题及解决方案 这个模块设计中出现的一个错误是 :由于 CTRL+C 的是 SET_TIME 模块 ,这样可以少输入一些常用的东西 , 但在修改时漏 改 ARCHITECTURE ART OF SELECT_OUT IS 部分 ,结果显示如下 图 的提示错误 . 修改程序后得以下的引却图 : nts 14 由以上的仿真结果可以看出 :当 EN 为 0 时 (即非设置状态 ),输出 DISP 是当前时钟QOUT 部分 ,当 EN 为 1 时 (即设置时间状态 ),输出 DISP 是 OK 部分 ,并且 SET_LED 输出高电平 ,告诉用户现在显示的是设置时间 .其中 IN 部分是中间信号 .因此由以上 仿真结果可以看出功能基本实现 ,不过 LED 显示有个时钟的延迟 ,如果是标准秒计时应该是有 1 秒延迟 .这个做为一个提示信号倒不是太大的问题 ,上次更改程序还没解决 . nts 15 4. 闹钟系统的设计 (补充设计 )由于在 第一次设计中 ,对设计需求的忽视 ,忘记了对闹钟系统的设计 ,后来再增加这一功能给设计带来了一定的困难 ,通过分析 (后面有详细说明 ),我选择了方案三结合方案一 .其中是实现时 ,出现的一些错误及调试过程 . 由于引脚太多引起的错误 ,我在原来设计的 SELECT 中去掉了 SET_LED 指示灯 ,准备放到输入中直接接 .更改后仿真结果如下 (功能实现了 ,不过不是很精确 ): 模块设计出来了 ,将这一个改动的模块直接代替原来设计好的顶层图中的模块 ,不过由于设计出来的引脚位置不一样 ,如果改线的连接 ,感觉有点麻烦 ,我选择改nts 16 模块图如下 : 六、 顶层设计 根据要实现的功能 ,将设计的各模块连成电路图如下 : 它对应的仿真图如下 : nts 17 设计做到这 ,如果结果正确就基本上设计完成了 ,可是在仿真过程中 ,再来看老师的设计要求发现闹钟部分没有设计 .因此得重新设计出新功能 .对照着以上 的 顶层设计电路图 .我的三个修改方案是 : 1. 在 SET_TIME 模块中 ,增加一个 ALARM 按键 ,用来控制设置闹钟 ,然后在 SET_TIME中增加 IF 语句 ,如果 EN=0 AND ALARM=1,则进入设置闹钟的时间状态 ,可以再在SET_TIME 中增设内部信号 ,用来保存设置的闹 钟值 ,并将值送给 OK 去显示 ,当然 ,相应的SELECT_OUT 的 EN 使能信号就 应 是 EN 与 ALARM 的或值 .但此时还是必须在 SELECT中增加比较的语句 ,用来判断是否是到了闹钟时间 ,如果到了 ,则应该输出一个闹钟信号 .思路个人觉得应该是对的 . 2. 直接增加一个闹钟处理模块 ,其实也完全可以就采用增加一个 SET_TIME 的方法 ,只要记住这里它是用来实现闹钟的 ,然后 ,在选择输出模块的基础上再增加一个比较器 .还可以在这里增加一个倒计时功能 .这种设计我用 SET_TIME 的方法尝试过并且设计结果显示是正确的 ,不过由于要 修改以上的 SELECT_OUT和 SET_TIME太多的地方 ,因此我还是没有采用这种方法 .不过程序及仿真部分放在了附录中 ,模块名是 END_TIME. 3. 我的想法是直接在 SELECT 模块中修改来实现 ,主要是因为顶层设计都出来了 ,如果修改太多有点麻烦 .所以我想在 SELECT 中增加一个标志 ,用来标志 EN 键按下的次数 ,按下一次 ,则送 来的信号当作时间设置信号 ;当再按下 ,则作为闹钟信号保存下来 ,因为这时OK 没按下 ,就不会送作初始计时信号 .这样周而复始 ,如果实在不行可以类 1的方法增加一个按键来实现 . 同时 , 这 个如 果实现了 , 则可以省一些按键 , 如设置时间的nts 18 SET_SEC,SET_MIN,SET_HOUR 等就可以用一个键来实现 ,这样就和平常用的电子手表有点相接近了 .同样 ,这样再增加年月的功能时 ,按键数也不会成为一个问题了 . 更改后最终的带有闹钟功能的电子钟总接线图如下所示 : 功能说明 : RESECT:用来将设置时间清零 ,不过后来发现其实这个脚可有可无 ,功能不大 . CLK:标准时钟送入 . EN:用来控制时间的设置 ,为 1 时 ,设置新时间 ,且 ” 通知 ” SELECT_OUT 现在输出下在设置的时间 . ALARM_EN:用来控制闹钟时间的设置 ,不过由于只有一组显示器件 ,所以为 1 时 ,如果 EN 为 0 ,才进行闹钟的设置 . OK:用来控制设置的时间是否作为新的时间 ,如果有效 ,则计数模块进行加载新时间 . SET_.组 :用来 设置新时间等的值 . 基本实现思路 : 如果 EN和 ALARM_EN无效 ,则显示当前正常计数时间 .其中秒 COUNT60的进位 COUT每60计数变为高 ,并作为分计数的时钟信号 ,同理分做时的时钟信号 ,时做日的时钟信号 (这里没有设计日期的 ,不过思路我在上面已经分析过 ,方法类似于电子钟 .闰年等的算法在nts 19 C+,VB,JAVA,汇编中很常见 ,只需要更改成 VHDL 语言即可 , 实现起来不是难事 ,不过由于时间问题 ,在这就不设计了 .)QOUT组即当时的时间 .对于闹钟部分和选择输出部分在模块分析时 ,已经讲的很清楚 ,在这就不在赘述了 . 七、 设计感想 在每步的设计中已经将感想穿插在里面了。 nts 20 附录: 参考文献及程序 模 24 计数器的设计: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNT24 IS PORT (RESET,CLK,OK:IN STD_LOGIC; COUT:OUT STD_LOGIC; Q_IN:STD_LOGIC_VECTOR(7 DOWNTO 0); Q_OUT:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); END ENTITY COUNT24; ARCHITECTURE ART OF COUNT24 IS SIGNAL QL:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL QH:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(RESET,CLK,OK) IS BEGIN IF(RESET=1)THEN QH=0000; QL=0000; COUT=0; ELSIF(OK=1)THEN QH(3 DOWNTO 0)=Q_IN(7 DOWNTO 4); QL(3 DOWNTO 0)=Q_IN(3 DOWNTO 0); ELSIF(CLKEVENT AND CLK=1)THEN IF(QL=9)THEN QL=0000; COUT=0; QH=QH+1; ELSIF(QL=3 AND QH=2)THEN QH=0000; QL=0000; COUT=1; ELSE QL=QL+1; COUT=0; END IF; END IF; END PROCESS; Q_OUT(3 DOWNTO 0)=QL; Q_OUT(7 DOWNTO 4)=QH; END ARCHITECTURE ART; nts 21 模 60 计数器的设计: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNT60 IS PORT (RESET,CLK,OK:IN STD_LOGIC; COUT:OUT STD_LOGIC; Q_IN:STD_LOGIC_VECTOR(7 DOWNTO 0); Q_OUT:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); END ENTITY COUNT60; ARCHITECTURE ART OF COUNT60 IS SIGNAL QL:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL QH:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(RESET,CLK,OK) IS BEGIN IF(RESET=1)THEN QH=0000; QL=0000; COUT=0; ELSIF(OK=1)THEN QH(3 DOWNTO 0)=Q_IN(7 DOWNTO 4); QL(3 DOWNTO 0)=Q_IN(3 DOWNTO 0); ELSIF(CLKEVENT AND CLK=1)THEN IF(QL=1001)THEN QL=0000; IF(QH=0101)THEN QH=0000; COUT=1; ELSE QH=QH+1; COUT=0; END IF; ELSE QL=QL+1; COUT=0; END IF; END IF; END PROCESS; Q_OUT(3 DOWNTO 0)=QL; Q_OUT(7 DOWNTO 4)=QH; END ARCHITECTURE ART; nts 22 选择显示模块 的设计: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SELECT_OUT IS PORT (CLK,EN,ALARM_EN:IN STD_LOGIC; ALARM:OUT STD_LOGIC; QOUT_SEC,QOUT_MIN,QOUT_HOUR,OK_SEC,OK_MIN,OK_HOUR:STD_LOGIC_VECTOR(7 DOWNTO 0); DISP_SEC,DISP_MIN,DISP_HOUR:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); END ENTITY SELECT_OUT; ARCHITECTURE ART OF SELECT_OUT IS SIGNAL IN_SEC:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL IN_MIN:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL IN_HOUR:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ALARM_SEC:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ALARM_MIN:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ALARM_HOUR:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(CLK)IS BEGIN IF(CLKEVENT AND CLK=1)THEN IF( EN=1) THEN IN_SEC=OK_SEC; IN_MIN=OK_MIN; IN_HOUR=OK_HOUR; ELSIF( ALARM_EN=1) THEN ALARM_SEC=OK_SEC; ALARM_MIN=OK_MIN; ALARM_HOUR=OK_HOUR; IN_SEC=OK_SEC; IN_MIN=OK_MIN; IN_HOUR=OK_HOUR; ELSE IN_SEC=QOUT_SEC; IN_MIN=QOUT_MIN; IN_HOUR=QOUT_HOUR; IF(ALARM_SEC=QOUT_SEC AND ALARM_MIN=QOUT_MIN AND ALARM_HOUR=QOUT_HOUR) THEN ALARM=1; ELSE ALARM=0; END IF; nts 23 END IF; END IF; END PROCESS; DISP_SEC(7 DOWNTO 0)=IN_SEC(7 DOWNTO 0); DISP_MIN(7 DOWNTO 0)=IN_MIN(7 DOWNTO 0); DISP_HOUR(7 DOWNTO 0)=IN_HOUR(7 DOWNTO 0); END ARCHITECTURE ART; 校时功能模块 的设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SET_TIME IS PORT (RESET,CLK,EN,OK:IN STD_LOGIC; SET_SEC,SET_MIN,SET_HOUR:IN STD_LOGIC; OK_SEC,OK_MIN,OK_HOUR:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); END ENTITY SET_TIME; ARCHITECTURE ART OF SET_TIME IS SIGNAL IN_SEC:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL IN_MIN:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL IN_HOUR:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(RESET,CLK,EN,OK)IS BEGIN IF RESET=1 THEN IN_SEC=00000000; IN_MIN=00000000; IN_HOUR=00000000; ELSIF(CLKEVENT AND CLK=1)THEN IF (EN=1 AND OK=0) THEN IF SET_SEC=1 THEN IF IN_SEC(3 DOWNTO 0)=9 THEN IN_SEC(3 DOWNTO 0)=0000; IF IN_SEC(7 DOWNTO 4)=5 THEN IN_SEC(7 DOWNTO 4)=0000; ELSE IN_SEC(7 DOWNTO 4)=IN_SEC(7 DOWNTO 4)+1; END IF; ELSE IN_SEC(3 DOWNTO 0)=IN_SEC(3 DOWNTO 0)+1; END IF; END IF; nts 24 IF SET_MIN=1 THEN IF IN_MIN(3 DOWNTO 0)=9 THEN IN_MIN(3 DOWNTO 0)=0000; IF IN_MIN(7 DOWNTO 4)=5 THEN IN_MIN(7 DOWNTO 4)=0000; ELSE IN_MIN(7 DOWNTO 4)=IN_MIN(7 DOWNTO 4)+1; END IF; ELSE IN_MIN(3 DOWNTO 0)=IN_MIN(3 DOWNTO 0)+1; END IF; END IF; IF SET_HOUR=1 THEN IF IN_HOUR(3 DOWNTO 0)=9 THEN IN_HOUR(3 DOWNTO 0)=0000; IN_HOUR(7 DOWNTO 4)=IN_HOUR(7 DOWNTO 4)+1; ELSIF IN_HOUR(7 DOWNTO 4)=2 AND IN_HOUR(3 DOWNTO 0)=3 THEN IN_HOUR(7 DOWNTO 4)=0000; IN_HOUR(3 DOWNTO 0)=0000; ELSE IN_HOUR(3 DOWNTO 0)=IN_HOUR(3 DOWNTO 0)+1; END IF; END IF; END IF; END IF; END PROCESS; OK_SEC(7 DOWNTO 0)=IN_SEC(7 DOWNTO 0); OK_MIN(7 DOWNTO 0)=IN_MIN(7 DOWNTO 0); OK_HOUR(7 DOWNTO 0)=IN_HOUR(7 DOWNTO 0); END ARCHITECTURE ART; END-TIME 模块的设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY END_TIME IS PORT (RESET,CLK,STOP,OK:IN STD_LOGIC; SET_SEC,SET_MIN,SET_HOUR:IN STD_LOGIC; OK_SEC,OK_MIN,OK_HOUR:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); ZERO,EN:OUT STD_LOGIC); END ENTITY END_TIME; nts 25 ARCHITECTURE ART OF END_TIME IS SIGNAL IN_SEC:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL IN_MIN:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL IN_HOUR:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(RESET,CLK,STOP,OK)IS BEGIN IF RESET=1 THEN ZERO=0; EN=0; IN_SEC=00000000; IN_MIN=00000000; IN_HOUR=00000000; ELSIF(CLKEVENT AND CLK=1)THEN IF (STOP=1 AND OK=0) THEN IF SET_SEC=1 THEN IF IN_SEC(3 DOWNTO 0)=9 THEN IN_SEC(3 DOWNTO 0)=0000; IF IN_SEC(7 DOWNTO 4)=5 THEN IN_SEC(7 DOWNTO 4)=0000; ELSE IN_SEC(7 DOWNTO 4)=IN_SEC(7 DOWNTO 4)+1; END IF; ELSE IN_SEC(3 DOWNTO 0)=IN_SEC(3 DOWNTO 0)+1; END IF; END IF; IF SET_MIN=1 THEN IF IN_MIN(3 DOWNTO 0)=9 THEN IN_MIN(3 DOWNTO 0)=0000; IF IN_MIN(7 DOWNTO 4)=5 THEN IN_MIN(7 DOWNTO 4)=0000; ELSE IN_MIN(7 DOWNTO 4)=IN_MIN(7 DOWNTO 4)+1; END IF; ELSE IN_MIN(3 DOWNTO 0)=IN_MIN(3 DOWNTO 0)+1; END IF; END IF; IF SET_HOUR=1 THEN IF IN_HOUR(3 DOWNTO 0)=9 THEN IN_HOUR(3 DOWNTO 0)=0000; IN_HOUR(7 DOWNTO 4)=IN_HOUR(7 DOWNTO 4)+1; ELSIF IN_HOUR(7 DOWNTO 4)=2 AND IN_HOUR(3 DOWNTO 0)=3 THEN IN_HOUR(7 DOWNTO 4)=0000; IN_HOUR(3 DOWNTO 0)=0000; ELSE IN_HOUR(3 DOWNTO 0)=IN_HOUR(3 DOWNTO 0)+1; nts 26 END IF; END IF; EN=1; ELSIF (STOP=1 AND OK=1) THEN IF IN_SEC(3 DOWNTO 0)=0 THEN IF IN_SEC(7 DOWNTO 4)=0 THEN IF IN_MIN(3 DOWNTO 0)=0 THEN IF IN_MIN(7 DOWNTO 4)=0 THEN IF IN_HOUR(3 DOWNTO 0)=0 THEN IF IN_HOUR(7 DOWNTO 4)=0 THEN ZERO=0; EN=0; IN_SEC(7 DOWNTO 0)=00000000; IN_MIN(7 DOWNTO 0)=00000000; IN_HOUR(7 DOWNTO 0)=00000000; ELSE IN_HOUR(7 DOWNTO 4)=IN_HOUR(7 DOWNTO 4)-1; IN_SEC(7 DOWNTO 0)=01011001; IN_MIN(7 DOWNTO 0)=01011001; IN_HOUR(3 DOWNTO 0)=1001; END IF; ELSE IN_HOUR(3 DOWNTO 0)=IN_HOUR(3 DOWNTO 0)-1; IN_SEC(7 DOWNTO 0)=01011001; IN_MIN(7 DOWNTO 0)=01011001; END IF; ELSE IN_MIN(7 DOWNTO 4)=IN_MIN(7 DOWNTO 4)-1; IN_SEC(7 DOWNTO 0)=01011001; IN_MIN(3 DOWNTO 0)=1001; END IF; ELSE IN_MIN(3 DOWNTO 0)=IN_MIN(3 DOWNTO 0)-1; IN_SEC(7 DOWNTO 0)
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:数字闹钟的电子设计
链接地址:https://www.renrendoc.com/p-517091.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!