第三章VHDL语言程序的基本结构一个VHDL语言程序的基本结构一个完整的VHDL语言程序通常包含实体(Entity)构造体(Architecture)配置(Configuration)包集合(Package)库(Library)描述所设计的系统的外部接口信号;描述系统内部的结构和行为;用于从库中选取不同的构造体来组成系统设计的不同版本;存放各设计模块都能共享的数据类型、常数和子程序等;存放已经编译的实体、构造体、包集合和配置。3.1VHDL语言设计的基本单元及其构成所谓VHDL语言设计的基本单元(DesignEntity),就是VHDL语言的一个基本设计实体。一个基本设计单元,简单的可以是一个与门,复杂点的可以是一个微处理器或一个系统。但是,不管是简单的数字电路,还是复杂的数字电路,其基本构成是一致的。它们都由实体说明和构造体两部分构成。设计的基本单元实体说明构造体设计的基本单元举例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:=tmp1ORtmp2;tmp=tmp3;q=tmpAFTERm;ENDPROCESS;ENDconnect;下面的程序是二选一电路的VHDL描述,我们可以把它看成是一个设计的基本单元。实体说明构造体实体说明是二选一器件外部引脚的定义构造体描述了二选一器件的逻辑电路和逻辑关系3.1.1实体说明任何一个基本设计单元的实体说明都具有如下的结构:ENTITY实体名IS[类属参数说明];[端口说明];END实体名;一个基本设计单元的实体说明以“ENTITTY实体名IS”开始至“END实体名”结束。这里大写字母表示实体说明的框架,即每个实体说明都应该这样书写,是不可缺少和省略的部分。小写字母是设计者添写的部分,随设计单元不同而不同。实际上,对VHDL而言,大写或小写都一视同仁,不加区分。这里仅仅是为了阅读方便而加以区分的。1、类属参数说明类属参数说明必须放在端口说明之前,用于指定参数。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:=tmp1ORtmp2;tmp=tmp3;q=tmpAFTERm;ENDPROCESS;ENDconnect;该语句指定了构造体内m的值为1ns。在本例中,GENERIC利用类属参数为tmp建立一个延迟值。2、端口说明端口说明是对基本设计实体(单元)与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入、输出方向的描述。其一般书写格式如下:PORT(端口名{,端口名}:方向数据类型名;端口名{,端口名}:方向数据类型名);(1)端口名端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名之。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:=tmp1ORtmp2;tmp=tmp3;q=tmpAFTERm;ENDPROCESS;ENDconnect;此例中的外部引脚为d0,d1,sel,q。(2)端口方向端口方向用来定义外部引脚的信号方向是输入还是输出。凡是用“IN”进行方向说明的端口,其信号自端口输入到构造体,而构造体内部的信号不能从该端口输出。相反,凡是用“OUT”进行方向说明的端口,其信号将从构造体内经端口输出,而不能通过该端口向构造体输入信号。另外,“INOUT”用以说明该端口是双向的,可以输入也可以输出;“BUFFER”用以说明该端口可以输出信号,且在构造体内部也可以利用该输出信号。“LINKAGE”用以说明该端口无指定方向,可以与任何方向的信号相连接。(2)端口方向(续)方向定义含义IN输入OUT输出(构造体内部不能再使用)INOUT双向BUFFER输出(构造体内部可再使用)LINKAGE不指定方向,无论哪一个方向都可连接端口方向说明注:OUT允许对应多个信号,而BUFFER只允许对应一个信号。OUT与BUFFER在定义输出端口时的区别在(a)中,锁存器的输出端口被说明为“OUT”,而在(b)中,锁存器的输出被说明为“BUFFER”。从图中可以看到,如果构造体内部要使用该信号,那么锁存器的输出端必须说明为“BUFFER”,而不能用“OUT”说明。(b)说明了,当一个构造体用“BUFFER”说明输出端口时,与其连接的另一个构造体的端口也要用“BUFFER”说明。对于“OUT”则没有这样的要求。(3)数据类型在VHDL语言中有10种数据类型,但是在逻辑电路设计中只用到两种:BIT和BIT_VECTOR。当端口被说明为BIT数据类型时,该端口的信号取值只可能是“1”或“0”。注意,这里的“1”和“0”是指逻辑值。所以BIT数据类型是位逻辑数据类型,其取值只能是两个逻辑值(“1”和“0”)中的一个。当端口被说明为BIT_VECTOR数据类型时,该端口的取值可能是一组二进制位的值。例如,某一数据总线输出端口,具有8位的总线宽度。那么这样的总线端口的数据类型可以被说明成BIT_VECTOR。总线端口上的值由8位二进制位的值所确定。(4)端口说明举例1PORT(d0,d1,sel:INBIT;q:OUTBIT;bus:OUTBIT_VECTOR(7DOWNTO0));该例中d0,d1,sel,q都是BIT数据类型,而bus是BIT_VECTOR类型,(7DOWNTO0)表示该bus端口是一个8位端口,由B7~B08位构成。位矢量长度为8位。(5)端口说明举例2LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC;bus:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDmu;在某些VHDL语言的程序中,数据类型的说明符号有所不同。该例中BIT类型用STD_LOGIC说明,而bus则用STD_LOGIC_VECTOR(7DOWNTO0)说明。在VHDL语言中存在一个库,该库有一个包集合,专门对数据类型作了说明,其作用像C语言中的include文件一样。这样做主要为了标准和统一。但是,在用STD_LOGIC和STD_LOGIC_VECTOR说明时,在实体说明以前必须增加例中所示的两个语句,以便在对VHDL语言程序编译时,从指定库的包集合中寻找数据类型的定义。3.1.2构造体构造体是一个基本设计单元的实体,它具体地指明了该基本设计单元的行为、元件及内部的连接关系,也就是说它定义了设计单元具体的功能。构造体对其基本设计单元的输入输出关系可以用3种方式进行描述,即行为描述(基本设计单元的数学模型描述)、寄存器传输描述(数据流描述)和结构描述(逻辑元件连接描述)。不同的描述方式,只体现在描述语句上,而构造体的结构是完全一样的。由于构造体是对实体功能的具体描述,因此它一定要跟在实体的后面。通常,先编译实体之后才能对构造体进行编译。如果实体需要重新编译,那么相应构造体也应重新进行编译。构造体的具体结构ARCHITECTURE构造体名OF实体名IS[定义语句]内部信号,常数,数据类型,函数等的定义;BEGIN[并行处理语句];END构造体名;一个构造体从“ARCHITECTURE构造体名OF实体名IS”开始,至“END构造体名”结束。下面对构造体的有关内容和书写方法作一说明。1、构造体名称的命名构造体的名称是对本构造体的命名,它是该构造体的唯一名称。OF后面紧跟的实体名表明了该构造体所对应的是哪一个实体。用IS来结束构造体的命名。构造体的名称可以由设计者自由命名。但是在大多数的文献和资料中,通常把构造体的名称命名为behavioral(行为),dataflow(数据流)或者structural(结构)。如前所述,这3个名称实际上是3种构造体描述方式的名称。当设计者用某一种描述方式来描述构造体时,该构造体的名称就命名为那一个名称。这样,使得阅读VHDL语言程序的人能直接了解设计者所采用的描述方式。例如,使用结构描述方式来描述二选一电路,那么二选一电路的构造体就可以这样命名:ARCHITECTUREstructuralOFmuxIS2、定义语句定义语句位于ARCHITECTURE和BEGIN之间,用于对构造体内部所使用的信号、常数、数据类型和函数等进行定义。例如:ARCHITECTUREbehavOFmuxISSIGNALnes1:BIT;BEGINENDbehav;信号定义和端口说明的语句一样,应有信号名和数据类型的说明。因它是内部连接用的信号,故没有也不需要有方向说明。3、并行处理语句并行处理语句处于语句BEGIN和END之间,这些语句具体地描述了构造体的行为及其连接关系。例如,二选一的数据流方式描述可以写为:ENTITYmuxISPORT(d0,d1:INBIT;sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREdataflowOFmuxISSIGNALs1,s2:BIT;BEGINs1=d0ANDsel;s2=(NOTselANDd1;q=s1ORs2;ENDdataflow;并行语句在构造体中的语句都是可以并行执行的,也就是说,语句的执行不以书写的语句顺序为执行顺序。3.2构造体的子结构描述在规模较大的电路设计中,全部电路都用唯一的一个模块来描述是非常不方便的。为此,电路设计者总希望将整个电路分成若干个相对比较独立的模块来进行电路的描述。这样,一个构造体可以用几个子结构,即相对比较独立的几个模块来构成。VHDL语言可以有以下3种形式的子结构描述语句:*BLOCK语句结构*PROCESS语句结构*SUBPROGRAMS结构3.2.1BLOCK语句的结构采用BLOCK语句描述局部电路的书写格式如下所示:块结构名:BLOCKBEGINENDBLOCK块结构名;1、BLOCK语句的结构举例采用BLOCK语句来描述二选一电路如下:ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp1,tmp2,tmp3:BIT;BEGINcale:BLOCKBEGINtmp1=d0ANDsel;tmp2=d1AND(NOTsel);tmp3=tmp1ORtmp2;q=tmp3;ENDBLOCKcale;ENDconnect;该程序的构造体中只有一个BLOCK块,如果电路较复杂时就可以由几个BLOCK块组成。2、BLOCK块和子原理图的关系人们在用计算机电路辅助设计工具输入电原理图时,往往将一个大规模的电原理图分割成多张子原理图,进行输入和存档。同样在VHDL语言中也不例外,电路的构造体对应整个电原理图,而构造体可以由多个BLOCK块构成,每一个BLOCK块对应一张子原