第2章VHDL语言程序的基本结构主要内容•VHDL语言设计的基本单元及其构成:实体+构造体•VHDL语言构造体的子结构描述:块、进程、子程序•包集合、库及配置一个完整的VHDL语言程序通常包含5个部分:实体(Entity)构造体Architecture)配置(Configuration)包集合(Package)库(Library)库、包集合实体(Entity)结构体(Architecture)进程、块、子程序配置Configuration)必备部分实体:描述所设计的系统的外部接口信号;构造体:描述系统内部的结构和行为;配置:用于从库中选取所需要单元来组成系统设计的不同版本;包集合:存放各种设计模块都能共享的数据类型、常数和子程序等;库:存放已经编译的实体、构造体、包集合和配置。前四种是可分别编译的源设计单元2.1VHDL语言设计的基本单元及其构成(实体+构造体)ENTITYmuxISGENERIC(m:TIME:=1ns);PORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp:BIT;BEGINcale:PROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:BIT;BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtemp2;tmp=tmp3;q=tmpAFTERm;ENDPROCESS;ENDconnect;注意:一个电路系统的程序设计中只有一个实体,可以有多个构造体。实体说明部分构造体定义部分2.1.1实体说明实体说明具有如下结构:ENTITY实体名IS[类属参数说明];[端口说明];END实体名;举例:ENTITYmuxISGENERIC(m:TIME:=1ns);PORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;d0d1selq类属参数说明是实体说明中的可选项,放在端口说明之前,用于指定参数;其一般书写格式为:GENERIC常数名:数据类型[:=设定值],…];举例:GENETRIC(m:TIME:=1ns);这个参数说明是指在VHDL程序中,构造体内的参数m的值为1ns。类属参数说明端口说明是对基本设计实体(单元)与外部接口的描述,也可以说是对外部引脚信号的名称,数据类型和输入、输出方向的描述;其一般书写格式为:PORT(端口名{,端口名}:方向数据类型名;端口名{,端口名}:方向数据类型名);举例:PORT(d0,d1,sel:INBIT;q:OUTBIT;bus:OUTBIT_VECTOR(7DOWNTO0));端口说明…(1)端口名:赋予每个外部引脚名称,通常用一个或几个英文字母,或者用英文字母加数字命名之,例如:d0,d1,sel。(2)端口方向:用来定义外部引脚的信号方向。方向定义含义IN输入OUT输出(构造体内部不能再使用)INOUT双向BUFFER输出(构造体内部可再使用)LINKAGE不指定方向,无论哪一个方向都可连接请注意OUT与BUFFER的区别(3)数据类型:VHDL有10种数据类型(下一章详细介绍)BIT和BIT_VECTORSTD_LOGIC和STD_LOGIC_VECTOR使用时需要加入以下两个语句:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;练习试写出半加器的实体描述:如右图所示a,b为半加器的输入端口,s,co为输出信号,s为和信号,co为进位信号。absco2.1.2构造体构造体(Architecture)具体指明了该设计实体的行为,定义了该设计实体的功能,规定了该设计实体的数据流程,指派了实体中内部元件的连接关系。构造体对其基本设计单元的输入输出关系有三种描述方式:(1)行为描述:对设计实体按算法的路径来描述。采用进程语句顺序描述设计实体的行为和功能。(2)寄存器传输描述(数据流描述):通过描述数据流程的运动路径、方向和运动结果,实现设计实体的行为和功能。(3)结构描述(逻辑元件连接描述):采用并行处理语句描述设计实体内的结构组织和元件互连关系。通常用于层次式设计。构造体的一般书写格式为:ARCHITECTURE构造体名OF实体名IS[定义语句]内部信号,常数,数据类型,函数等的定义;BEGIN[并行处理语句];END构造体名;构造体名称由设计者自由命名,是构造体的唯一名称。OF后面的实体名称表明该构造体属于哪个设计实体,有些设计实体中可能含有多个构造体。这些结构体的命名可以从不同侧面反映结构体的特色,让人一目了然。例如:ARCHITECTUREbehacvioralOFmuxIS用结构体行为命名ARCHITECTUREdataflowOFmuxIS用结构体数据流命名ARCHITECTUREstructuralOFmuxIS用结构体组织结构命名ARCHITECTUREboolOFmuxIS用结构体的数学表达方式命名ARCHITECTURElatchOFmuxIS用结构体的功能来命名构造体名称的命名定义语句位于ARCHITECTURE和BEGIN之间,用于对构造体内部所使用的信号、常数、数据类型和函数进行定义。举例:ARCHITECTUREbehavOFmuxISSIGNALtmp:BIT;BEGINENDbehav;构造体的信号定义和实体的端口说明一样,应有信号名称和数据类型定义,但不需要定义信号模式,不用说明信号方向,因为是结构体内部连接用信号。定义语句……具体描述构造体的行为及其连接关系。在构造体中的语句都是可以是并行执行的,语句的书写顺序不决定语句的执行顺序。所谓“并行”,指的是这些并行语句之间没有执行顺序的先后之分。并行处理语句构造体子结构描述的三种形式:块(BLOCK)语句结构;进程(PROCESS)语句结构;子程序(SUBPROGRAM)结构。2.2构造体的子结构描述2.2.1BLOCK语句结构描述块(BLOCK)可看作构造体中子模块,BLOCK可以把许多语句包装在一起。在VHDL语言中,电路的构造体对应整个电路图,而构造体可以由多个BLOCK块构成,每一个BLOCK块对应一张子原理图。BLOCK语句的一般格式如下:块结构名:BLOCKBEGIN并行语句A…ENDBLOCK块结构名;块结构举例:ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp1,tmp2,tmp3:BIT;BEGINCale:BLOCK--BLOCK语句无条件执行BEGINtmp1=d0ANDsel;--BLOCK语句中各个语句是--并行执行的tmp2=d1AND(NOTsel);tmp3=temp1ORtmp2;q=tmp3;ENDBLOCKcale;ENDconnect;卫式BLOCK(GuardedBLOCK):可实现BLOCK的执行控制,当满足一定条件时BLOCK语句才被执行。卫式BLOCK举例:ARCHITECTURElatch_guardOFlatchISBEGING1:BLOCK(clk=‘1’)BEGINq=GUARDEDdAFTER5ns;qb=GUARDEDNOT(d)AFTER7ns;ENDBLOCKg1;ENDlatch_guard;格式:BLOCK[卫式布尔表达式]当卫式尔表达式为真时,BLOCK语句被执行,否则不被执行。进程语句是并行处理语句,即各个进程是同时处理的,在一个结构体中多个Process语句是同时并发运行的。2.2.2PROCESS语句结构描述PROCESS语句的书写格式如下:[进程名:]PROCESS[敏感信号表]变量说明语句:BEGIN…顺序说明语句…ENDPROCESS[进程名];当进程的敏感信号参数表中的任一敏感信号发生变化时,进程被激活,开始从上而下按顺序执行进程中的顺序语句,当最后一条语句执行完毕,进程挂起,等待下一次敏感信号的变化。从系统上电开始,这个过程周而复始的进行。PROCESS语句的执行过程举例:ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISBEGINcale:PROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:BIT;BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtemp2;q=tmp3;ENDPROCESS;ENDconnect;敏感信号:只要有一个发生变化(如由“0”变成“1”或由“1”变为“0”)都将启动PROCESS语句。(1)进程内部的所有语句都是顺序执行的。(2)多进程之间,是并行执行的,并可访问构造体或实体中所定义的信号。(3)进程的启动是由进程标识符Process后的敏感信号来触发,也可用WAIT语句等待一个触发条件的成立。(4)各进程之间的通信是由信号来传递的。PROCESS语句的特点使用WAIT语句的PROCESS书写格式如下:[进程名:]PROCESS变量说明语句:BEGINWAITUNTIL(激活进程的条件)顺序说明语句ENDPROCESS[进程名];子程序是主程序调用它以后,能将处理结果返回给主程序的模块。子程序可以反复调用。调用时,首先要初始化,执行结束后,子程序就终止。子程序内部的值不能保持,子程序返回,才能被再次调用。子程序(subprogram)分两类:过程(PROCEDURE)和函数(FUNCTION)。2.2.3SUBPROGRAM语句结构描述过程语句的一般书写格式为:PROCEDURE过程名(参数1;参数2;…)IS[定义语句];--变量等定义BEGIN[顺序处理语句]--过程语句END过程名;举例:用过程实现:把位矢量转换为整数类型。PROCEDUREBitvector_to_integer(z:INSTD_LOGIC_VECTER;X_flag:OUTBoolean;q:INOUTINTEGER)ISBEGINq:=0;X_falg:=FALSE;FORiINZ'RANGELOOPq:=q*2;IF(Z(i)=1)THENq:=q+1;ELSEIF(Z(i)/=0)THENX_flag:=TRUE;ENDIF;ENDLOOP;ENDBitvector_to_integer;函数语句的一般书写格式为:FUNCTION函数名(参数1;参数2;…)RETURN数据类型名IS[定义语句];BEGIN[顺序处理语句]RETURN[返回变量名];END[函数名];举例:FUNCTIONvector_to_int(S:STD_LOGIC_VECTER(7downto0))RETURNINTEGERISBEGINVARIABLEresult:INTEGER:=0;FORiIN0TO7LOOPResult:=result*2;IFS(i)=1THENResult:=result+1;ENDIF;ENDLOOP;RETURNresult;ENDvector_to_int;子过程中的语句都是顺序执行的。过程能返回多个变量,函数只能返回一个变量。函数的参数都是输入参数。过程的参数有输入、输出和双向参数。函数有顺序函数、并行函数。过程有顺序过程、并行过程。顺序函数、顺序过程存在于进程之中。并行函数、并行过程在进程外部或在另一个子程序之外。过程在构造体或进程中以分散的形式存在。函数常在赋值语句或表达式中使用。库(library)是经编译后的数据的集合,它存放包集合定义、实体定义、构造体定义和配置定义。因此,库的好处就在于使设计者可以共享已经编译过的设计结果。在VHDL语言中可以存在多个不同的库,但是库和库之间是独立的,不能互相嵌套。2.3.1库2