第三章VHDL程序初步—程序结构教学目标:通过本章知识的学习,初步了解VHDL语言,做好语言学习的准备;掌握VHDL语言程序的结构和各部分的功能;了解结构体的三种描述方式;掌握D触发器的VHDL语言实现方法;了解不完整IF语句在VHDL语言设计中的重要作用。3.1初识VHDL程序【例3-1】二选一多路选择器ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy=a;ELSEy=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;absy3.1初识VHDL程序【例3-2】二输入与门-bit数据类型ENTITYexample_bitISPORT(a,b:INBIT;c:OUTBIT);END;ARCHITECTUREoneOFexample_bitISBEGINc=aANDb;END;ARCHITECTUREtwoOFexample_bitISBEGINPROCESS(a,b)BEGINIF(a='1'ANDb='1')THENc='1';ELSEc='0';ENDIF;ENDPROCESS;END;CONFIGURATIONexample_confOFexample_bitISFORoneENDFOR;END;abc&3.1初识VHDL程序【例3-3】二输入与门-std_logic数据类型LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexample_std_logicISPORT(a,b:INstd_logic;c:OUTstd_logic);END;ARCHITECTUREaOFexample_std_logicISBEGINc=aANDb;ENDa;abc&3.1初识VHDL程序1.从体系结构上看,VHDL程序应该包含(1)由ENTITY和ENDENTITY关键字构成的部分,定义关于输入输出的某种联系。(2)由ARCHITECTURE和ENDARCHITECTURE关键字构成的部分,通过语句实现一些逻辑运算。(3)CONFIGURATION语句出现在了有两个ARCHITECTURE的程序中,该语句从两个ARCHITECTURE(one和two)中选择了一个(one)来使用。(4)LIBRARY语句打开了和IEEE(电工电子协会)有关的内容,而USE语句使用了这个内容。(5)每个程序包含ENTITY和ARCHITECTURE语句。3.1初识VHDL程序2.从程序语句语法上看,VHDL程序应该包含(1)最熟悉的语句IF语句,分支结构语句,每个IF语句对应一个ENDIF。(2)由PROCESS和ENDPROCESS语句构成一个相对独立的小模块。(3)“=”符号是赋值语句,每一行语句结束有分号(英文格式)。(4)有逻辑运算符AND。(5)部分单词大写,部分单词小写。我们上面的总结是正确的吗?如果正确,能否从专业和定义的角度加以明确呢?下面的知识将帮助你解决关于VHDL程序结构的疑问,程序语句的问题将在后面章节详细解释。3.2VHDL体系结构3.2.1VHDL体系结构VHDL设计VHDL文件库(LIBRARY):用以存放预先完成的程序包和数据集合体程序包(PACKAGE):声明在设计或实体中将用到的常数、数据类型、元件及子程序实体(ENTITY):声明到其他实体或设计的接口,即定义本设计的输入输出端口结构体(ARCHITECTURE):定义实体的实现,即电路的具体描述配置(CONFIGURATION):为实体选择某个特定的结构体VHDL程序基本结构3.2VHDL体系结构3.2.2库、程序包1.库库中主要包括预先定义好的数据类型,子程序设计单元的集合体(程序包),或预先设计好的各种设计实体等,库的说明一般放在设计单元的最前面。库使用的语法格式如下:LIBRARY设计库名;USE设计库名.程序包名.ALL;--打开某一个库的某个程序包USE语句语法格式:格式1:USE库名.程序包名.项目名;--使用库中某个程序包中某个项目格式2:USE库名.程序包名.ALL;--使用库中某个程序包的所有项目VHDL中常见的库主要包括以下3类:IEEE库、WORK库和STD库。3.2VHDL体系结构3.2.2库、程序包2.程序包在设计实体中定义的数据类型,子程序或数据对象对于其它的设计实体是不同的,为了使以定以的常数,数据类型,元件调用说明以及子程序能被多个VHDL设计实体方便的访问和共享,可以将它们收集在一个VHDL程序包中。3.2VHDL体系结构3.2.3实体部分实体(ENTITY)就是设计对象(或设计项目),可代表任何电路,从一条连接线、一个门电路、一个芯片、一块电路板,到一个复杂系统都可看成一个实体。实体类似于原理图中的一个部件符号,它不描述设计的具体功能,而是用来描述设计所包含的输入/输出端口及其特征。实体中的每一个I/O信号被称为端口,其功能对应于电路图符号的一个引脚。端口说明则是对一个实体的一组端口的定义,即对基本设计实体与外部接口的描述。端口是设计实体和外部环境动态通信的通道。实体语句语法格式:ENTITY实体名IS[GENERIC(常数名:数据类型[:设定值])]--[]中的内容为可选项PORT(设计中的所有输入输出信号);END实体名;3.2VHDL体系结构3.2.3实体部分在例3-4的比较器中,实体部分描述如下:ENTITYdata_compareISGENERIC(x:integer:=4);PORT(a,b:INSTD_LOGIC_VECTOR(x-1DOWNTO0);ya,yb,yc:OUTSTD_LOGIC);ENDdata_compare;实体名:data_compare类属参数:x:integer:=4PORT语句和端口信号名:如a、b端口模式:IN、OUT端口数据类型:STD_LOGIC_VECTOR、STD_LOGIC3.2VHDL体系结构3.2.3实体部分端口模式定义端口的数据流动方向。1)ININ定义的通道为单向只读模式,规定数据只能通过此端口被读入实体中,即数据输入端口(引脚)。2)OUTOUT定义的通道为单向输出模式,规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值,即数据输出端口(引脚)。3)INOUTINOUT定义的通道确定为输入输出双向端口,即从端口的内部看,可以对此端口进行赋值,也可以通过此端口读入外部的数据信息;而从端口的外部看,信号既可以从此端口流出,也可以向此端口输入信号,如RAM的数据端口,单片机的I/O口。4)BUFFERBUFFER的功能与INOUT类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器的设计,可将计数器输出的计数信号回读,以作下一计数值的初值。与INOUT模式相比,BUFFER回读(输入)的信号不是由外部输入的,而是由内部产生,向外输出的信号。3.2VHDL体系结构3.2.3实体部分【例3-5】Out与Buffer的区别,b和c端口输出a取反后的值。程序1Entitytest_out_buffer_1ISPORT(a:INSTD_LOGIC;b,c:OUTSTD_LOGIC);ENDtest_out_buffer_1;ARCHITECTUREoneOFtest_out_buffer_1ISBEGINb=not(a);c=b;--此处错误,请读者思考为什么?ENDONE;3.2VHDL体系结构3.2.3实体部分程序2Entitytest_out_buffer_2ISPORT(a:INSTD_LOGIC;b:BUFFERSTD_LOGIC;c:OUTSTD_LOGIC);ENDtest_out_buffer_2;ARCHITECTUREtwoOFtest_out_buffer_2ISBEGINb=not(a);c=b;--此处正确ENDONE;3.2VHDL体系结构3.2.4结构体结构体(ARCHITECTURE)声明区(Declarations):声明该结构体将用到的信号、数据类型、常数、元件、子程序等并发语句块语句(BLOCK):一系列并发(并行)语句构成进程语句(PROCESS):进程内部为顺序语句。用于将从外部获得的信号值或内部的运算数据向其他的信号进行赋值信号赋值(SIGNALAssignment):计算结构,并赋值给信号子程序(过程(PROCEDURE)和函数(FUNCTION))调用:内部为顺序语句。用于调用过程和函数,并将得到的结果赋予信号元件例化(COMPONENTInstantiation):元件调用。用于调用另一个实体所描述的电路结构体结构3.2VHDL体系结构3.2.4结构体结构体的语法格式如下:ARCHITECTURE结构体名OF实体名IS[结构体说明语句]BEGIN功能描述语句ENDARCHITECTURE结构体名;3.2VHDL体系结构3.2.4结构体例3-4数据比较器的结构体如下:ARCHITECTUREbehaveOFdata_compareISBEGINPROCESS(a,b)BEGINIF(ab)THENya='1';yb='0';yc='0';ELSIF(ab)THENya='0';yb='1';yc='0';ELSEya='0';yb='0';yc='1';ENDIF;ENDPROCESS;ENDbehave;3.2VHDL体系结构3.2.4结构体1.结构体说明语句是指对结构体需要使用的信号、常数、数据类型和函数进行定义和说明。2.功能描述语句具体地描述了结构体的行为。这些语句都是并发(同时)执行的,与语句在程序中的位置顺序无关。3.VHDL语言语句结构VHDL语言结构体中用来描述逻辑功能和电路结构的语句分为顺序语句和并行语句两部分。顺序语句的执行方式类似于普通软件语言的程序执行方式,都是按照语句在程序中的位置逐条顺序执行的。而并行语句,无论有多少行语句,都是同时执行的,与语句在程序中的位置无关系。3.2VHDL体系结构3.2.5配置语句一个实体可用多个结构体描述,在具体综合时选择哪一个结构体来综合,则由配置(CONFIGURATION)来确定。可以理解为,在设计阶段,可以用多种结构体描述方式(每个结构体地位相同)描述一个实体,在综合时,配置可以把特定的结构体关联到一个确定的实体。配置语句的语法格式如下:CONFIGURATION配置名OF实体名IS配置说明END配置名;3.3结构体描述方式一个实体可以使用3种不同的方式:行为描述、结构描述、数据流的描述。Behavioral(行为描述):反映一个设计的功能或算法,行为描述在EDA工程中称为高级描述,也是VHDL语言的最大优点。一般使用进程process,用顺序语句表达,不考虑硬件实现的途径,直接建立输入与输出之间的关系。Dataflow(数据流描述):反映一个设计中数据从输入到输出的流向,使用并行语句描述。顺序语句不可以作数据流描述,同时数据流描述不能实现同步的功能Structural(结构描述):反映一个设计的硬件特征,表达了内部元件间的连接关系,使用元件例化语句(portmap语句)来描述,通过定义模块中信号的流动方向描述模块功能,也可以看作一种特殊的行为描述模式。下面将以8位数据比较器为例说明结构体描述的三种方式,在理解描述方式的同时,可以再次深入了解VHDL语言的程序结构。3.3结构体描述方式3.3.1行为描述方式【例3-7】行为描述的8位数据比较器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcomparator_behavioralISPORT(a,b:INSTD_LOGIC_VECTOR(7DOWNTO0);g:OUTSTD_LOGIC);END;ARCHIT