电子钟设计EDA大作业.docx

上传人:b****2 文档编号:2610166 上传时间:2023-05-04 格式:DOCX 页数:36 大小:358.84KB
下载 相关 举报
电子钟设计EDA大作业.docx_第1页
第1页 / 共36页
电子钟设计EDA大作业.docx_第2页
第2页 / 共36页
电子钟设计EDA大作业.docx_第3页
第3页 / 共36页
电子钟设计EDA大作业.docx_第4页
第4页 / 共36页
电子钟设计EDA大作业.docx_第5页
第5页 / 共36页
电子钟设计EDA大作业.docx_第6页
第6页 / 共36页
电子钟设计EDA大作业.docx_第7页
第7页 / 共36页
电子钟设计EDA大作业.docx_第8页
第8页 / 共36页
电子钟设计EDA大作业.docx_第9页
第9页 / 共36页
电子钟设计EDA大作业.docx_第10页
第10页 / 共36页
电子钟设计EDA大作业.docx_第11页
第11页 / 共36页
电子钟设计EDA大作业.docx_第12页
第12页 / 共36页
电子钟设计EDA大作业.docx_第13页
第13页 / 共36页
电子钟设计EDA大作业.docx_第14页
第14页 / 共36页
电子钟设计EDA大作业.docx_第15页
第15页 / 共36页
电子钟设计EDA大作业.docx_第16页
第16页 / 共36页
电子钟设计EDA大作业.docx_第17页
第17页 / 共36页
电子钟设计EDA大作业.docx_第18页
第18页 / 共36页
电子钟设计EDA大作业.docx_第19页
第19页 / 共36页
电子钟设计EDA大作业.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

电子钟设计EDA大作业.docx

《电子钟设计EDA大作业.docx》由会员分享,可在线阅读,更多相关《电子钟设计EDA大作业.docx(36页珍藏版)》请在冰点文库上搜索。

电子钟设计EDA大作业.docx

电子钟设计EDA大作业

课程设计(论文)任务书

信息工程学院 学  院 通信工程  专  业 2011.1,2,3,4 班   

一、课程设计(论文)题目 电子钟设计   

二、课程设计(论文)工作自2014年1月5日起至2014年1月11日止。

三、课程设计(论文)地点:

华东交通大学4-410,图书馆

四、课程设计(论文)内容要求:

1.本课程设计的目的

(1)掌握EDA技术及CPLD/FPGA的开发流程;

(2)掌握自顶向下的设计思想;

(3)掌握电子钟的工作原理;

(4)掌握系统设计的分析方法;

(5)提高学生的科技论文写作能力。

2.课程设计的任务及要求

1)基本要求:

(1)用HDL设计一个多功能数字钟,包含以下主要功能:

精确计时,时间可以24小时制或12小时制显示;

(2)日历:

显示年月日星期;

(3)能用QuartusII软件仿真;

(4)把设计文件进行仿真并下载到实验箱实现功能验证。

2)创新要求:

在基本要求达到后,可进行创新设计,如增加报时等、秒表功能模块。

3)课程设计论文编写要求

(1)要按照书稿的规格打印誊写论文

(2)论文包括目录、绪论、正文、小结、参考文献、谢辞、附录等

(3)论文装订按学校的统一要求完成

4)答辩与评分标准:

(1)完成系统分析:

30分;

(2)完成设计过程:

30分;

(3)完成仿真:

10分;

(4)完成下载:

10分;

(5)回答问题:

20分。

5)参考文献:

(1)潘松,黄继业编著.《EDA技术实用教程》,2005,科学出版社

(2)徐志军,徐光辉编著.《CPLD/FPGA的开发与应用》,电子工业出版社,2001.1

(3)

6)课程设计进度安排

内容天数      地点

构思及收集资料1       图书馆

设计与调试3      实验室

撰写论文2      图书馆、实验室

学生签名:

2014年1月11日

课程设计(论文)评审意见

(1)设计程序  (40分):

优( )、良( )、中( )、一般( )、差( );

(2)仿真结果  (10分):

优( )、良( )、中( )、一般( )、差( );

(3)下载结果  (10分):

优( )、良( )、中( )、一般( )、差( );

(4)回答问题  (10分):

优( )、良( )、中( )、一般( )、差( );

(5)报告成绩(30分):

优( )、良( )、中( )、一般( )、差( );

(6)格式规范性及考勤是否降等级:

是( )、否( )

评阅人:

朱路   职称:

副教授

2014年1月12日

 

o目录

目录1

绪论2

第一章总体设计3

一、功能概述3

二、引脚功能3

1、时钟输入3

2、时分秒或年月日输入3

3、清零输入4

4、整点报时闹铃开关输入4

5、时间显示模式开关输入4

6、上午下午状态输出4

7、时分秒、年月日、秒表显示输出4

8、整点报时、闹铃声音输出4

第二章模块分析4

一、时间显示及时间修改模块4

1、TIME子模块介绍(实现功能程序代码见附录I)5

2、调秒功能实现分析5

二、日历显示及日历设置模块6

三、秒表模块8

四、闹铃设置模块9

五、整点报时及闹铃使能模块10

六、功能切换及显示切换模块12

1、显示切换模块12

2、功能切换模块13

七、各模块的整合14

第三章硬件测试结果15

小结16

谢辞16

参考文献16

附录17

绪论

本次课程设计主要介绍VHDL电子时钟的设计方法,采用的软件是MAX PLUSII。

随着现代集成电路的发展,CPLD/FPGA芯片性越来越好,VHDL硬件描述语言使得我们设计一个电路只写一些代码就可以了。

其实,电子时钟的设计可以采用众多方法。

利用单片机我们可以设计出一个比较简单的电子时钟系统,使用它的好处是我们可以采用汇编、C语言来设计这个系统,这些语言给我们提供了许多接口,这对我们编写代码带来了很大的方便。

单片机设计出来的电子时钟也有它的不足之处,可扩展性差,比如说我们需要在电子时钟的基础之上添加一起其它的功能,那很可能是我们不仅仅需要把整个程序修改,甚至可能需要对硬件电路作出修改,给我们的设计带来较大的不便。

利用一些组合、时序电路同样也可以设计出一个简单的电子时钟,这样做的是可能我们的花费会比较少,由于集成电路集成度的不断发展,一些芯片可能会比较廉价,但是要设计好一个电子时钟系统的话,仅仅使用一些简单的芯片来实现是比较复杂的,更关键的是,我们把电路通过这种方法设计好之后,基本上就没有了扩展性,要在原由的基础之上想发动电路几乎是不可能的。

本文介绍采用VHDL硬件描述语言来描述电子时钟系统解决了以上所有弊端,首先就设计简易程度来说,它会让传统的电路设计方法汗颜,我们可能仅仅几行代码就可以把一个电路设计出来,如果在传统的电路上设计,我们却可能要花费很长的时间,有时甚至可能会遗漏一些情况导致我们的电路不满足设计要求。

另外一点,VHDL硬件描述语言设计出来的电路可移植性特别强,在CPLD/FPGA上设计好一电路之后,我们可以很方便地在原由的基础之上加上一些其它的电路结构,而却不对原来的电路产生任何影响。

综上所述,本文将介绍利用VHDL语言设计电子时钟的设计方法,下面开始我们的设计!

第一章总体设计

顶层文件

一、功能概述

整个系统分为六个模式:

时间显示模式、日历显示模式、时间设置模式、日历设置模式、秒表模式、闹铃铃设置模式。

时间、日历显示模式中,除了切换模式功能键有效外其它任何键都是无效的,而时间、日历、闹铃设置模式中系统中设计所有的功能键都是有效的,秒表模式中只有切换模式和清零功能键是有效的。

二、引脚功能

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为低电平。

第二章模块分析

一、时间显示及时间修改模块

1、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进制。

2、调秒功能实现分析

secondpro:

process(clksecond,reset)

begin

ifreset='0'thensecond0<="0000";second1<="0000";csecondtemp<='0';

elsifclksecond'eventandclksecond='1'then

ifsecond1="0101"andsecond0="1001"then

second1<="0000";second0<="0000";

ifisc='1'thencsecondtemp<='1';

elsecsecondtemp<='0';

endif;

elsifsecond0="1001"then

second1<=second1+1;second0<="0000";csecondtemp<='0';

elsesecond0<=second0+1;csecondtemp<='0';

endif;

endif;

endprocess;

以上显示的是调秒时的进程,监测两个信号,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。

由于该子模块设计较简单,这里不再累述。

按照设计好电路后,该模块就能够满足设计要求,该模块的实验仿真图:

可以看出,即使Hset存在时钟信号,但由于EN拉高了,hour,minute,second的值只会随时钟Clk的变化面变化,正常显示时间,即时间显示模式;即使Clk存在时钟,但由于EN拉低了,hour,minute,second的值只会随Hset、Mset、Sset的变化而变化,为时间设置模式。

二、日历显示及日历设置模块

CALENDAR子模块介绍(实现功能程序代码见附录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。

功能仿真时序图:

从以上图中可以看出,当为2011年02月时,无论怎样调整日期,day的输出也不会超过28天,满足设计要求。

下面是一个中子模块DAY的一个进程(用来实时地计算输入年份和月份的总天数):

process(year,month)

begin

ifnot(yeartemp="00")andmonthtemp="00000010"thentotaltemp<="00";

elsifyeartemp="00"andmonthtemp="00000010"thentotaltemp<="01";

elsifmonthtemp="00000100"ormonthtemp="00000110"ormonthtemp="00001001"ormonthtemp="00001011"thentotaltemp<="10";

elsifmonthtemp="00000001"ormonthtemp="00000011"ormonthtemp="00000101"ormonthtemp="00001000"ormonthtemp="00001010"ormonthtemp="00001100"thentotaltemp<="11";

endif;

endprocess;

要说明的是,这里判断一个年份是否为闰年的方法是有点问题的,这里把问题简化了,真正的判断方法是:

能被4整除而不能被100整除。

能被400整除。

只要满足上面一个条件就可以判断一个年份是闰年了,这里仅仅判断一个年份能否被4整除,并没有考虑到能否被100整除,但实际上考虑到电子时钟的使用寿命和现在的年份仅仅考虑能否被4整除就可以了。

能被4整除的话就是闰年否则为平年,在二进制里如果一个数值能被4整除那它的低两位肯定都是“00”的。

一个年份是平年还闰年只会影响二月份的总天数,其它的月份的天数都是固定的。

三、秒表模块

秒表功能模块相比其它模块来说较简单的,如上图所示,该模块只需要在8个10进制计数器子模块的基础之上就能够实现了,EN为计数器使能端,当EN为高电平的时候计数器有效,RESET为异步清零端,下面是一个十进制的计数器设计,即图2.31中的子模块SECOND的设计(结构体部分):

architectureoneofsecondis

signalqtemp:

std_logic_vector(3downto0):

="0000";

signalcouttemp:

std_logic;

begin

process(reset,en,clk)

begin

ifreset='0'thenqtemp<=(others=>'0');couttemp<='0';

else

ifclk'eventandclk='1'then

ifen='1'then

ifqtemp="1001"thenqtemp<="0000";couttemp<='1';

elseqtemp<=qtemp+1;couttemp<='0';

endif;

endif;

endif;

endif;

下面为秒表模块功能仿真图,仿真过程中让使能EN有效,RESET清零无效,从仿真图可以看出,该模块的设计满足设计要求,即整个显示都是十进制的(0~99999999依次增加)。

四、闹铃设置模块

闹铃设置模块元件封装图,有四个信号输入端口和32位信号输出接译码管,其中ALALARMSECOND为设置的秒,ALARMMINUTE为设置的分,ALARMHOUR为设置的时,ALARMMODE固定输出为“88”,用于区别于其它模式。

RESET为异步清零端口,EN为CLKSECOND、CLKMINUTE、CLKHOUR使能端,当EN为高电平时,CLKSECOND、CLKMINUTE、CLKHOUR设置有效,如果给它们上升沿,输出将对应地改变。

需要说明的是,考虑到时间显示模块中含有十二进制和二十四进制的,但这里闹铃设置模块中并没有考虑到,只设置成了二十四进制的,也就是说,如果事个系统开启了闹铃功能,并且闹铃设计在12时以前,并且时间显示为十二进制的话,那么系统在上午和下午的时刻都会发生闹铃事件;而假如设置的闹铃是在12点以后,那么即闹铃了,而由于显示模式为12进制的,闹铃的声音永远也不会发出。

由于课设时间有限,这里就没有在这方面加以改善了,但如果要把它开发成产品的话,这些工作不是必需要去做的,做的思想跟时间显示及设置模块中的思路一致,根据信号输入来决定输入时分秒的输入范围,从而实现真正的闹铃设置功能。

下面图4.2是该模块的功能仿真图:

从上图可以看出,只要reset为低,那么输出的时分秒都立刻清零,当EN为低电平时,即使用户试图修改时分秒,时分秒输出的值也不会发生改变。

闹铃功能模块代码实现见附录III。

五、整点报时及闹铃使能模块

在时间显示模块中加上了一个NEWHOUR输出,当当前时间为整点时,NEWHOUR输出高电平并保持一分钟,其它时刻NEWHOUR都是低电平,将此信号接到模块SOUNDEVENT中的NEWHOUR输入,模块SOUNDEVENT就能够据此来判断是否送出整点报时信号了,这里另外加了一个OPENSOUND输入信号,用来识别用户是否开启整点报时功能,当OPENSOUND为高电平时代表开启了,这里的时间输入分别来自时间显示模块及闹铃设置模块中的时间输出,同样地这里加上了OPENALARAM信号,用来识别用户是否开启了闹铃功能。

当开启了整点报时功能并且满足要求时SOUNDOUT输出高电平,其它情况输出低电平;当开启了闹铃功能并且条件满足的时ALARAMOUT输出高电平,其它情况输出低电平。

在设计过程中,考虑到扬声器只有一个,而却要实现两种不同频率的声音,这里另外加上了一个SOUND模块,用于控制输出声音的频率,如图5.2所示,CLK1,CLK2分别接两个不同频率的声音信号,在硬件测试过程中,接到两个不同频率的时钟信号代替即可,SEL[1..0]接到模块SOUNDEVENT中的SOUNDOUT和ALARAM,SOUND模块其实是一个选择器,下面是它的实现代码:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYsoundis

port(

clk1,clk2:

instd_logic;

sel:

instd_logic_vector(1downto0);

cout:

outstd_logic

);

ENDENTITYsound;

architectureoneofsoundis

begin

process(sel,clk1,clk2)

begin

ifsel="00"thencout<='0';

elsifsel="01"thencout<=clk1;

elsifsel="10"thencout<=clk2;

elsifsel="11"thencout<=clk2;

endif;

endprocess;

endarchitectureone;

下表为输入输出关系表:

sel值

00

01

10

11

cout输出

0

clk1

clk2

clk2

模块SOUNDEVENT功能仿真图:

当把当前时间和闹铃设置的时间都设置成00点23分02秒时,并且openalarm为高时,alarmout将输出高电平。

六、功能切换及显示切换模块

1、显示切换模块

整个系统分为时间显示,日历显示,时间设置,日历设置,秒表,闹铃设置共六个模式,但它的可视化部分都是用同样的八个译码管,所以在功能切换的时候,就要根据不同的模式来显示对应模块中的输出内容。

虽然这里有六个模式,但由于在前面的设计过程中,时间显示模块和时间设置模块是做在一个模块里的,日历显示和日历设置模块做在一个模块里,所以所以这里的显示切换只需要做一个四选一的选择器就可以了。

这里显示切换模块用到了八个MUX41,MUX41为四选一选择器,程序代码如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYmux41ISPORT(

a,b,c,d:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(3downto0);

sel:

instd_logic_vector(1downto0)

);

ENDENTITYmux41;

ARCHITECTUREONEOFmux41IS

BEGIN

process(sel,a,b,c,d)

begin

ifsel="00"thenq<=a;

elsifsel="01"thenq<=b;

elsifsel="10"thenq<=c;

elsifsel="11"thenq<=d;

endif;

endprocess;

ENDARCHITECTUREONE;

通过上述程序代码可知,当sel=00时,q输出为a,当sel=01时,q输出为b,当sel=10时,q输出为c,当sel=10时,q输出为d。

这在后面的功能切换模块中会用来这些信号。

2、功能切换模块

所示的CONTROL模块为总个系统的管理模块,用于调度各个模块的正常工作运行。

其中SET、TIMEMODE、RESET、CLK0、CLK1、CLK2为输入信号,其它的全部为输出信号,各输出信号分别接到各个模块的使能端、清零端、设置端等。

这个管理模块用到状态机的思想,其中SET的状态控制着整个系统的有序进行,给以SET不间断的时钟信号,状态机的状态在各个状态之间循环。

此状态机的状态切换示意图:

功能切换模块实现代码见附录IV。

七、各模块的整合

设计好各个模块之后,通过控制管理模块就可以把整个系统综合到一个电路中了,各个模块的连接关系:

 

整个系统的功能仿真图:

一启动程序,显示的是时间显示模式,给MODECHANGE一个上升沿后进入日历显示模式,再给一个上升沿进入时间设置模式,图中设置为05点24分46秒,再给一个上升沿进入日历设置模式,图中设置为2011年06月

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2