第二章VHDL程序结构2.1实体(ENTITY)∆2.2结构体(ARCHITECTURE)∆2.3块(BLOCK)2.4进程(PROCESS)2.5子程序(SUBPROGRAM)2.6库(LIBRARY)※2.7程序包(PACKAGE)※2.8配置(CONFIGURATION)VHDL设计事例----一个2选1多路选择器程序包实体结构体VHDL程序基本结构实体部分描述设计实体的外部接口信号(即输入/输出信号);结构体用于描述设计实体的内部电路。包集合存放各设计模块能共享的数据类型、常数、子程序等;库用于存放已编译的实体、结构体、包集合和配置。配置用于从库中选取所需元件安装到设计单元的实体中。实体和结构体是VHDL设计文件的两个基本组成部分。2.1实体(ENTITY)实体的一般格式为:ENTITY实体名IS[类属参数说明];[端口说明];END;实体中的每一个I/O信号被称为端口,其功能对应于电路图符号的一个引脚。端口说明则是对一个实体的一组端口的定义,即对基本设计实体与外部接口的描述。端口是设计实体和外部环境动态通信的通道。ayand2b实体名、端口名等均应为符合VHDL命名规则的标识符。ENTITY、IS、END是VHDL的关键字(保留字)。端口说明的一般格式为:PORT(端口名{,端口名}:端口模式数据类型;端口名{,端口名}:端口模式数据类型);PORT(a,b:INSTD_LOGIC;y:OUTSTD_LOGIC);端口模式端口数据类型端口说明端口模式IN:数据只能从端口流入实体OUT:数据只能从端口流出实体INOUT:数据从端口流入或流出实体BUFFER:数据从端口流出实体,同时可被内部反馈Entity用来说明数据传输通过该端口的方向。INOUTINOUTBUFFEROut与Buffer的区别•Entitytest1isport(a:instd_logic;b,c:outstd_logic);endtest1;architectureaoftest1isbeginb=not(a);c=b;enda;•Entitytest2isport(a:instd_logic;b:bufferstd_logic;c:outstd_logic);endtest2;architectureaoftest2isbeginb=not(a);c=b;enda;--Error类属参数说明Generic一种端口界面常数,用来规定端口的大小、实体中子元件的数目等•与常数不同,常数只能从内部赋值而类属参量可以由实体外部赋值•数据类型通常取Integer或Time•综合器仅支持数据类型为整数的类属值。类属参数说明是可选部分。如果需要,可使用以“GENERIC”语句来指定该设计单元的类属参数(如延时等)。类属参数说明的格式为:GENERIC(端口名{,端口名}:[IN]子类型[:=初始值]{;端口名{,端口名}:[IN]子类型[:=初始值]});ENTITYblack_boxISGeneric(constantwidth:integer:=7;);PORT(clk,rst:INstd_logic;d:INstd_logic_vector(widthDOWNTO0);q:OUTstd_logic_vector(widthDOWNTO0);co:OUTstd_logic);ENDblack_box;类属参量DD实体举例ENTITYblack_boxISGeneric(constantwidth:integer:=7;);PORT(clk,rst:INstd_logic;d:INstd_logic_vector(widthDOWNTO0);q:OUTstd_logic_vector(widthDOWNTO0);co:OUTstd_logic);ENDblack_box;黑盒rstd[7:0]clkq[7:0]co关键字类属参量端口定义端口模式端口数据类型实体结束例:四位加法器实体说明程序ENTITYadd4ISPORT(a,b:INSTD_LOGIC_VECTOR(3downto0);Ci:INSTD_LOGIC;Sum:OUTSTD_LOGIC_VECTOR(3downto0);Co:OUTSTD_LOGIC);ENDadd4;由实体说明画出四位加法器add4的电路图如下所示。add4a[3..0]b[3..0]Sum[3..0]CiCo2.2结构体(ARCHITECTURE)结构体的一般格式如下:ARCHITECTURE结构体名OF实体名IS[结构体说明部分];BEGIN[功能描述语句];END[ARCHITECTURE]结构体名;结构体说明是指对结构体需要使用的信号、常数、数据类型和函数进行定义和说明。用来描述实体的内部结构和逻辑功能功能描述语句具体地描述了结构体的行为。功能描述语句都是并发(同时)执行的-----与排列顺序无关。实体和结构体之间的关系Input1InputnOutput1Outputn实体ABCDSelMUX_Out2VHDL设计事例----一个2选1多路选择器程序包实体结构体结构体(ARCHITECTURE)说明语句功能描述语句块语句进程语句信号赋值语句子程序调用语句元件例化语句由一系列并行执行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个子模块定义顺序语句模块,用以将从外部获得的信号值,或内部的运算数据向其它的信号进行赋值。将设计实体内的处理结果向定义的信号或界面端口进行赋值用以调用过程或函数,并将获得的结果赋值于信号对其它的设计实体作元件调用说明,并将此元件的端口与其它的元件、信号或高层次实体的界面端口进行连接。结构体构造图2.3块(BLOCK)BLOCK语句的语法格式为:块标号:BLOCK[(块保护表达式)][说明语句];BEGIN[并行语句];ENDBLOCK标号名;保护表达式是可选项,它是一个布尔表达式。保护表达式的作用是:只有当其为真时,该块中的语句才被启动执行;否则,该块中的语句不被执行。BLOCK语句中所描述的各个语句是可以并行执行的,它和书写顺序无关。一个大规模的电原理图通常可以分割成多张子原理图,以便于设计和存档。同样,在VHDL程序设计中,结构体对应整个电原理图,而结构体可由多个BLOCK块组成,每一个BLOCK块则对应一张子原理图。电原理图的分割关系和VHDL程序中用BLOCK块分割结构体的关系是一一对应的。例:用BLOCK语句描述2选1电路的程序。ENTITYmux2_1ISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux2_1;ARCHITECTUREamuxOFmux2_1ISSIGNALtmp1,tmp2,tmp3:STD_LOGIC;BEGINcale:BLOCKBEGINtmp1=d0ANDsel;tmp2=d1AND(notsel);tmp3=tmp1ORtmp2;q=tmp3;ENDBLOCKcale;ENDamux;上述结构体中只有一个BLOCK块,若电路复杂时可由几个BLOCK块组成。2选1数据选择器d1d0qselu2u1u3tmp1tmp2tmp3实体的功能和结构。小结本节课我们学习了VHDL程序的基本结构及其主要模块实体结构体和结构体中的并行描述语句----块语句。要求大家重点掌握的内容有:VHDL程序的基本结构。结构体的能和结构。了解块语句的并行特点。练习:1、简述设计实体、实体和结构体之间的关系2、描述结构体的主要特点2.4进程(PROCESS)PROCESS语句是一种并发处理语句,在一个构造体中多个PROCESS语句可以同时并发运行。PROCESS语句是VHDL中描述硬件系统并发行为的最常用、最基本的语句。进程语句的一般格式为;[进程名:]PROCESS(敏感信号表)[进程说明语句]BEGIN顺序描述语句;ENDPROCESS[进程名];例:利用PROCESS语句设计与非门电路。nandx:PROCESS(a,b)BEGINy=aNANDb;ENDPROCESSnandx;敏感信号表所标明的信号是用来启动进程的。敏感信号表中的信号无论哪一个发生变化(如由’0’变’1’或由’1’变’0’)都将启动该PROCESS语句。一旦启动后,PROCESS中的语句将从上至下逐句执行一遍。当最后一个执行完毕以后,即返回到开始的PROCESS语句,等待下一次启动。因此,只要PROCESS中指定的信号变化一次,该PROCESS语句就会执行一遍。PROCESS1PROCESSnsignalsignalARCHITECTURE一个构造体可以有多个进程语句进程和进程之间的数据交换通过信号完成进程内部是顺序语句进程和进程之间是并行的2.5子程序(SUBPROGRAM)子程序可以在结构体或程序包的任何位置被调用,而且可以反复调用。VHDL的子程序有两种类型:过程(PROCEDURE)函数(FUNCTION)子程序的特点:过程(PROCEDURE)过程语句的结构:PROCEDURE过程名(参数1;参数2;…)IS[定义语句];BEGIN[顺序处理语句];END过程名;过程语句的调用格式:过程名(实际参数表);例:设计一个从两个整数中求取最大值的过程。PROCEDUREmax(a,b:ININTEGER;y:OUTINTEGER)ISBEGINIF(ab)THENy=b;ELSEy=a;ENDIF;ENDmax;函数(FUNCTION)函数语句的结构:FUNCTION函数名(输入参数表)RETUEN数据类型IS[定义语句];BEGIN[顺序处理语句];RETUEN[返回变量名];END[函数名];函数语句的调用格式:函数名(实际参数表);例:用FUNCTION语句描述求取最大值的函数。FUNCTIONmax(a:std_logic_vector;b:std_logic_vector)RETURNstd_logic_vectorISVARIABLEtmp:std_logic_vector(a'range);BEGINIF(ab)THENtmp:=a;ELSEtmp:=b;ENDIF;RETURNtmp;ENDmax;函数的参数均为输入参数。函数调用返回一个指定数据类型的值。ARCHITECTURErtlOFdpeakISSIGNALpeak:STD_LOGIC_VECTOR(5downto0);BEGINdout=peak;PROCESS(clk)BEGINIF(clk'eventandclk='1')THENIF(set='1')THENpeak=date;ELSEpeak=max(date,peak);ENDIF;ENDIF;ENDPROCESS;ENDrtl;2.6库(LIBRARY)库是经编译后的数据的集合。库是用来放置可编译的设计单元(它存放包定义、实体定义、构造定义和配置定义)的地方,通过其目录可查询和调用。VHDL中的库大致可归纳为5种:IEEE库、STD库、ASIC矢量库、WORK库和用户定义库。IEEE库:常用的资源库。IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的一些包集合,如STD_LOGIC_ARITH(算术运算包集合)等。STD库:VHDL的标准库。库中存放有称为“standard”的标准包集合,其中定义了多种常用的数据类型,均不加说明可直接引用。WORK库。WORK库是现行作业库。设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中。WORK库对所有设计都是隐含可见的,因此在使用该库时无需进行任何说明。ASIC矢量库。在VHDL语言中,为了进行门级仿真,各公司可提供面向ASIC的逻辑门库。在该库中存放着与逻辑门一一对应的实体。为了使用面向ASIC的库,对库进行说明是必要的。用户定义库。用户定义库简称用户库,是由用户自己创建并定义的库。设计者可以把自己经常使用