数字钟EDA课程设计报告.docx
《数字钟EDA课程设计报告.docx》由会员分享,可在线阅读,更多相关《数字钟EDA课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
数字钟EDA课程设计报告
郑文韬
2011-07-01
学号:
20082653
电子0801
EDA课程设计报告
数字钟设计
目录
一、引言1
二、相关知识简介1
1、EDA简介1
2、VHDL简介2
三、课程设计题目3
四、课程设计要求:
3
五、课程设计思路4
六、相关VHDL程序5
1、屏幕切换模块5
2、显示切换程序6
3、置数操作模块7
4、秒显示模块9
5、分显示模块9
6、小时显示模块10
7、日显示模块(已加入闰年判断功能)11
8、月显示模块12
9、年显示模块13
七、实验心得13
一、引言
随着科学技术的迅猛发展,电子工业界经历了巨大的飞跃。
集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。
基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。
可编程逻辑器件和相应的设计技术体现在三个主要方面:
一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的EDA开发工具,它主要用来进行可编程逻辑器件应用的具体实现。
在本实验中采用了集成度较高的FPGA可编程逻辑器件,选用了VHDL硬件描述语言和MAX+plusⅡ开发软件。
VHDL硬件描述语言在电子设计自动化(EDA)中扮演着重要的角色。
由于采用了具有多层次描述系统硬件功能的能力的“自顶向下”(Top-Down)和基于库(Library-Based)的全新设计方法,它使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了产品的研制周期。
MAX+plusⅡ是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系。
二、相关知识简介
1、EDA简介20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
2、VHDL简介硬件描述语言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系统设计的基本点。
2.1VHDL的特点应用VHDL进行系统设计,有以下几方面的特点。
(一)功能强大VHDL具有功能强大的语言结构。
它可以用明确的代码描述复杂的控制逻辑设计。
并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。
VHDL是一种设计、仿真和综合的标准硬件描述语言。
(二)可移植性VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。
它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。
此外,通过更换库再重新综合很容易移植为ASIC设计。
(三)独立性VHDL的硬件描述与具体的工艺技术和硬件结构无关。
设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。
(四)可操作性由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
(五)灵活性VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。
使其在任何大系统的设计中,随时可对设计进行仿真模拟。
所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。
2.2VHDL的设计结构VHDL描述数字电路系统设计的行为、功能、输入和输出。
它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VHDL将一个设计称为一个实体Entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。
当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。
所以,内部和外部的概念对系统设计的VHDL是十分重要的。
外部的实体名或连接由实体声明Entity来描述。
而内部的实体算法或实现则由结构体Architecture来描述。
结构体可以包含相连的多个进程process或者组建component等其他并行结构。
需要说明的是,它们在硬件中都是并行运行的。
2.3VHDL的设计步骤采用VHDL的系统设计,一般有以下6个步骤。
1)要求的功能模块划分;2)VHDL的设计描述(设计输入);3)代码仿真模拟(前仿真);4)计综合、优化和布局布线;5)布局布线后的仿真模拟(后仿真);6)设计的实现(下载到目标器件)。
三、课程设计题目
设计并实现具有一定功能的数字小系统(数字钟)
四、课程设计要求:
1、该数字钟可以实现3个功能:
计时功能、整点报时功能和重置时间功能,因此有3个功能:
计时、重置时间、复位。
2、对所有设计的小系统能够正确分析;
3、基于VHDL语言描述系统的功能;
4、在quartus2环境中编译通过;
5、仿真通过并得到正确的波形;
6、给出相应的设计报告。
五、课程设计思路
其中计时模块有4部分构成:
秒计时器(second)、分计时器(minute)、时计时器(hour)、日计时器(date)、月计时器(mouth)、年计时器(year)
1)秒计时器(second)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,秒计时器清0;set为置数信号,当set为0时,秒计时器置数,置s1的值。
clk为驱动秒计时器的时钟,sec为秒计时器的输出,ensec为秒计时器的进位信号,作为下一级的时钟输入信号。
2)分计时器(minute)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,分计时器清0;set为置数信号,当set为0时,分计时器置数,置m1的值。
clkm为驱动分计时器工作的时钟,与ensec相连接;min为分计时器的输出;enmin为分计时器的进位信号,作为下一级的时钟输入信号。
3)时计时器(hour)是由一个24进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,时计时器清0;set为置数信号,当set为0时,时计时器置数,置h1的值。
clkh为驱动时计时器工作的时钟,与enmin相连接;hour为时计时器的输出;enhour为时计时器的进位信号,作为下一级的时钟输入信号。
4)日计时器(date1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,星期计时器清0;set为置数信号,当set为0时,星期计时器置数,置d1的值。
clkd为驱动星期计时器工作的时钟,与enhour相连接;date为日计时器的输出,endate为分计时器的进位信号,作为下一级的时钟输入信号,由于月份的天数存在天数不同,闰年2月的天数为28天等情况,还设计了一个润年判别器,准确显示时间。
5)月计时器(mouth)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,星期计时器清0;set为置数信号,当set为0时,星期计时器置数,置mou1的值,clkmou为驱动星期计时器工作的时钟,与enday相连接;mou为日计时器的输出,enmou为分计时器的进位信号,作为下一级的时钟输入信号。
6)计时器(year)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,星期计时器清0;set为置数信号,当set为0时,星期计时器置数,置y1的值,clky为驱动星期计时器工作的时钟,与enmou相连接;year为日计时器的输出。
六、相关VHDL程序
1、屏幕切换模块
运用状态机进行屏幕切换,分别显示年月日,以及时分秒
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
--Uncommentthefollowinglinestousethedeclarationsthatare
--providedforinstantiatingXilinxprimitivecomponents.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitymux3is
Port(clk,Reset,sel:
instd_logic;
int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12:
INSTD_LOGIC_VECTOR(3DOWNTO0);--rstmust
a1,a2,a3,a4,a5,a6:
outstd_logic_vector(3downto0));
endmux3;
architectureBehavioralofmux3is
TYPEstatesIS(st0,st1,st2,st3,st4,st5,st6,st7);
SIGNALSTX:
states;
begin
COM1:
PROCESS(STX,int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12)
BEGIN--决定转换状态的进程
CASESTXIS
WHENst0=>a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6;
WHENst1=>a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12;
WHENst2=>a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12;
WHENst3=>a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12;
WHENst4=>a1<=int7;a2<=int8;a3<=int9;a4<=int10;a5<=int11;a6<=int12;
WHENst5=>a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6;
WHENst6=>a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6;
WHENst7=>a1<=int1;a2<=int2;a3<=int3;a4<=int4;a5<=int5;a6<=int6;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSCOM1;
REG:
PROCESS(clk,Reset,sel)--主控时序进程
BEGIN
IFReset='1'THENSTX<=st0;--异步复位
ELSIFclk='1'ANDclk'EVENTTHEN
ifsel='1'then
CASESTXIS
WHENst0=>STX<=st1;
WHENst1=>STX<=st2;
WHENst2=>STX<=st3;
WHENst3=>STX<=st4;
WHENst4=>STX<=st5;
WHENst5=>STX<=st6;
WHENst6=>STX<=st7;
WHENst7=>STX<=st0;
ENDCASE;
ENDIF;
ENDif;
ENDPROCESS;
2、显示切换程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
--Uncommentthefollowinglinestousethedeclarationsthatare
--providedforinstantiatingXilinxprimitivecomponents.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitymux1is
Port(clk,ina,inb,sel,Reset:
instd_logic;
result:
outstd_logic);
endmux1;
architectureBehavioralofmux1is
TYPEstateIS(st0,st1,st2,st3,st4,st5,st6,st7);
SIGNALSTX:
state;
begin
REG1:
PROCESS(ina,inb,STX)
BEGIN
CASESTXIS
WHENst0=>result<=ina;
WHENst1=>result<=ina;
WHENst2=>result<=inb;
WHENst3=>result<=inb;
WHENst4=>result<=inb;
WHENst5=>result<=inb;
WHENst6=>result<=inb;
WHENst7=>result<=inb;
ENDCASE;
ENDPROCESS;
REG2:
PROCESS(clk,sel,Reset)
BEGIN
IF(Reset='1')THEN
STX<=st0;
ELSIF(clk'EVENTANDclk='1')THEN
ifsel='1'then
CASESTXIS
WHENst0=>STX<=st1;
WHENst1=>STX<=st2;
WHENst2=>STX<=st3;
WHENst3=>STX<=st4;
WHENst4=>STX<=st5;
WHENst5=>STX<=st6;
WHENst6=>STX<=st7;
WHENst7=>STX<=st0;
ENDCASE;
ENDIF;
endif;
ENDPROCESSREG2;
endBehavioral;
3、置数操作模块
运用状态机,进行置数操作
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
--Uncommentthefollowinglinestousethedeclarationsthatare
--providedforinstantiatingXilinxprimitivecomponents.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitymuxis
Port(clk,ina,inb,sel,Reset:
instd_logic;
r1,r2,r3,r4,r5,r6:
outstd_logic);
endmux;
architectureBehavioralofmuxis
TYPEstateIS(st0,st1,st2,st3,st4,st5,st6,st7);
SIGNALSTX:
state;
begin
PROCESS(ina,inb,STX)
BEGIN
CASESTXIS
WHENst0=>r1<=ina;r2<='0';r3<='0';r4<='0';r5<='0';r6<='0';
WHENst1=>r1<=ina;r2<='0';r3<='0';r4<='0';r5<='0';r6<='0';
WHENst2=>r1<='0';r2<='0';r3<='0';r4<='0';r5<='0';r6<=inb;
WHENst3=>r1<='0';r2<='0';r3<='0';r4<='0';r5<=inb;r6<='0';
WHENst4=>r1<='0';r2<='0';r3<='0';r4<=inb;r5<='0';r6<='0';
WHENst5=>r1<='0';r2<='0';r3<=inb;r4<='0';r5<='0';r6<='0';
WHENst6=>r1<='0';r2<=inb;r3<='0';r4<='0';r5<='0';r6<='0';
WHENst7=>r1<=inb;r2<='0';r3<='0';r4<='0';r5<='0';r6<='0';
ENDCASE;
ENDPROCESS;
PROCESS(clk,sel,Reset)
BEGIN
IF(Reset='1')THEN
STX<=st0;
ELSIF(clk'EVENTANDclk='1')THEN
ifsel='1'then
CASESTXIS
WHENst0=>STX<=st1;
WHENst1=>STX<=st2;
WHENst2=>STX<=st3;
WHENst3=>STX<=st4;
WHENst4=>STX<=st5;
WHENst5=>STX<=st6;
WHENst6=>STX<=st7;
WHENst7=>STX<=st0;
ENDCASE;
ENDIF;
endif;
ENDPROCESS;
endBehavioral;
endBehavioral;
4、秒显示模块
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
--Uncommentthefollowinglinestousethedeclarationsthatare
--providedforinstantiatingXilinxprimitivecomponents.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitysecute1is
Port(clkm,set,reset:
instd_logic;
sec2,sec1:
inoutstd_logic_vector(3downto0);
ensec:
outstd_logic);
endsecute1;
architectureBehavioralofsecute1is
begin
Process(clkm,reset,set)
Begin
Ifreset='1'thensec2<="0000";sec1<="0000";
Elsifset='1'thensec2<="0101";sec1<="1000";
Elsif(clkm'eventandclkm='1')then
ifsec2="0101"ANDsec1="1001"thensec2<="0000";sec1<="0000"