数字钟设计 课程设计.docx
《数字钟设计 课程设计.docx》由会员分享,可在线阅读,更多相关《数字钟设计 课程设计.docx(35页珍藏版)》请在冰豆网上搜索。
数字钟设计课程设计
东北石油大学
课程设计
课程硬件课程设计
题目数字钟设计
院系计算机与信息技术学院
专业班级
学生姓名
学生学号
指导教师
2009年7月10日
2012年7月6日
东北石油大学课程设计任务书
课程硬件课程设计
题目数字钟设计
专业计算机科学与技术姓名学号
主要内容、基本要求等
一、主要内容:
利用EL教学实验箱、微机和QuartusⅡ软件系统,使用VHDL语言输入方法设计数字钟。
可以利用层次设计方法和VHDL语言,完成硬件设计设计和仿真。
最后在EL教学实验箱中实现。
二、基本要求:
1.具有时,分,秒,计数显示功能,以24小时循环计时。
2.具有清零功能。
三、扩展要求:
1.调节小时、分钟功能。
2.整点报时功能,整点报时的同时LED灯花样显示。
四、参考文献:
[1]潘松,王国栋,VHDL实用教程〔M〕.成都:
电子科技大学出版社,2000.
(1)
[2]崔建明主编,电工电子EDA仿真技术北京:
高等教育出版社,2004
[3]李衍编著,EDA技术入门与提高王行西安:
西安电子科技大学出版社,2005
[4]侯继红,李向东主编,EDA实用技术教程北京:
中国电力出版社,2004
[5]沈明山编著,EDA技术及可编程器件应用实训北京:
科学出版社,2004
完成期限19~20周
指导教师
专业负责人
2012年6月10日
摘要
本文介绍了利用EDA-V硬件系统和微机上的Quartus7.2-II等软件系统。
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
本文设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为23时59分59秒,另外还具有校时功能和闹钟功能。
总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。
并且使用Quartus7.2-II软件进行电路波形仿真,下载到EDA实验箱进行验证。
关键词:
EDA(电子设计自动化);VHDL(硬件描述语言),数字钟。
目 录
参考文献………………………………………………………………………….….26
第1章概述
1.1EDA的概念
现在是一个知识爆炸的新时代。
新产品、新技术层出不穷,电子技术的发展更是日新月异。
可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。
在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。
因此我们需要一个定时系统来提醒这些忙碌的人。
数字化的钟表给人们带来了极大的方便。
近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
EDA代表了当今电子设计技术的最新发展方向,它的基本特征是:
设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片专用集成电路(ASIC)实现,然后采用硬件描述语言(HDL)完成系统行为级设计,最后通过综合器和适配器生成最终的目标器件,这样的设计方法被称为高层次的电子设计方法。
1.1.1EDA技术及应用
电子设计技术的核心就是EDA技术,EDA是指以计算机为工作平台,融合应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作,即IC设计、电子电路设计和PCB设计。
EDA技术已有30年的发展历程,大致可分为三个阶段。
70年代为计算机辅助设计(CAD)阶段,人们开始用计算机辅助进行IC版图编辑、PCB布局布线,取代了手工操作。
80年代为计算机辅助工程(CAE)阶段。
与CAD相比,CAE除了有纯粹的图形绘制功能外,又增加了电路功能设计和结构设计,并且通过电气连接网络表将两者结合在一起,实现了工程设计。
CAE的主要功能是:
原理图输人,逻辑仿真,电路分析,自动布局布线,PCB后分析。
90年代为电子系统设计自动化(EDA)阶段[3]。
EDA技术发展迅猛,逐渐在教学、科研、产品设计与制造等各方面都发挥着巨大的作用。
在教学方面:
几乎所有理工科(特别是电子信息)类的高校都开设了EDA课程。
主要是让学生了解EDA的基本原理和基本概念、鳞握用佃L描述系统逻辑的方法、使用扔A工具进行电子电路课程的模拟仿真实验并在作毕业设计时从事简单电子系统的设计,为今后工作打下基础。
具有代表性的是全国每两年举办一次大学生电子设计竞赛活动。
在科研方面:
主要利用电路仿真工具(EWB或PSPICE、VLOL等)进行电路设计与仿真;利用虚拟仪器进行产品调试;将O)LI)/FPGA器件的开发应用到仪器设备中。
例如在CDMA无线通信系统中,所有移动手机和无线基站都工作在相同的频谱,为区别不同的呼叫,每个手机有一个唯一的码序列,CDMA基站必须能判别这些不同观点的码序列才能分辨出不同的传呼进程;这一判别是通过匹配滤波器的输出显示在输人数据流中探调到特定的码序列;FPGA能提供良好的滤波器设计,而且能完成DSP高级数据处理功能,因而FPGA在现代通信领域方面获得广泛应用[4]。
在产品设计与制造方面:
从高性能的微处理器、数字信号处理器一直到彩电、音响和电子玩具电路等,EDA技术不单是应用于前期的计算机模拟仿真、产品调试,而且也在批量制作、电子设备的研制与生产、电路板的焊接等有重要作用。
可以说电子EDA技术已经成为电子工业领域不可缺少的技术支持。
本设计主要研究基于FPGA的数字钟,要求时间以24小时为一个周期,显示时、分、秒。
采用1HZ的基准信号产生1S的基准时间,秒的个位加到10就向秒的十位进一,秒的十位加到6就向分的个位进一,分的个位加到10就向分的十位进一,分的十位加到6就向时进一。
该时钟具有清零功能,可以对时、分及秒进行清零,为了保证计时的稳定及准确须由晶体振荡器提供时间基准信号。
该系统是基于FPGA的设计,采用VHDL进行系统功能描述,采用自顶向下的设计方法,用QUARTUSⅡ软件进行仿真测试。
1.2EDA的工作平台
1.2.1EDA硬件工作平台
1.计算机。
2.EDA实验开发系统:
EDA-V。
1.2.2EDA的软件工作平台
PLD(ProgrammableLogicDevice)是一种由用户根据需要而自行构造逻辑功能的数字集成电路。
目前主要有两大类型:
CPLD(ComplexPLD)和FPGA(FieldProgrammableGateArray)。
它们的基本设计方法是借助于EDA软件,用原理图、状态机、布尔表达式、硬件描述语言等方法,生成相应的目标文件,最后用编程器或下载电缆,由目标器件实现。
生产PLD的厂家很多,但最有代表性的PLD家为Altera、Xilinx和Lattice公司。
第2章数字钟的系统分析
2.1设计目的
1)掌握VHDL语言的基本运用
2)掌握MAX+plusII的简单操作并会使用EDA实验箱
3)掌握一个基本EDA实验的操作
2.2功能说明
1)有时、分、秒计数显示功能,小时为24进制,分钟和秒为60进制
2)设置复位、清零等功能
3)有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间
4)设置调试模式和计时两个模式,分别实现计时和调时功能,通过设置任意时间实现闹铃功能
2.3实验原理
在同一EPLD芯片EPF10K10上集成了如下电路模块:
1.时钟计数:
秒——60进制BCD码计数;
分——60进制BCDD码计数;
时——24进制BCDD码计数;
同时整个计数器有清零,调分,调时功能。
在接近整数时间能提供报时信号。
2.具有驱动8位八段共阴扫描数码管的片选驱动信号输出和八段字形译码输出。
编码和扫描可参照“实验四”。
3.扬生器在整点时有报时驱动信号产生。
4.LED灯按个人口味在整点时有花样显示信号产生。
2.4系统硬件
1.主芯片EPF10K10LC84-4。
2.8个LED灯。
3.扬声器。
4.8位八段扫描共阴级数码显示管。
5.三个按键开关(清零,调小时,调分钟)。
第3章数字钟的底层电路设计
3.1设计规划
该数字钟可以实现3个功能:
计时功能、整点报时功能和重置时间功能,因此有3个子模块:
计时、报时(alarm1)、重置时间(setmin1、sethour1)。
其中计时模块有3部分构成:
秒计时器(second1)、分计时器(minute1)、时计时器(hour1)。
1.秒计数模块:
秒计数,在频率为1HZ的时钟下以60次为循环计数,并产生进位信号影响分计数。
2.分计数模块:
分计数,在秒进位信号为高电平时,计数一次,同样以60次为一个循环计数,同时产生分进位信号影响时计数。
3.时计数模块:
时计数,在分进位信号为高电平时,计数一次,以24次为一个循环计数。
4.时间显示模块:
通过选中不同的数码管,同时进行一定频率的扫描显示时,分,秒。
5.时间设置模块:
设置调试使能端,可以调时,分。
基本功能是在使能端为高电平时,可以使时和分循环计数;
6.整点报时模块:
在秒计数到50秒时,同时分计数到59分开始,丰鸣器产生每个2秒的鸣叫(500HZ),到整点是产生750HZ的鸣叫。
7.闹钟模块:
在设定闹钟闹铃时间后,当闹钟使能端有效时,可在闹铃时间闹铃,并有彩灯显示。
3.2设计说明
首先分析数字时钟,得出进位法则大体相同,故所得时分秒进位方式语法基本相同,因此可以将时分秒定义成六位输出端口,即分别将时分秒定义为3个component,分别给予设计。
3.3底层电路程序
3.3.1秒计时器(VHDL语言编译)
其代码如下:
(VHDL语言):
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYsecondIS
PORT(
clk,reset,setmin:
INSTD_LOGIC;
enmin:
OUTSTD_LOGIC;
daout:
outstd_logic_vector(6downto0));
ENDentitysecond;
ARCHITECTUREfunOFsecondIS
SIGNALcount:
STD_LOGIC_VECTOR(6downto0);
BEGIN
daout<=count;
process(clk,reset,setmin)
begin
--enmin<=k;
if(reset='0')then
count<="0000000";
elsif(setmin='0')then
enmin<=clk;
elsif(clk'eventandclk='1')then
if(count(3downto0)="1001")then
if(count<16#60#)then
if(count="1011001")then
enmin<='1';
count<="0000000";
ELSE
count<=count+7;
endif;
else
count<="0000000";
endif;
elsif(count<16#60#)then
count<=count+1;
enmin<='0'after100ns;
else
count<="0000000";
endif;
endif;
endprocess;
ENDfun;
秒计时器实际上是一个60进制的计数器,它从时钟脉冲接受脉冲信号,每当一个脉冲信号来时,秒就自动加1,所以,输入的时钟信号应该是的频率应该是1hz,当秒计满60时,发出一个脉冲信号给分组件,再将本身清零。
这样,每计满60s,分钟就加1,正好按着正常的时间规律计时。
3.3.2分计时器(VHDL语言编译)
其代码(VHDL语言)如下:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYminuteIS
PORT(
clk,clk1,reset,sethour:
INSTD_LOGIC;
enhour:
OUTSTD_LOGIC;
daout:
outstd_logic_vector(6downto0));
ENDentityminute;
ARCHITECTUREfunOFminuteIS
SIGNALcount:
STD_LOGIC_VECTOR(6downto0);
BEGIN
daout<=count;
process(clk,reset,sethour)
begin
if(reset='0')then
count<="0000000";
elsif(sethour='0')then
enhour<=clk1;
elsif(clk'eventandclk='1')then
if(count(3downto0)="1001")then
if(count<16#60#)then
if(count="1011001")then
enhour<='1';
count<="0000000";
ELSE
count<=count+7;
endif;
else
count<="0000000";
endif;
elsif(count<16#60#)then
count<=count+1;
enhour<='0'after100ns;
else
count<="0000000";
endif;
endif;
endprocess;
ENDfun;
分计时器也是一个60进制的计数器,它从秒计时器的脉冲输出端接受脉冲信号。
每当一个脉冲信号来时,分就自动加1,当分计满60时,发出一个脉冲信号给时组件,再将本身清零。
这样,每计满60MIN,小时就加1,正好按着正常的时间规律计时。
该模块还能对分进行数字调整,并可以将其全部清零。
3.3.3时计时器(VHDL语言)
代码如下:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYhourIS
PORT(
clk,reset:
INSTD_LOGIC;
daout:
outstd_logic_vector(5downto0));
ENDentityhour;
ARCHITECTUREfunOFhourIS
SIGNALcount:
STD_LOGIC_VECTOR(5downto0);
BEGIN
daout<=count;
process(clk,reset)
begin
if(reset='0')then
count<="000000";
elsif(clk'eventandclk='1')then
if(count(3downto0)="1001")then
if(count<16#24#)then
count<=count+7;
else
count<="000000";
endif;
elsif(count<16#24#)then
count<=count+1;
else
count<="000000";
endif;
endif;
endprocess;
ENDfun;
时计时器是一个24进制的计数器,它从分组件的脉冲信号输出端接受脉冲信号,每当一个脉冲信号来时,时就自动加1,并且输出个信号给时组件,直到计满24,再将本身清零。
该组件还能对时进行数字调整,并可以将其全部清零。
3.3.4时间显示Deled(VHDL语言)
代码如下:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdeledIS
PORT(num:
INstd_logic_vector(3downto0);
led:
OUTstd_logic_vector(6downto0));
ENDdeled;
ARCHITECTUREfunOFdeledIS
BEGIN
led<="1111110"whennum="0000"else
"0110000"whennum="0001"else
"1101101"whennum="0010"else
"1111001"whennum="0011"else
"0110011"whennum="0100"else
"1011011"whennum="0101"else
"1011111"whennum="0110"else
"1110000"whennum="0111"else
"1111111"whennum="1000"else
"1111011"whennum="1001"else
"1110111"whennum="1010"else
"0011111"whennum="1011"else
"1001110"whennum="1100"else
"0111101"whennum="1101"else
"1001111"whennum="1110"else
"1000111"whennum="1111";
ENDfun;
Deled模块是一个简单的电路,它的功能将时、分、秒三个组件中所计的数编码后,能对应在七段数码管山显示成数字形式。
3.3.5报时模块alert(VHDL语言)
代码如下:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYalertIS
PORT(
clk:
INSTD_LOGIC;
dain:
INSTD_LOGIC_VECTOR(6DOWNTO0);
speak:
OUTSTD_LOGIC;
lamp:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDalert;
ARCHITECTUREfunOFalertIS
signalcount:
std_logic_vector(1downto0);
signalcount1:
std_logic_vector(1downto0);
BEGIN
speaker:
process(clk)
begin
speak<=count1
(1);
if(clk'eventandclk='1')then
if(dain="000000")then
if(count1>="10")then
count1<="00";
else
count1<=count1+1;
endif;
endif;
endif;
endprocessspeaker;
lamper:
process(clk)
begin
if(rising_edge(clk))then
if(count<="10")then
if(count="00")then
lamp<="001";
elsif(count="01")then
lamp<="010";
elsif(count="10")then
lamp<="100";
endif;
count<=count+1;
else
count<="00";
endif;
endif;
endprocesslamper;
ENDfun;
报时模块也是个简单的程序,它的功能是:
当每满一个小时时,有该组件输出一个脉冲信号给试验箱上的喇叭,喇叭会相应其信号,能持续发出一段蜂鸣声,从而达到报时的目的。
3.3.6译码模块seltime(VHDL语言)
代码如下:
LIBRARYieee;
useieee.std_logic_1164.all
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
ENTITYseltimeIS
PORT(
clk1,reset:
INSTD_LOGIC;
sec,min:
INSTD_LOGIC_VECTOR(6downto0);
hour:
instd_logic_vector(5downto0);
daout:
OUTSTD_LOGIC_vector(3downto0);
sel:
outstd_logic_vector(2downto0));
ENDseltime;
ARCHITECTUREfunOFseltimeIS
SIGNALcount:
STD_LOGIC_vector(2downto0);
BEGIN
sel<=count;
process(clk