EDA课程设计设计电子时钟.doc_第1页
EDA课程设计设计电子时钟.doc_第2页
EDA课程设计设计电子时钟.doc_第3页
EDA课程设计设计电子时钟.doc_第4页
EDA课程设计设计电子时钟.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计(论文)任务书 信息工程学院 学院通信工程专业 2008.1-4 班 一、课程设计(论文)题目电子钟设计 二、课程设计(论文)工作自2011年6 月 19 日起至 2011 年 6 月 24 日止。三、课程设计(论文) 地点: 华东交通大学4-410,图书馆 四、课程设计(论文)内容要求:1本课程设计的目的(1)掌握EDA技术及CPLD/FPGA的开发流程; (2)掌握自顶向下的设计思想;(3)掌握实用电子钟的设计原理;(4)掌握系统设计的分析方法;(5)提高学生的科技论文写作能力。 2课程设计的任务及要求1)基本要求:(1)用HDL设计一个多功能数字钟,包含以下主要功能:精确计时,时间可以24小时制或12小时制显示; (2)日历:显示年月日星期;(3)能把设计文件进行仿真并下载到实验箱实现功能验证。2)创新要求: 在基本要求达到后,可进行创新设计,如增加报时等、秒表功能模块。 3)课程设计论文编写要求(1)要按照书稿的规格打印誊写论文(2)论文包括目录、绪论、正文、小结、参考文献、谢辞、附录等(3)论文装订按学校的统一要求完成4)答辩与评分标准: (1)完成系统分析:20分; (2)完成设计过程:20分; (3)完成仿真:10分;(4)完成下载:10分(5)回答问题:10分。5)参考文献:(1)潘松,黄继业编著 .EDA技术实用教程 ,2005 ,科学出版社(2)徐志军,徐光辉编著 . CPLD/FPGA的开发与应用 ,电子工业出版社,2001.1(3)/html/85/t-113885.html 6)课程设计进度安排内容 天数地点构思及收集资料 1图书馆设计与调试 3实验室撰写论文 1图书馆、实验室学生签名: 2011 年 6 月24 日课程设计(论文)评审意见(1)设计程序(40分):优()、良()、中()、一般()、差(); (2)仿真结果(10分):优()、良()、中()、一般()、差();(3)下载结果(10分):优()、良()、中()、一般()、差();(4)回答问题(10分):优()、良()、中()、一般()、差();(5)报告成绩 (30分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否()评阅人:朱路 职称: 讲师 2011 年 6 月 27 日29目录目录1绪论2第一章 总体设计3一、功能概述3二、引脚功能31、时钟输入32、时分秒或年月日输入33、清零输入44、整点报时闹铃开关输入45、时间显示模式开关输入46、上午下午状态输出47、时分秒、年月日、秒表显示输出48、整点报时、闹铃声音输出4第二章 模块分析5一、时间显示及时间修改模块51、TIME子模块介绍(实现功能程序代码见附录I)52、调秒功能实现分析5二、日历显示及日历设置模块6三、秒表模块8四、闹铃设置模块9五、整点报时及闹铃使能模块10六、功能切换及显示切换模块121、显示切换模块122、功能切换模块13七、各模块的整合14第三章 硬件测试结果15小结16谢辞17参考文献17附录18绪论本文主要介绍VHDL电子时钟的设计方法,采用的软件是MAXPLUS II。随着现代集成电路的发展,CPLD/FPGA芯片性越来越好,VHDL硬件描述语言使得我们设计一个电路只写一些代码就可以了。其实,电子时钟的设计可以采用众多方法。利用单片机我们可以设计出一个比较简单的电子时钟系统,使用它的好处是我们可以采用汇编、C语言来设计这个系统,这些语言给我们提供了许多接口,这对我们编写代码带来了很大的方便。单片机设计出来的电子时钟也有它的不足之处,可扩展性差,比如说我们需要在电子时钟的基础之上添加一起其它的功能,那很可能是我们不仅仅需要把整个程序修改,甚至可能需要对硬件电路作出修改,给我们的设计带来较大的不便。利用一些组合、时序电路同样也可以设计出一个简单的电子时钟,这样做的是可能我们的花费会比较少,由于集成电路集成度的不断发展,一些芯片可能会比较廉价,但是要设计好一个电子时钟系统的话,仅仅使用一些简单的芯片来实现是比较复杂的,更关键的是,我们把电路通过这种方法设计好之后,基本上就没有了扩展性,要在原由的基础之上想发动电路几乎是不可能的。本文介绍采用VHDL硬件描述语言来描述电子时钟系统解决了以上所有弊端,首先就设计简易程度来说,它会让传统的电路设计方法汗颜,我们可能仅仅几行代码就可以把一个电路设计出来,如果在传统的电路上设计,我们却可能要花费很长的时间,有时甚至可能会遗漏一些情况导致我们的电路不满足设计要求。另外一点,VHDL硬件描述语言设计出来的电路可移植性特别强,在CPLD/FPGA上设计好一电路之后,我们可以很方便地在原由的基础之上加上一些其它的电路结构,而却不对原来的电路产生任何影响。综上所述,本文将介绍利用VHDL语言设计电子时钟的设计方法,下面开始我们的设计之旅吧!第一章 总体设计顶层文件图1.1一、功能概述整个系统分为六个模式:时间显示模式、日历显示模式、时间设置模式、日历设置模式、秒表模式、闹铃铃设置模式。时间、日历显示模式中,除了切换模式功能键有效外其它任何键都是无效的,而时间、日历、闹铃设置模式中系统中设计所有的功能键都是有效的,秒表模式中只有切换模式和清零功能键是有效的。二、引脚功能1、时钟输入clock为1Hz频率输入时钟,soundclk1为整点报时时声音频率输入端,soundclk2为闹铃时声音频率输入端2、时分秒或年月日输入时间设置、闹铃设置模式时,clk0为调整秒的时钟,clk1为调整分的时钟,clk2为调整时的时钟;日历设置模式中,clk0为调整日的时钟,clk1为调整月的时钟,clk2为调整年的时钟。3、清零输入当模式为时间设置,日历设置,闹铃设置模式时,reset为异步清零端,低电平有效。4、整点报时闹铃开关输入opensound为整点报时开关,当opensound为高电平时,整点报时功能开启;openalarm为闹铃开关,当opensound为高电平时,闹铃功能开启。5、时间显示模式开关输入Timemode为时间显示开关,当timemode为低电平时,时间显示为12进制的;为高电平时显示为24进制的。6、上午下午状态输出当timemode为低时,时间为12进制的,morningafternoon显示上下午状态,为低电平时代表为上午,为高电平时代表为下午;24进制时,morningafternoon一直为低电平。7、时分秒、年月日、秒表显示输出q0、q1、q2、q3、q4、q5、q6、q7测试时直接接八个译码的四个引脚。8、整点报时、闹铃声音输出sound接扬声器,当只在整点报时的时候,输出soundclk1,当只在闹铃的时候,输出soundclk2,当刚好在整点报时并且有在闹铃的时候,输出soundclk2,当整点报时和闹铃都不符合条件的时候,sound为低电平。第二章 模块分析一、时间显示及时间修改模块图2.111、TIME子模块介绍(实现功能程序代码见附录I)MODE=0时十二进制 MODE=1时二十四进制。ISC=0时,调整时间模式,此时分别调整时分秒并不影响其它的,比如调整秒时由59加1变成00时分不加1;ISC=1时计时模式,此时改变CLKSECOND,CLKMINUTE,CLKHOUR将影响SECOND,MINUTE,HOUR的输出,即将进行进位。RESET=0时,时分秒清零。SECOND秒译码输出MINUTE分译码输出 HOUR时译码输出 TMODE时间进制显示译码输出(12和24) CSECOND秒溢出,CMINUTE分溢出,CODE天溢出,上升沿代表新的一天。MORNINGAFTERNOON显示上下午状态,高时代表十二进制的下午,低时代表上午或者当前显示的为24进制。secondpro:process(clksecond,reset)beginif reset=0 then second0=0000;second1=0000;csecondtemp=0;elsif clksecondevent and clksecond=1 thenif second1=0101 and second0=1001 then second1=0000;second0=0000;if isc=1 then csecondtemp=1;else csecondtemp=0;end if;elsif second0=1001 then second1=second1+1;second0=0000;csecondtemp=0;else second0=second0+1;csecondtemp=0;end if;end if;end process;2、调秒功能实现分析左边显示的是调秒时的进程,监测两个信号,clksecond接的是调秒按钮,reset接的是清零按钮,reset设置为异步清零。当clksecond来一个上升时,先判断信号second1(接秒显示的高位数码管)和信号second0(接秒显示的低位数码管)是否为59,如果是的话second1=second0=“0000”,在这种情况下,再判断isc是否为高,为高的话给csecondtemp一个上升沿,否则保持csecondtemp为低电平;如果为09、19、29、39或49的话,second1+,second=“0000”;其它情况就只要second0+。很显然,因为如果当前模式为时间显示模式时,调整clksecond、clkminute和clkhour虽然不会产生进位,但却会改变输出的值,所以仅仅用time子模块来实现时间显示及修改模块是不够的,必须加上一定的控制模块,如图2.1所示,把time子模块改成一个符合要求的一个可直接使用的时间显示及设置模块。从图2.1可以看出,为了实现这一模式,另外设计了一个二选一选择器模块。当二选一选择器模块的EN为低电平时,CLK选择CLK1,当EN为高电平时,CLK选择CLK2。由于该子模块设计较简单,这里不再累述。按照图2.1设计好电路后,该模块就能够满足设计要求,该模块的实验仿真图为图2.2。图2.12从2.2可以看出,即使Hset存在时钟信号,但由于EN拉高了,hour,minute,second的值只会随时钟Clk的变化面变化,正常显示时间,即时间显示模式;即使Clk存在时钟,但由于EN拉低了,hour,minute,second的值只会随Hset、Mset、Sset的变化而变化,为时间设置模式。二、日历显示及日历设置模块图2.21CALENDAR子模块介绍(实现功能程序代码见附录II)ISC=0时,调整日历模式,此时分别调整年月日并不影响其它的,比如调整月时由12加1变成00时年不加1;ISC=1时日历显示模式,此时改变CLKDAY,CLKMONTH,CLKYEAR将影响DAY,MONTH,YEAR的输出,即将进行进位。RESET=0时,年月日清零。DAY日译码输出MONTH月译码输出 YEAR年译码输出 CDAY日溢出,CMONTH月溢出。很显然,和时间显示及设置模块类似,仅仅使用子模块CALENDAR是满足不了要求的,于是在CALENDAR的基础之上,按照时间显示及设置模块的设计方法设计成图2.21就能够满足要求。值得一提高的是,由于日历中的日期比较特殊,有28天、29天、30天甚至31天,这里的设计另外加上了一个很小的模块DAYSUM,用来求解指定年份和月份的总天数,年由YEAR的低两位输入,月由MONTH直接输入,TOTALDAY为输出天数,当TOTALDAY=“00”时代表是平年的二月份即28天,当TOTALDAY=“01”时代表是闰年的二月份即29天,当TOTALDAY=“10”时代表小月即30天,当TOTALDAY=“11”时代表大月即31天。输出TOTALDAY信号交给CALENDAR,CALENDAR利用这个输入信号对日历进位时作出判断,当TOTALDAY=“00”时,日期最多的天数就是28天,下一天来临时日期数变成新一个月的1号即显示01。下面是图2.21的功能仿真时序图图2.22:图2.22从图2.22可以看出,当为2011年02月时,无论怎样调整日期,day的输出也不会超过28天,满足设计要求。下面是一个图2.21中子模块DAY的一个进程(用来实时地计算输入年份和月份的总天数):process(year,month)beginif not(yeartemp=00) and monthtemp=00000010 then totaltemp=00;elsif yeartemp=00 and monthtemp=00000010 then totaltemp=01;elsif monthtemp=00000100 or monthtemp=00000110 or monthtemp=00001001 or monthtemp=00001011 then totaltemp=10;elsif monthtemp=00000001 or monthtemp=00000011 or monthtemp=00000101 or monthtemp=00001000 or monthtemp=00001010 or monthtemp=00001100then totaltemp=11;end if;end process;要说明的是,这里判断一个年份是否为闰年的方法是有点问题的,这里把问题简化了,真正的判断方法是:能被4整除而不能被100整除。能被400整除。只要满足上面一个条件就可以判断一个年份是闰年了,这里仅仅判断一个年份能否被4整除,并没有考虑到能否被100整除,但实际上考虑到电子时钟的使用寿命和现在的年份仅仅考虑能否被4整除就可以了。能被4整除的话就是闰年否则为平年,在二进制里如果一个数值能被4整除那它的低两位肯定都是“00”的。一个年份是平年还闰年只会影响二月份的总天数,其它的月份的天数都是固定的。三、秒表模块图2.31秒表功能模块相比其它模块来说较简单的,如图2.31所示,该模块只需要在8个10进制计数器子模块的基础之上就能够实现了,EN为计数器使能端,当EN为高电平的时候计数器有效,RESET为异步清零端,下面是一个十进制的计数器设计,即图2.31中的子模块SECOND的设计(结构体部分):architecture one of second issignal qtemp:std_logic_vector(3 downto 0):=0000;signal couttemp:std_logic;beginprocess(reset,en,clk)beginif reset=0 then qtemp0);couttemp=0;elseif clkevent and clk=1 thenif en=1 thenif qtemp=1001 then qtemp=0000;couttemp=1;else qtemp=qtemp+1;couttemp=0;end if;end if;end if;end if;图2.32为秒表模块功能仿真图,仿真过程中让使能EN有效,RESET清零无效,从仿真图可以看出,该模块的设计满足设计要求,即整个显示都是十进制的(099999999依次增加)。图2.32四、闹铃设置模块图4.1图4.1为闹铃设置模块元件封装图,有四个信号输入端口和32位信号输出接译码管,其中ALALARMSECOND为设置的秒,ALARMMINUTE为设置的分,ALARMHOUR为设置的时,ALARMMODE固定输出为“88”,用于区别于其它模式。RESET为异步清零端口,EN为CLKSECOND、CLKMINUTE、CLKHOUR使能端,当EN为高电平时,CLKSECOND、CLKMINUTE、CLKHOUR设置有效,如果给它们上升沿,输出将对应地改变。需要说明的是,考虑到时间显示模块中含有十二进制和二十四进制的,但这里闹铃设置模块中并没有考虑到,只设置成了二十四进制的,也就是说,如果事个系统开启了闹铃功能,并且闹铃设计在12时以前,并且时间显示为十二进制的话,那么系统在上午和下午的时刻都会发生闹铃事件;而假如设置的闹铃是在12点以后,那么即闹铃了,而由于显示模式为12进制的,闹铃的声音永远也不会发出。由于课设时间有限,这里就没有在这方面加以改善了,但如果要把它开发成产品的话,这些工作不是必需要去做的,做的思想跟时间显示及设置模块中的思路一致,根据信号输入来决定输入时分秒的输入范围,从而实现真正的闹铃设置功能。下面图4.2是该模块的功能仿真图:图4.2从图4.2可以看出,只要reset为低,那么输出的时分秒都立刻清零,当EN为低电平时,即使用户试图修改时分秒,时分秒输出的值也不会发生改变。闹铃功能模块代码实现见附录III。五、整点报时及闹铃使能模块 图5.1图5.2在时间显示模块中加上了一个NEWHOUR输出,当当前时间为整点时,NEWHOUR输出高电平并保持一分钟,其它时刻NEWHOUR都是低电平,将此信号接到模块SOUNDEVENT中的NEWHOUR输入,模块SOUNDEVENT就能够据此来判断是否送出整点报时信号了,这里另外加了一个OPENSOUND输入信号,用来识别用户是否开启整点报时功能,当OPENSOUND为高电平时代表开启了,这里的时间输入分别来自时间显示模块及闹铃设置模块中的时间输出,同样地这里加上了OPENALARAM信号,用来识别用户是否开启了闹铃功能。当开启了整点报时功能并且满足要求时SOUNDOUT输出高电平,其它情况输出低电平;当开启了闹铃功能并且条件满足的时ALARAMOUT输出高电平,其它情况输出低电平。在设计过程中,考虑到扬声器只有一个,而却要实现两种不同频率的声音,这里另外加上了一个SOUND模块,用于控制输出声音的频率,如图5.2所示,CLK1,CLK2分别接两个不同频率的声音信号,在硬件测试过程中,接到两个不同频率的时钟信号代替即可,SEL1.0接到模块SOUNDEVENT中的SOUNDOUT和ALARAM,SOUND模块其实是一个选择器,下面是它的实现代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sound isport(clk1,clk2:in std_logic;sel:in std_logic_vector(1 downto 0);cout:out std_logic);END ENTITY sound;architecture one of sound isbeginprocess(sel,clk1,clk2)beginif sel= 00 then cout=0;elsif sel=01 then cout=clk1;elsif sel=10 then cout=clk2;elsif sel=11 then cout=clk2;end if;end process;end architecture one;下表为输入输出关系表:sel值00011011cout输出0clk1clk2clk2图5.3为模块SOUNDEVENT功能仿真图:图5.3当把当前时间和闹铃设置的时间都设置成00点23分02秒时,并且openalarm为高时,alarmout将输出高电平。六、功能切换及显示切换模块1、显示切换模块图6.11整个系统分为时间显示,日历显示,时间设置,日历设置,秒表,闹铃设置共六个模式,但它的可视化部分都是用同样的八个译码管,所以在功能切换的时候,就要根据不同的模式来显示对应模块中的输出内容。虽然这里有六个模式,但由于在前面的设计过程中,时间显示模块和时间设置模块是做在一个模块里的,日历显示和日历设置模块做在一个模块里,所以所以这里的显示切换只需要做一个四选一的选择器就可以了。这里显示切换模块用到了八个MUX41,MUX41为四选一选择器,程序代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY mux41 IS PORT(a,b,c,d:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0);sel:in std_logic_vector(1 downto 0);END ENTITY mux41;ARCHITECTURE ONE OF mux41 ISBEGINprocess(sel,a,b,c,d)begin if sel=00 then q=a;elsif sel=01 then q=b;elsif sel=10 then q=c;elsif sel=11 then q=d;end if;end process;END ARCHITECTURE ONE;通过上述程序代码可知,当sel=00时,q输出为a,当sel=01时,q输出为b,当sel=10时,q输出为c,当sel=10时,q输出为d。这在后面的功能切换模块中会用来这些信号。2、功能切换模块图6.21图6.21所示的CONTROL模块为总个系统的管理模块,用于调度各个模块的正常工作运行。其中SET、TIMEMODE、RESET、CLK0、CLK1、CLK2为输入信号,其它的全部为输出信号,各输出信号分别接到各个模块的使能端、清零端、设置端等。这个管理模块用到状态机的思想,其中SET的状态控制着整个系统的有序进行,给以SET不间断的时钟信号,状态机的状态在各个状态之间循环。图6.22是此状态机的状态切换示意图。图6.22功能切换模块实现代码见附录IV。七、各模块的整合设计好各个模块之后,通过控制管理模块就可以把整个系统综合到一个电路中了,各个模块的连接关系如图7.1:图7.1图7.2整个系统的功能仿真图如图7.2。一启动程序,显示的是时间显示模式,给MODECHANGE一个上升沿后进入日历显示模式,再给一个上升沿进入时间设置模式,图中设置为05点24分46秒,再给一个上升沿进入日历设置模式,图中设置为2011年06月20日,再来一个上升沿进入秒表模式,再来一个上升沿进入闹铃设置模式,图中设置为06点10分06秒,再来个上升沿又回到时间显示模式,从图中可以看到,这时的时间大概为06点00分,由此可知,这个时间即使在数码管上显示,但在内部仍然是在正常计数的,当时间到了06点10分的时候,SOUND输出了声音脉冲代表闹铃正在响。从上面的仿真图可以看出,在MODECHANGE的时钟下,各个模式是不断循环地切换的。第三章 硬件测试结果硬件测试采用的是开发板中的模式3,芯片选择是EP1K30TC144-3,各个引脚情况如下表:I/O引脚I/O引脚I/O引脚I/O引脚I/O引脚clk0、 clk1、clk212、13、17opensound 、openalarm9、8q10、q11、q12、 q1336、37、38、39q30、q31、 q32、q3368、69、70、72q50 、q51、q52、q5381、82、83、86Clock、soundclk1、soundclk254、126、56q00、q01、q02、q0330、31、32、33q20、q21、q22、q2341、42、65、67q40、q41、q42 、q4373、78、79、80q60、q61、q62、q6387、88、89、90Modechange、 reset 、19、18、morningafternoon 、29、q70、 q71、 q72 、q7391、92、95、96sound99timemode10在硬件上的测试结果:24进制显示11点34分53秒12进制显示00点05分29秒秒表功能,显示为99秒闹铃设置,设置05点20分闹铃显示日历2011年06月23日本来设计时的清零是低电平清零的,但下载到开发板子上,模式三时那些输入接的为按钮,不按的时候为低电平,这导致不人为地按住,在设置模式时将一直处于清零状态,为了达到硬件测试目的,在顶层文件的清零输入端加上一个非门,将清零设置为高电平清零。见图7.1。小结通过本次EDA课程设计,基本上掌握了VHDL语言的设计思想,在整个设计过程中也走了不少的弯路,主要原因就是因为一开始就没有自顶向下的思想,仅仅考虑到设计中的当前模块,这样导致的结果是在以后连接成系统的时候出现连接问题,比如在设计秒表模块的时候,如果仅仅考虑实现秒表的功能很简单,但要和后面的级联起来却要在设计的时候多定义几个使能信号。有点遗憾的是本次EDA课程设计设计的电子时钟日历中并没有实现星期功能,但如果一定要实现这样的功能的话,大概有两种思路:1、 在日历设置模式中再加上一个设置星期的按键,星期的改变是随着日期的改变而改变的,如果这次课设这样做的话,就会在原来的硬件的结构上要多分配一个专门的引脚用来设计星期数,并且考虑到如果一个日期定了的话实际上星期是不能人为地修改的。这种方案很简单,考虑到有点不太人性化,所以就放弃了。2、 另外做一个模块,输入信号为日历的年月日输出,这个模块根据输入的年月日计算出这个日期的星期数,然后把结果显示到数码管中。要实现这一功能模块,关键问题是怎么样把这个星期数给算出来,思考过后,可以先定制一个ROM,在ROM里存放是对应年份一月一日的星期数,这一模块先根据输入的年份通过查表查出该年的一月一号的星期数,然后再通过月份和号数计算出这一天是该年的第几天,再通过取余运算推出对应年月日的星期数。这一方案真正达到了人性化的要求,用户不需要专门去设置一个日期的星期数,而是系统自动算出。但该方案也有不少难点,课程设计中本人经过尝试,发现算对应日期为该年的第几天算法很是复杂,最终还是放弃了。因为学校提供了一套开发板,所设计的电路可以在开发板的基础之上运行,所以跟实际的电路设计还是有差别的,例如如果没有开发板的话,时钟就不能提供三个了,然是需要自己购买一个晶振,然后在晶振的基础之下进行适当地分频得系统中需要的频率;另一个是译码管,因为模式3提供了八个译码管,在实际设计电路的时候,还需要加一个译码电路或者购买译码芯片。通过这次比较系统地设计,几乎涵盖了VHDL语言设计中所有思想,并行语句,进程,信号的使用,变量的用法,原理图的绘制,加深了对EDA这门课程的理解及能够解决的问题。谢辞感谢华东交通大学信息工程学院提供的EDA开发板为我设计的电路提供硬件支持,感谢学校给我们提供的这次EDA课程设计机会,从中又进行了系统的EDA的学习,加强了独立思考问题能力。参考文献(1)潘松,黄继业编著 .EDA技术实用教程 ,2005 ,科学出版社(2)徐志军,徐光辉编著 . CPLD/FPGA的开发与应用 ,电子工业出版社,2001.1(3)/html/85/t-113885.html附录附录ILIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY time isport(mode,isc:in std_logic;clksecond,clkminute,clkhour,reset:in std_logic;second,minute,hour,tmode:out std_logic_vector(7 downto 0);csecond,cminute,cmode,morningafternoon:out std_logic-chour,);END ENTITY time;architecture one of time issignal ressecond,resminute,reshour,resmode:std_logic:=0;signal second0,second1,minute0,minute1,hour0,hour1:std_logic_vector(3 downto 0):=0000;signal modetemp,modetemp2:std_logic_vector(7 downto 0):=00000000;signal csecondtemp,cminutetemp,chourtemp,cmodetemp,morningafternoontemp:std_logic:=0;beginsecondpro:process(clksecond,reset)beginif reset=0 then second0=0000;second1=0000;csecondtemp=0;elsif clksecondevent and clksecond=1 thenif second1=0101 and second0=1001 then second1=0000;second0=0000;if isc=1 then csecondtemp=1;else csecondtemp=0;end if;elsif second0=1001 then second1=second1+1;second0=0000;csecondtemp=0;else second0=second0+1;csecondtemp=0;end if;end if;end process;minutepro:process(clkminute,resminute)beginif reset=0 then minute0=0000;minute1=0000;cminutetemp=0;elsif clkminuteevent and clkminute=1 thenif minute1=0101 and minute0=1001 then minute1=0000;minute0=0000;if isc=1 thencminutetemp=1;else cminutetemp=0;end if;elsif minute0=1001 then minute1=minute1+1;minute0=0000;cminutetemp=0;else minute0=minute0+1;cminutetemp=0;end if;end if;end process;hourpro:process(clkhour,reshour)variable timemode:std_logic_vector(7 downto 0):=00000000;variable count:integer range 0 to 2;beginif mode=0 then timemode:=00010001;else timemode:=00100011;end if;if reset=0 then hour0=0000;hour1=0000;chourtemp=0;elsif clkhourevent and clkhour=1 thenif hour1=timemode(7 downto 4) and hour0=timemode(3 downto 0) then hour1=0000;hour0=0000;chourtemp=1;count:=count+1;if mode=0 and count=2 then count:=0;morningafternoontemp=0;-上午if isc=1 then cmodetemp=1;else cmodetemp=0;end if;elsif mode=0 and count=1 then cmodetemp=0;morningafternoontemp=1;-下午elsif mode=1 and count=1 then count:=0;morningafternoontemp=0;-24if isc=1 then cmodetemp=1;else cmodetemp=0;end if;else cmodetemp=0;end if;elsif hour0=1001 then hour1=hour1+1;hour0=0000;chourtemp=0;cmodetemp=0;else hour0=hour0+1;chourtemp=0;cmodetemp=0;end if;end if;end process;process(mode,reset)begin if mode=0 then modetemp2=00010010;else modetemp2=00100100;end if;end process;second(7 downto 4)=second1;second(3 downto 0)=second0;minute(7 downto 4)=minute1;minute(3 downto 0)=minute0;hour(7 downto 4)=hour1;hour(3 downto 0)=hour0;tmode=modetemp2;csecond=csecondtemp;cminute=cminutetemp;cmode=cmodetemp;morningafternoon=morningafternoontemp;end architecture one;附录IILIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY calendar isport(isc:in std_logic;clkday,clkmonth,clkyear,reset:in std_logic;loadday:in std_logic_vector(1 downto 0);day,month:out std_logic_vector(7 downto 0);year:out std_logic_vector(15 downto 0);cday,cmonth:out std_logic);END ENTITY calendar;architecture one of calendar issignal year0:std_logic_vector(3 downto 0):=0001;signal year1:std_logic_vector(3 downto 0):=0001;signal year2:std_logic_vector(3 downto 0):=0000;signal year3:std_logic_vector(3 downto 0):=0010;signal month0:std_logic_vector(3 downto 0):=0110;signal month1:std_logic_vector(3 downto 0):=0001;signal day0:std_logic_vector(3 downto 0):=0010;signal day1:std_logic_vector(3 downto 0):=0010;signal cdaytemp,cmonthtemp:std_logic:=0;beginyear(15 downto 12)=year3;year(11 downto 8)=year2;year(7 downto 4)=year1;year(3 downto 0)=year0;month(7 downto 4)=month1;month(3 downto 0)=month0;day(7 downto 4)=day1;day(3 downto 0)=day0;cday=cdaytemp;cmonth=cmonthtemp;daypro:process(clkday,reset,loadday)variable totalday:std_logic_vector(7 downto 0):=00000000;beginif loadday=00 then totalday:=00101000;elsif loadday=01 then totalday:=00101001;elsif loadday=10 then totalday:=00110000;else totalday:=00110001;end if;if reset=0 then day0=0001;day1=0000;cdaytemp=totalday(7 downto 4) and day0=totalday(3 downto 0) then day1=0000;day0=0001;if isc=1 then cdaytemp=1;else cdaytemp=0;end if;elsif day0=1001 then day1=day1+1;day0=0001;cdaytemp=0;else day0=day0+1;cdaytemp=0;end if;end if;end process;monthpro:process(clkmonth,reset)beginif reset=0 then month0=0001;month1=0000;cmonthtemp=0;elsif clkmonthevent and clkmonth=1 thenif month1=0001 and month0=0010 then month1=0000;month0=0001;if isc=1 thencmonthtemp=1;else cmonthtemp=0;end if;elsif month0=1001 then month1=month1+1;month0=0001;cmonthtemp=0;else month0=month0+1;cmonthtemp=0;end if;end if;end process;yearpro:process(clkyear,reset)beginif reset=0 th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论