基于VHDL的数字时钟设计与实现.docx
- 文档编号:12046331
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:19
- 大小:390.75KB
基于VHDL的数字时钟设计与实现.docx
《基于VHDL的数字时钟设计与实现.docx》由会员分享,可在线阅读,更多相关《基于VHDL的数字时钟设计与实现.docx(19页珍藏版)》请在冰豆网上搜索。
基于VHDL的数字时钟设计与实现
基于VHDL的数字时钟设计
学院:
信息工程与自动化
专业:
通信工程
班级:
通信101
姓名:
李红
学号:
201010404133
成绩:
日期:
2013年6月8日
目录
1引言………………………………………………………………………………3
2需求分析…………………………………………………………………………3
3相关知识介绍
3.1EDA概述…………………………………………………………………3
3.2VHDL概述
3.2.1VHDL的特点…………………………………………………………4
3.2.2VHDL的设计结构……………………………………………………4
3.2.3VHDL的设计步骤……………………………………………………5
4数字钟总体设计方案
4.1数字钟的总体设计方案…………………………………………………5
4.2数字钟的模块设计方案…………………………………………………5
5VHDL程序设计
5.1秒模块设计………………………………………………………………6
5.2分模块程序………………………………………………………………6
5.3时模块程序………………………………………………………………7
5.4星期模块程序……………………………………………………………8
5.5报时模块程序……………………………………………………………8
5.6系统设计…………………………………………………………………8
6.调试过程
6.1秒模块调试………………………………………………………………10
6.2分模块调试………………………………………………………………11
6.3时模块调试………………………………………………………………11
6.4星期模块调试……………………………………………………………11
6.5报时模块调试……………………………………………………………12
6.6系统总调试………………………………………………………………12
6.7调试结论…………………………………………………………………13
7心得体会………………………………………………………………………14
1引言
随着科学技术的迅猛发展,电子工业界经历了巨大的飞跃。
集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。
基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。
可编程逻辑器件和相应的设计技术体现在三个主要方面:
一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的EDA开发工具,它主要用来进行可编程逻辑器件应用的具体实现。
在本实验中采用了集成度较高的FPGA可编程逻辑器件,选用了VHDL硬件描述语言和MAX+plusⅡ开发软件。
VHDL硬件描述语言在电子设计自动化(EDA)中扮演着重要的角色。
由于采用了具有多层次描述系统硬件功能的能力的“自顶向下”(Top-Down)和基于库(Library-Based)的全新设计方法,它使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短
了产品的研制周期。
MAX+plusⅡ是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系。
2需求分析
现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。
支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。
前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronicdesignautomatic,EDA)技术。
本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。
ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。
而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所设置的功能。
因此,键信息输入是与软件结构密切相关的过程。
根据键盘的结构不同,采用不同的编码方法。
但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
3相关知识介绍
3.1EDA概述
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
3.2VHDL概述
3.2.1VHDL的特点
硬件描述语言HDL(HardwareDescriptionLanguage)诞生于1962年。
HDL是用形式化的方法描述数字电路和设计数字逻辑系统的语言。
主要用于描述离散电子系统的结构和行为。
与SDL(SoftwareDescriptionLanguage)相似,经历了从机器码(晶体管和焊接)、汇编(网表)、到高级语言(HDL)的过程。
VHDL翻译成中文就是超高速集成电路硬件描述语言,他诞生于1982年。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,(即IEEE标准的1076-1993版本)主要是应用在数字电路的设计中。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
目前,它在中国的应用多数是用FPGA/CPLD/EPLD的设计中。
当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
3.2.2VHDL的设计结构
VHDL描述数字电路系统设计的行为、功能、输入和输出。
它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VHDL将一个设计称为一个实体Entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。
当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。
所以,内部和外部的概念对系统设计的VHDL是十分重要的。
外部的实体名或连接由实体声明Entity来描述。
而内部的实体算法或实现则由结构体Architecture来描述。
结构体可以包含相连的多个进程process或者组建component等其他并行结构。
需要说明的是,它们在硬件中都是并行运行的。
3.2.3VHDL的设计步骤
采用VHDL的系统设计,一般有以下6个步骤。
1)要求的功能模块划分;
2)VHDL的设计描述(设计输入);
3)代码仿真模拟(前仿真);
4)计综合、优化和布局布线;
5)布局布线后的仿真模拟(后仿真);
6)设计的实现(下载到目标器件)。
4数字钟设计
4.1数字钟的总体设计方案
该数字钟可以实现3个功能:
计时功能、整点报时功能和重置时间功能,因此有3个子模块:
计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。
其中计时模块有4部分构成:
秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。
工作模式如图:
4.2数字钟的模块设计方案
秒计时器(second1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,秒计时器清0;set为置数信号,当set为0时,秒计时器置数,置s1的值。
clk为驱动秒计时器的时钟,sec为秒计时器的输出,ensec为秒计时器的进位信号,作为下一级的时钟输入信号。
分计时器(minute1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,分计时器清0;set为置数信号,当set为0时,分计时器置数,置m1的值。
clkm为驱动分计时器工作的时钟,与ensec相连接;min为分计时器的输出;enmin为分计时器的进位信号,作为下一级的时钟输入信号。
时计时器(hour1)是由一个24进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,时计时器清0;set为置数信号,当set为0时,时计时器置数,置h1的值。
clkh为驱动时计时器工作的时钟,与enmin相连接;hour为时计时器的输出;enhour为时计时器的进位信号,作为下一级的时钟输入信号。
星期计时器(day1)是由一个7进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,星期计时器清0;set为置数信号,当set为0时,星期计时器置数,置d1的值。
clkd为驱动星期计时器工作的时钟,与enhour相连接;day为星期计时器的输出。
报时模块(alarm1)的功能是当整点(将min作为该模块的输入信号,min=00)时,alarm输出高电平,并且持续1分钟。
5VHDL实现各模块程序设计
5.1秒模块设计
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entitysecond1is
Port(clk,set,reset:
instd_logic;
S1:
instd_logic_vector(7downto0);――置数端(秒)
Sec:
bufferstd_logic_vector(7downto0);――秒输出端
Ensec:
outstd_logic);―秒计时器的进位,用来驱动分计时器
End;
Architectureaofsecond1is
Begin
Process(clk,reset,set,s1)
Begin
Ifreset='0'thensec<="00000000";――对秒计时器清0
Elsifset='0'thensec<=s1;――对秒计时器置s1的数
Elsifclk'eventandclk='1'then
ifsec=59thensec<="00000000";ensec<='1';――重复计数并产生进位
elsesec<=sec+1;ensec<='0';以驱动下一级
endif;
endif;
Endprocess;
End;
5.2分模块程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entityminute1is
Port(clk,set,reset:
instd_logic;
m1:
instd_logic_vector(7downto0);――置数端(分)
min:
bufferstd_logic_vector(7downto0);――分输出端
Ensec:
outstd_logic);―分计时器的进位,用来驱动时计时器
End;
Architectureaofminute1is
Begin
Process(clk,reset,set,m1)
Begin
Ifreset='0'thensec<="00000000";――对分计时器清0
Elsifset='0'thensec<=m1;――对分计时器置m1的数
Elsifclk'eventandclk='1'then
ifsec=59thensec<="00000000";ensec<='1';――重复计数并产生进位
elsemin<=sec+1;ensec<='0';以驱动下一级
endif;
endif;
Endprocess;
End;
5.3时模块程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entityhour1is
Port(clkh,set,reset:
instd_logic;
h1:
instd_logic_vector(7downto0);――置数端(时)
hour:
bufferstd_logic_vector(7downto0);――时输出端
Enhour:
outstd_logic);――时计时器的进位,用来驱动星期计时器
End;
Architectureaofhour1is
Begin
Process(clkh,reset,set,h1)
Begin
Ifreset='0'thenhour<="00000000";――对时计时器清0
Elsifset='0'thenhour<=h1;――对时计时器置h1的数
Elsifclkh'eventandclkh='1'then
ifhour=23thenhour<="00000000";enhour<='1';――重复计数
elsehour<=hour+1;enhour<='0';并产生进位以驱动下一级
endif;
endif;
Endprocess;
End;
5.4星期模块程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entityday1is
Port(clkd,set,reset:
instd_logic;
d1:
instd_logic_vector(2downto0);――置数端(星期)
day:
bufferstd_logic_vector(2downto0));――星期输出端
end;
Architectureaofday1is
Begin
Process(clkd,reset,set,d1)
Begin
Ifreset='0'thenday<="000";――对星期计时器清0
Elsifset='0'thenday<=d1;――对星期计时器置d1的数
Elsifclkd'eventandclkd='1'then
Ifday=6thenday<="000";――重复计数
Elseday<=day+1;
Endif;
Endif;
Endprocess;
End;
5.5报时模块程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entityalarm1is
Port(reset:
instd_logic;
Min:
instd_logic_vector(7downto0);
Alarm:
outstd_logic);――输出的报时信号
End;
Architectureaofalarm1is
Begin
Alarm<='1'whenmin="00000000"andreset='1'else――当分为0且清0
'0';-----信号无效时,输出高电平并持续至分不为0
end;
5.6系统设计
将上述5个程序作为底层文件,存放在同一个文件夹中,然后按下面的图将这几个文件连接起来,并用元件例化语句编写顶层文件的程序,如下:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entitytopclockis
Port(clk,reset,set:
instd_logic;
S1,m1,h1:
instd_logic_vector(7downto0);
D1:
instd_logic_vector(2downto0);
Alarm:
outstd_logic;
Sec,min,hour:
bufferstd_logic_vector(7downto0);
Day:
outstd_logic_vector(2downto0));
End;
Architectureoneoftopclockis
Componentsecond1――秒元件的例化
Port(clk,reset,set:
instd_logic;
S1:
instd_logic_vector(7downto0);
Sec:
bufferstd_logic_vector(7downto0);
Ensec:
outstd_logic);
EndComponent;
Componentminute1――分元件的例化
Port(clkm,reset,set:
instd_logic;
m1:
instd_logic_vector(7downto0);
min:
bufferstd_logic_vector(7downto0);
Enmin:
outstd_logic);
EndComponent;
Componenthour1――时元件的例化
Port(clkh,reset,set:
instd_logic;
h1:
instd_logic_vector(7downto0);
hour:
bufferstd_logic_vector(7downto0);
Enhour:
outstd_logic);
EndComponent;
Componentday1――星期元件的例化
Port(clkd,reset,set:
instd_logic;
d1:
instd_logic_vector(2downto0);
day:
bufferstd_logic_vector(2downto0));
EndComponent;
Componentalarm1――报时元件的例化
Port(reset:
instd_logic;
min:
instd_logic_vector(7downto0);
alarm:
outstd_logic);
EndComponent;
signalenm,enh,enda:
std_logic;――秒分、分时、时星期之间的连接信号
signalena:
std_logic_vector(7downto0);――分与报时之间的连接信号
begin
u1:
second1portmap(reset=>reset,set=>set,s1=>s1,
sec=>sec,clk=>clk,ensec=>enm);
u2:
minute1portmap(reset=>reset,set=>set,m1=>m1,
min=>min,clkm=>enm,enmin=>enh);
u3:
hour1portmap(reset=>reset,set=>set,h1=>h1,
hour=>hour,clkh=>enh,enhour=>enda);
u4:
day1
portmap(reset=>reset,set=>set,d1=>d1,day=>day,clkd=>enda);
u5:
alarm1portmap(reset=>reset,min=>min,alarm=>alarm);
end;
6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 数字 时钟 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)