EDA课程设计报告---数字钟设计.docx_第1页
EDA课程设计报告---数字钟设计.docx_第2页
EDA课程设计报告---数字钟设计.docx_第3页
EDA课程设计报告---数字钟设计.docx_第4页
EDA课程设计报告---数字钟设计.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

2011-07-01学号:20082653电子0801eda课程设计报告数字钟设计 目录一、引言1二、相关知识简介11、eda简介12、vhdl简介2三、课程设计题目3四、课程设计要求:3五、课程设计思路4六、相关vhdl程序51、屏幕切换模块52、显示切换程序63、置数操作模块74、秒显示模块95、分显示模块96、小时显示模块107、日显示模块(已加入闰年判断功能)118、月显示模块129、年显示模块13七、实验心得13一、引言随着科学技术的迅猛发展,电子工业界经历了巨大的飞跃。集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。可编程逻辑器件和相应的设计技术体现在三个主要方面:一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的eda开发工具,它主要用来进行可编程逻辑器件应用的具体实现。在本实验中采用了集成度较高的fpga 可编程逻辑器件, 选用了vhdl硬件描述语言和max + p lus开发软件。vhdl硬件描述语言在电子设计自动化( eda)中扮演着重要的角色。由于采用了具有多层次描述系统硬件功能的能力的“自顶向下”( top - down)和基于库(l ibrary - based)的全新设计方法,它使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了产品的研制周期。max + p lus是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系。二、相关知识简介1、eda简介20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如cpld、fpga)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了eda技术的迅速发展。eda是电子设计自动化(electronic design automation)的缩写,在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.1 vhdl的特点应用vhdl进行系统设计,有以下几方面的特点。(一)功能强大 vhdl具有功能强大的语言结构。它可以用明确的代码描述复杂的控制逻辑设计。并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。vhdl是一种设计、仿真和综合的标准硬件描述语言。(二)可移植性 vhdl语言是一个标准语言,其设计描述可以为不同的eda工具支持。它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。此外,通过更换库再重新综合很容易移植为asic设计。(三)独立性 vhdl的硬件描述与具体的工艺技术和硬件结构无关。设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。程序设计的硬件目标器件有广阔的选择范围,可以是各系列的cpld、fpga及各种门阵列器件。(四)可操作性 由于vhdl具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。(五)灵活性 vhdl最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。使其在任何大系统的设计中,随时可对设计进行仿真模拟。所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。2.2 vhdl的设计结构 vhdl描述数字电路系统设计的行为、功能、输入和输出。它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。 vhdl将一个设计称为一个实体entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。所以,内部和外部的概念对系统设计的vhdl是十分重要的。 外部的实体名或连接由实体声明entity来描述。而内部的实体算法或实现则由结构体architecture来描述。结构体可以包含相连的多个进程process或者组建component等其他并行结构。需要说明的是,它们在硬件中都是并行运行的。2.3 vhdl的设计步骤采用vhdl的系统设计,一般有以下6个步骤。1)要求的功能模块划分;2)vhdl的设计描述(设计输入);3)代码仿真模拟(前仿真);4)计综合、优化和布局布线;5)布局布线后的仿真模拟(后仿真);6)设计的实现(下载到目标器件)。三、课程设计题目设计并实现具有一定功能的数字小系统(数字钟)四、课程设计要求:1、该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个功能:计时、重置时间、复位。2、对所有设计的小系统能够正确分析;3、基于vhdl语言描述系统的功能;4、在quartus 2环境中编译通过;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、屏幕切换模块运用状态机进行屏幕切换,分别显示年月日,以及时分秒library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity mux3 is port ( clk,reset,sel : in std_logic; int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12:in std_logic_vector(3 downto 0);- rst must a1,a2,a3,a4,a5,a6: out std_logic_vector(3 downto 0);end mux3;architecture behavioral of mux3 is type states is (st0, st1, st2, st3, st4, st5, st6, st7); signal stx: states ; begin com1 : process(stx,int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12) begin -决定转换状态的进程 case stx is when st0 = a1=int1;a2=int2;a3=int3;a4=int4;a5=int5;a6 a1=int7;a2=int8;a3=int9;a4=int10;a5=int11;a6 a1=int7;a2=int8;a3=int9;a4=int10;a5=int11;a6 a1=int7;a2=int8;a3=int9;a4=int10;a5=int11;a6 a1=int7;a2=int8;a3=int9;a4=int10;a5=int11;a6 a1=int1;a2=int2;a3=int3;a4=int4;a5=int5;a6 a1=int1;a2=int2;a3=int3;a4=int4;a5=int5;a6 a1=int1;a2=int2;a3=int3;a4=int4;a5=int5;a6 null; end case ; end process com1;reg: process (clk,reset,sel) -主控时序进程 begin if reset = 1 then stxstxstxstxstxstxstxstxstxresultresultresultresultresultresultresultresult=inb; end case; end process;reg2:process(clk,sel,reset)beginif(reset=1) then stxstxstxstxstxstxstxstxstxr1=ina;r2=0;r3=0;r4=0;r5=0;r6r1=ina;r2=0;r3=0;r4=0;r5=0;r6r1=0;r2=0;r3=0;r4=0;r5=0;r6r1=0;r2=0;r3=0;r4=0;r5=inb;r6r1=0;r2=0;r3=0;r4=inb;r5=0;r6r1=0;r2=0;r3=inb;r4=0;r5=0;r6r1=0;r2=inb;r3=0;r4=0;r5=0;r6r1=inb;r2=0;r3=0;r4=0;r5=0;r6=0;end case;end process;process(clk,sel,reset)beginif(reset=1) thenstxstxstxstxstxstxstxstxstx=st0;end case;end if;end if;end process;end behavioral;end behavioral;4、秒显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity secute1 is port ( clkm,set,reset : in std_logic; sec2,sec1 : inout std_logic_vector(3 downto 0); ensec : out std_logic);end secute1;architecture behavioral of secute1 isbeginprocess(clkm,reset,set) begin if reset=1 then sec2=0000;sec1=0000; elsif set=1 then sec2=0101;sec1=1000; elsif (clkmevent and clkm=1) then if sec2=0101 and sec1=1001 then sec2=0000;sec1=0000;ensec=1; elsif sec1=1001 then sec2=sec2+1;sec1=0000;ensec=0; else sec1=sec1+1;ensec=0; end if;end if;end process;end behavioral;5、分显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity minute1 is port ( clkm,set,reset : in std_logic; min2,min1 : inout std_logic_vector(3 downto 0); enmin : out std_logic);end minute1;architecture behavioral of minute1 isbeginprocess(clkm,reset,set) begin if reset=1 then min2=0000;min1=0000; elsif set=1 then min2=0101;min1=1000; elsif (clkmevent and clkm=1) then if min2=0101 and min1=1001 then min2=0000;min1=0000;enmin=1; elsif min1=1001 then min2=min2+1;min1=0000;enmin=0; else min1=min1+1;enmin=0; end if;end if;end process;end behavioral;6、小时显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity hour1 is port ( clkh,set,reset: in std_logic; hor2,hor1 : inout std_logic_vector(3 downto 0); enhour : out std_logic);end hour1;architecture behavioral of hour1 isbeginprocess(clkh,reset,set) begin if reset=1 then hor2=0000;hor1=0000; elsif set=1 then hor2=0010;hor1=0011; elsif (clkhevent and clkh=1) then if hor2=0010 and hor1=0011 then hor2=0000;hor1=0000;enhour=1; elsif hor1=1001 then hor2=hor2+1;hor1=0000;enhour=0; else hor1=hor1+1;enhour=0; end if; end if;end process;end behavioral;7、日显示模块(已加入闰年判断功能)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity date1 is port ( clkd,set : in std_logic; dat2,dat1 : inout std_logic_vector(3 downto 0); endate : out std_logic);end date1;architecture behavioral of date1 isbegin process(clkd,set) begin if set=1 then dat2=0010;dat1=1000; elsif (clkdevent and clkd=1)then if dat2=0011 and dat1=0000 then dat2=0000;dat1=0001;endate=1;elsif dat1=1001 then dat2=dat2+1;dat1=0000;endate=0; else dat1=dat1+1; endate=0; end if;end if;end process;end behavioral;8、月显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity month1 is port ( clkn,set: in std_logic; mon2,mon1 : inout std_logic_vector(3 downto 0); enmon : out std_logic);end month1;architecture behavioral of month1 isbegin process(clkn,set) begin if set=1 then mon2=0000;mon1=0110; elsif (clknevent and clkn=1) then if mon2=0001 and mon1=0010 then mon2=0000;mon1=0001;enmon=1; elsif mon1=1001 then mon2=mon2+1;mon1=0000;enmon=0; else mon1=mon1+1; enmon=0; end if;end if;end process;9、年显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations th

温馨提示

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

评论

0/150

提交评论