VHDL编程基础汽车防盗器http是超高速集成电路硬件描述语言(VeryHighSpeedIntegratedCircuitHardwareDescriptionlanguage)。是标准化程度最高的硬件描述语言。目前流行的EDA工具软件全部支持VHDL,VHDL是现代电子设计师必须掌握的硬件设计计算机语言。(1)逻辑描述层次:一般的硬件描述语言可以在三个层次上进行电路描述,层次由高到低依次可分为行为级、RTL级(寄存器转换级)和门电路级。VHDL语言是一种高级描述语言,适用于行为级和RTL级的描述,最适于描述电路的行为;(2)设计要求:VHDL进行电子系统设计时可以不了解电路的结构细节,设计者所做的工作较少;Verilog和ABEL语言进行电子系统设计时需了解电路的结构细节,设计者需做大量的工作。3.1.3VHDL程序设计约定为了便于程序的阅读和调试,对VHDL程序设计特作如下约定:(1)语句结构描述中方括号“[]”内的内容为可选内容。(2)对于VHDL的编译器和综合器来说,程序文字的大小写是不加区分的。(3)程序中的注释使用双横线“--”。在VHDL程序的任何一行中,双横线“--”后的文字都不参加编译和综合。(4)为了便于程序的阅读与调试,书写和输入程序时,使用层次缩进格式,同一层次的对齐,低层次的较高层次的缩进两个字符。(5)考虑到MAX+plusII要求源程序文件的名字与实体名必须一致,因此为了使同一个VHDL源程序文件能适应各个EDA开发软件上的使用要求,建议各个源程序文件的命名均与其实体名一致。•3.2VHDL设计实体的基本结构•通过VHDL描述一个二输入或门的实例,来说明VHDL的基本结构。•例1一个二输入或门的VHDL程序如下:•LIBRARYIEEE;--IEEE库的使用说明•USEIEEE.STD_LOGIC_1164.ALL;--实体描述器件的输入、输出端口和数据类型用的程序包•ENTITYOR2IS--实体OR2的说明•PORT(A,B:STD_LOGIC;---端口声明,A、B是标准逻辑位类型的输入端口•C:OUTSTD_LOGIC);--声明C是标准逻辑位类型的输出端口•ENDENTITYOR2;•ARCHITECTUREONEOFOR2IS--实体OR2的结构体ONE的说明•BEGIN•C=AORB;--二输入或门逻辑功能描述•ENDARCHITECTUREONE;•或门程序包含了VHDL的库、程序包、实体说明和结构体几个主要部分。语句C=AORB为或门电路的逻辑描述,其他都作为或门对外部端口的描述,设计实体定义了或门外部界面后,其他的设计就可以直接调用这个或门实体。3.2.1VHDL程序设计举例1.设计思路以全加器为例例2全加器可以由两个1位的半加器构成。1位半加器的端口信号A和B分别是2位相加的二进制输入信号,SO是相加和的输出信号,CO是进位输出信号,左边的门电路结构构成了右边的半加器H_ADDER。图中,全加器F_ADDER内部的功能结构是由3个逻辑器件构成的,即由两个半加器U1、U2和一个或门U3连接而成。1位全加器逻辑原理图2.VHDL源程序1)或门的逻辑描述LIBRARYIEEE;--IEEE库的使用说明USEIEEE.STD_LOGIC_1164.ALL;--实体描述器件的输入、输出端口和数据类型用的程序包ENTITYor2IS--实体or2的说明PORT(a,b:INSTD_LOGIC;--端口声明,a、b是标准逻辑位类型的输入端口c:OUTSTD_LOGIC);--声明c是标准逻辑位类型的输出端口ENDENTITYor2;ARCHITECTUREart1OFor2IS--实体or2的结构体art1的说明BEGINc=aORb;ENDARCHITECTUREart1;2)半加器的逻辑描述LIBRARYIEEE;--IEEE库的使用说明USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderIS--实体h_adder的说明PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREart2OFh_adderIS--实体h_adder的结构体art2的说明BEGINso=(aORb)AND(aNANDb);co=NOT(aNANDb);ENDARCHITECTUREart2;3)全加器的逻辑描述LIBRARYIEEE;--IEEE库的使用说明USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderIS--实体f_adder的说明PORT(ain,bin,cin:INSTD_LOGIC;--端口声明,方向、数据类型名cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREart3OFf_adderIS--实体F_ADDER的结构体ART3的说明COMPONENTh_adder--元件调用声明,将h_adder作为元件连接到指定端口PORT(a,b:INSTD_LOGIC;--端口声明co,so:OUTSTD_LOGIC);ENDCOMPONENTh_adder;COMPONENTor2PORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDCOMPONENTor2;SIGNALd,e,f:STD_LOGIC;--定义中间信号转存点BEGIN--元件连接说明U1:h_adderPORTMAP(a=ain,b=bin,co=d,so=e);--名称映射法U2:h_adderPORTMAP(a=e,b=cin,co=f,so=sum);--名字关联方式U3:or2PORTMAP(a=d,b=f,c=cout);ENDARCHITECTUREart3;3.说明及分析(1)整个设计包括三个设计实体,分别为or2、h_adder和f_adder,其中实体f_adder为顶层实体。三个设计实体均包括三个组成部分:库、程序包使用说明,实体说明和结构体说明。这三个设计实体既可以作为一个整体进行编译、综合与存档,也可以各自进行独立编译、独立综合与存档,或被其他的电路系统所调用。(2)实体or2定义了或门or2的引脚信号a、b(输入)和c(输出),结构体art1描述了输入与输出信号间的逻辑关系,将输入信号a、b相或后传给输出信号端c,由此实体和结构体描述一个完整的或门元件。(3)实体h_adder及对应的结构体art2描述了一个半加器。是由一个与非门、一个非门、一个或门和一个与门连接而成的,其逻辑关系来自于半加器真值表。在VHDL中,逻辑算符NAND、NOT、OR和AND分别代表“与非”、“非”、“或”和“与”4种逻辑运算关系。(4)在全加器接口逻辑VHDL描述中,1位二进制全加器f_adder的原理图,实体f_adder定义了引脚的端口信号属性和数据类型。其中,ain和bin分别为两个输入的相加位,cin为低位进位输入,cout为进位输出,sum为1位和输出。其对应的结构体art3的功能是利用COMPONENT声明语句和COMPONENT例化语句将上面由两个实体or2和h_adder描述的独立器件,按照图3.2全加器内部逻辑原理图中的接线方式连接起来。(5)在结构体art3中,COMPONENT→ENDCOMPONENT语句结构对所要调用的或门和半加器两元件作了声明(COMPONENTDECLARATION),并由SIGNAL语句定义了三个信号d、e和f,作为中间信号转存点,以利于几个器件间的信号连接。“PORTMAP()”语句称为元件例化语句(COMPONENTINSTANTIATION)。所谓例化,在电路板上,相当于往上装配元器件;在逻辑原理图上,相当于从元件库中取了一个元件符号放在电路原理图上,并对此符号的各引脚进行连线。例化也可理解为元件映射或元件连接,MAP是映射的意思。例如,语句“U2:h_adderPORTMAP(a=e,b=cin,co=f,so=sum)”表示将实体h_adder描述的元件U2的引脚信号a、b、co和so分别连向外部信号e、cin、f和sum。符号“=”表示信号连接。(6)实体f_adder引导的逻辑描述也是由三个主要部分构成的,即库、实体和结构体。从表面上看来,库的部分仅包含一个IEEE标准库和打开的IEEE.STD_LOGIC_1164.ALL程序包。但实际上,从结构体的描述中可以看出,其对外部的逻辑有调用的操作,这类似于对库或程序包中的内容作了调用。因此,库结构部分还应将上面的或门和半加器的VHDL描述包括进去,作为工作库中的两个待调用的元件。由此可见,库结构也是VHDL程序的重要组成部分。3.2.2VHDL程序的基本结构完整的VHDL程序(设计实体)具有固定的结构。应包括三个基本组成部分:库、程序包使用说明,实体说明和实体对应的结构体说明。库、程序包使用说明用于打开本设计实体将要用到的库、程序包;实体说明用于描述该设计实体与外界的接口信号说明,是可视部分;结构体说明用于描述该设计实体内部工作的逻辑关系。在一个实体中,可以含有一个或一个以上的结构体,而在每一个结构体中又可以含有一个或多个进程以及其他的语句。实体还可以有配置说明语句。配置说明语句主要用于以层次化的方式对特定的设计实体进行元件例化,或是为实体选定某个特定的结构体。VHDL程序设计基本结构库、程序包使用说明配置(CONFIGURATION)结构体(ARCHITECTURE)实体(ENTITY)PORT端口说明结构体说明GENERIC类属说明体实计设结构体功能描述3.2.2VHDL程序的基本结构库、程序包根据VHDL语法规则,在VHDL程序中使用的文字、数据对象、数据类型都需要预先定义。为了方便用VHDL编程,IEEE将预定义的数据类型、元件调用声明(Declaration)及一些常用子程序收集在一起,形成程序包,供VHDL设计实体共享和调用。若干个程序包则形成库,常用的库是IEEE标准库。因此,在每个设计实体开始都有打开库或程序包的语句。例如LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;表示设计实体中被描述器件的输入、输出端口和数据类型将要用到IEEE标准库中的STD_LOGIC_1164程序包。3.2.3实体(ENTITY)实体(ENTITY)是设计实体中的重要组成部分,是一个完整的、独立的语言模块。它相当于电路中的一个器件或电路原理图上的一个元件符号。实体由实体声明和结构体组成。实体声明部分指定了设计单元的输入输出端口或引脚,是设计实体经封装后对外的一个通信界面,是外界可以看到的部分。结构体用来描述设计实体的逻辑结构和逻辑功能。由VHDL语句构成,是外界看不到的部分。一个实体可以拥有一个或多个结构体。1.实体语句结构实体声明部分的常用语句结构如下:ENTITY实体名IS[GENERIC(类属表);][PORT(端口表);]ENDENTITY实体名;实体声明单元必须以语句“ENTITY实体名IS”开始,以语句“ENDENTITY实体名;”结束,实体名是设计者自己给设计实体的命名,可作为其他设计实体对该设计实体进行调用时用。中间在方括号内的语句描述,在特定的情况下并非是必须的。2.类属(GENERIC)说明语句类属(GENERIC)参数声明必须放在端口声明之前,用于指定如矢量位数、器件延迟时间等参数。类属声明的一般书写格式如下:GENERIC([常数名;数据类型[:设定值]{;常数名:数据类型[:设定值]});例:GENERIC(m:TIME=1.0ns);--m是一个值为1.0ns的时