《VHDL语言程序的基本结构课件》由会员分享,可在线阅读,更多相关《VHDL语言程序的基本结构课件(86页珍藏版)》请在金锄头文库上搜索。
1、VHDL硬件描述语言 第二章第二章VHDL语言程序的基本结构语言程序的基本结构 第三章第三章VHDL语言的数据类型及运算操作符语言的数据类型及运算操作符 第四章第四章VHDL语言构造体的描述方式语言构造体的描述方式第五章第五章VHDL语言的主要描述语句语言的主要描述语句 第七章第七章基本逻辑电路设计基本逻辑电路设计 VHDL语言描述数字系统的基本方法语言描述数字系统的基本方法在电原理图中,如果要描述一个“与门”,那么在图上画出一个“与门”的逻辑符号就行了,如图1所示。图1“与门”的逻辑符号描述人们看到了这个逻辑符号(如图1所示),就会联想到两件事:(1)确定该逻辑有两个输入信号a和b,有一个输
2、出信号c,而且都是位信号(每个信号占二进制位1位)。(2)根据逻辑符号形状判断,它是一个“与门”,在电路中实现“与”操作,即c=ab。知道了这两点,该电路的功能就一目了然了。由此我们可推论,要完整地描述一个系统或电路,就必须对输入和输出输入和输出以及电路的功能电路的功能这两部分作详细说明,从大规模的CPU到最简单的逻辑门都适用这一法则。从这个认识出发,用VHDL语言描述电路,就是要用相应的语句将电路的输入和输出及电路的功能描述清楚,那么其结果是完全和电原理图描述等效的。在用VHDL语言描述一个“与门”时,其语言描述与电原理图描述的对应关系如图2所示。图2VHDL语言描述与电原理图描述的对应关系
3、第二章:第二章:VHDL语言程序的基本结构语言程序的基本结构 2.1 VHDL语言的基本设计单元构成语言的基本设计单元构成VHDL语 言 程 序 的 完 整 设 计 单 元 应 由 5部 分 构 成 : 库库(Library)说明、包包集集合合(Package)说明、实实体体(Entity)描述、构造体构造体(Architecture)描述和配置配置(Configuration)描述。 1最基本的设计单元构成最基本的设计单元构成一个最基本的设计单元由实体实体和构造体构造体两部分组成,如例2-1所示。【例【例2-1】ENTITYmux2ISPROT(d0,d1,sel:INBIT;q:OUTBI
4、T);ENDmux2;ARCHITECTURErtlOFmux2ISBEGIN;PROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:BIT;BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2;q=tmp3;ENDPROCESS;ENDrtl;例2-1是一个最基本的设计单元,只有实体和构造体就行了。如前所述,它描述的是一个二选一选择器电路。利用EDA工具可以对它进行编译、综合生成TTL的器件。该设计单元仅由实体和构造体这两个描述部分组成。这是有条件的:有条件的:第一,在实体和构造体中所使用的数据类型一定是
5、在STD库中定义的,如BIT类型。STD库已自动挂接在VHDL语言的编译器中,因而无需在设计单元描述中进行独立的库声明。第二,设计单元的实体只与一个构造体对应。如前所述,一个实体可以对应多个构造体。在编译时一个实体只能选择某一个构造体进行设计单元编译,这种选择应由配置语句描述。2一个完整的设计单元构成一个完整的设计单元构成一个完整的设计单元构成的实例如例2-2所示。【例【例2-2】LIBRARYIEEE;-库说明库说明USEIEEE.STD_LOGIC_1164.ALL;-包集合说明包集合说明ENTITYmux2IS-实体说明实体说明PORT(d0,d1,sel:INSTD_LOGIC;q:O
6、UTSTD_LOGIC);ENDmux2;ARCHITECTURErtl1OFmux2IS-构造体说明构造体说明BEGINPROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:STD_LOGIC;BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2;ENDPROCESS;ENDrtl1;ARCHITECTURErtl2OFmux2IS-构造体说明构造体说明ENDrtl2;CONFIGURATIONrtl_mux2OFmux2IS-配置说明配置说明FORrtl1ENDFOR;ENDrtl_mux2;例2-2中
7、的第一行是对设计单元所使用的库库进行的描述和说明,这是因为该设计单元使用了IEEE库中定义的包集合。第二行说明使用了IEEE库中定义的1164包集合包集合。这是因为STD_LOGIC数据类型等在该1164包集合中定义。例2-2中包含了一个实体实体和两个构造体构造体,配置配置说明编译时应选中rtl1构造体。当然,如果只有一个构造体,配置说明也就可以省略了。 2.1.1实体描述实体描述实体在电路描述中主要是说明该电路的输输入入和和输输出出关关系系。此外,实体还定义电电路路名名称称及构构造造体体中中所所用用参数参数等。实体描述的一般书写格式如下:ENTITY 实体名实体名 IS类属参数说明;类属参数
8、说明;端口说明;端口说明;END实体名;实体名; 实体描述从“ENTITY实体名实体名IS”开始开始,至“END实体名实体名”结束结束。例如在例2-2中,实体描述可从“ENTITYmux2IS”开始,至“ENDmux2”结束。这里的大写字母大写字母表示实体描述的框架,所用的词都是VHDL语言的保留用词,用户在编程中一般不能将其用作它用。每个实体都应这样书写,它们是不可缺少和省略的部分。小写字母小写字母是设计者添写的部分,随设计单元的不同而不同。实际上,对VHDL语言而言,大写和小写字母都一视同仁大写和小写字母都一视同仁,不加区分。这样规定仅仅是为了增加程序的可读性而已。【例2-3】 2输入或非
9、门的实体说明程序:ENTITY nor2 ISPORT(a,b:IN bit; -说明两个输入端口a、b z :OUT bit); -说明一个输出端口zEND nor2;【例2-4】 3位计数器的实体说明程序:ENTITY count3 ISGENERIC(m:TIME:=5ns);PORT(clock,enable:IN STD_LOGIC; qout:OUT INTEGER RANGE 0 TO 7);END count3;图2-1二选一选择器的电原理图【例2-5】图2-1的VHDL语言描述:ENTITYmux2ISGENERIC(m:TIME:=1ns);PORT(d0,d1,sel:I
10、NBIT;q:OUTBIT);ENDmux2;ARCHITECTUREconnectOFmux2ISSIGNALtmp:BIT;BEGIN;PROCESS(d0,d1,sel);VARIABLEtmp1,tmp2,tmp3:BIT;BEGIN;tmp1=d0ANDsel;tmp2=d1AND(NOTsel);tmp3=tmp1ORtmp2;tmp=tmp3;q=tmpAFTERm;ENDPROCESS;ENDconnect;1. 类属参数说明类属参数说明类属参数说明必须放在端端口口说说明明之之前前,用于指指定定参参数数,如例2-5中的GENERIC(m:TIME=1ns)。该语句指定了构造体内
11、m的值为1ns。这样,语句q=tmpAFTERm;表 示 tmp经 1ns延 迟 才 送 到 q。 在 这 个 例 子 中 ,GENERIC利用类属参数为q建立一个延迟值。类属参数说明语句的书写格式如下: GENERIC(常数名常数名:数据类型数据类型:=设定值设定值; ; ; 常数名常数名:数据类型数据类型:=设定值设定值);2. 端口说明端口说明端口说明是对基基本本设设计计实实体体(单单元元)与与外外部部接接口口的的描描述述,也可以说是对外外部部引引脚脚信信号号的的名名称称,数数据据类类型型和和输输入入、输输出方向的描述出方向的描述。其一般书写格式书写格式如下:PORT(端口名端口名,端口
12、名,端口名: 方向方向 数据类型名;数据类型名; 端口名端口名,端口名,端口名: 方向方向 数据类型名数据类型名); 1)端口名端口名。端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名之,例如图2-1中的外部引脚d0,d1,sel,q等。2)端端口口方方向向。端口方向用来定义外部引脚的信号方向是输输入入还还是是输输出出。例如,图2-1中的d0,d1,sel为输入引脚,故用方向说明符“IN”说明之,而q则为输出引脚,用方向说明符“OUT”说明之。凡是用“IN”进行方向说明的端口,其信号自端口输入到构造体,而构造体内部的信号不能从该端口输出。相反,凡是用“OUT”
13、进行方向说明的端口,其信号将从构造体内经端口输出,而不能通过该端口向构造体输入信号。另外,“INOUT”用以说明该端口是双向双向的,可以输入也可以输出;“BUFFER”用以说明该端口可以输可以输出信号,且在构造体内部也可以利用该输出信号出信号,且在构造体内部也可以利用该输出信号。“LINKAGE”用以说明该端口无指定方向无指定方向,可以与任与任何方向的信号相连接何方向的信号相连接。表示方向的说明符及其含义如表2-1所示。表表2-1 端口方向说明端口方向说明 方向定义含义IN 输入端口入端口输入OUT 输出端口出端口输出(构造体内部不能再使用)INOUT 双向端口双向端口双向BUFFER 缓冲端
14、口冲端口输出(构造体内部可再使用)LINKAGE 可可连接端口接端口不指定方向,无论那个方向都可连接表2-1中“OUT”和“BUFFER”都可以定义输出端口,但是它们之间是有区别区别的,如图2-2所示。图2-2OUT和和BUFFER的区别的区别(a)OUT;(b)BUFFER3) 数据类型数据类型。在VHDL语言中有10种种标准数据类型,但是在逻辑电路设计中常用到两种两种:BIT和和BIT_VECTOR。当端口被说明为BIT数据类型时,该端口的信号取值只可能是“1”或“0”。注意,这里的“1”和“0”是指逻辑值。所以,BIT数据类型是位位逻逻辑辑数数据据类类型型,其取值只能是两个逻辑值(“1”
15、和“0”)中的一个。当端口被说明为BIT_VECTOR数据类型时,该端口的取值可能是一组二进制位的值一组二进制位的值。例如,某一数据总线输出端口具有8位的总线宽度,那么这样的总线端口的数据类型可以被说明成BIT_VECTOR。总线端口上的值由8位二进制位的值所确定。较完整的端口说明如例26所示。 【例【例2-6】 PORT(d0,d1,sel:INBIT;q:OUTBIT;bus:OUTBIT_VECTOR(7DOWNTO0);该例中,d0,d1,sel,q 都是BIT数据类型,而bus是BIT_VECTOR类型,(7DOWNTO0)表示该bus端口是一个8位端口,由B7B08位构成,位矢量长
16、度为8位。在某些VHDL语言的程序中,数数据据类类型型的的说说明明符符号号有有所所不不同同。仍以例2-6为例进行说明。【例【例2-7】 LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC;bus:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDmu;该例中BIT类型用STD_LOGIC替代,而bus则用STD_LOGIC_VECTOR(7DOWNTO0)说明。这样做在语法上都是语法上都是对的对的,所不同的是BIT、BIT_VECTOR与STD_LO
17、GIC、STD_LOGIC_VECTOR尽管都同样描述位和位矢量同样描述位和位矢量,但是它们的数数据类型是不一样的据类型是不一样的,前者只有两种状态两种状态“1”和和“0”;而后者却有9种种状态状态(这一点在后面详述)。BIT和和BIT_VECTOR在VHDL语言的标准库(STD库)中定义,使用该类型数据可以不作任何说明不作任何说明。STD_LOGIC和STD_LOGIC_VECTOR在IEEE库的1164包集合中定义。在该包集合中专门对STD_LOGIC和和STD_LOGIC_VECTOR数据类型的定义作了具体说明,其作用像C语言中的include文件一样。正如例2-7所示那样,如果在实体和
18、构造体中要使用这种类型的数据,就必须在实体描述前加两条语句:库说明语句和使用包集合的必须在实体描述前加两条语句:库说明语句和使用包集合的说明语句说明语句。这样可以使VHDL语言的编译器在对实体编译时从指定库的包集合中找到数据类型的定义。2.1.2 构造体描述构造体描述构造体具体地指指明明了了该该对对应应实实体体的的行行为为、元元件件及及内内部部的的连连接接关关系系,也就是说它定义了设设计计单单元元具具体体的的功功能能。构造体功能可以用3种种描描述述方方式式,即行行为为描描述述(数数学学模模型型描描述述)、寄寄存存器器传传输输描描述述(数数据据流流描描述述)和结结构构描描述述(逻逻辑辑元元件件连
19、连接接描描述述)。不同的描述方式,只体现在描述语句上,而其构造体的结构是完全一样的。由于构造体是对实体功能的具体描述,因此它它一一定定要要跟跟在在实实体体的的后后面面。通常,编译实体之后才能对构造体进行编译。如果实体需要重新编译,那么相应构造体也应重新进行编译。一个构造体的具体结构描述如下:ARCHITECTURE 构造体名构造体名 OF 实体名实体名 IS 定义语句内部信号,常数,数据类型,函数等的定义;定义语句内部信号,常数,数据类型,函数等的定义; BEGIN 并行处理语句;并行处理语句; END构造体名;构造体名;一个构造体从从“ARCHITECTURE 构造体名构造体名 OF 实体名
20、实体名 IS” 开始,至开始,至 “END 构造体名构造体名”结束结束。下面对构造体的有关内容和书写方法作一说明。1. 构造体名称的命名构造体名称的命名构造体的名称是对本构造体的命名,它是该构造体的惟一名称。OF后面紧跟的实体名表明了该构造体所对应的是哪一个实体。用IS来结束构造体的命名。构造体的名称可以由设计者自自由由命命名名,但最好与与其其性性质质有有关关。在大多数的文献和资料中,通通常常把把构构造造体体的的名名称称命命名名为为 behavioral(行行为为)、dataflow(数数据据流流)、rtl(寄寄存存器器传传输输)或或者者 structural(结结构构)。如前所述,这3个名称
21、实际上是3种构造体描述方式的名称。当设计者采用某一种描述方式来描述构造体时,该构造体的结构名称就命名为某名称。这样,使得阅读VHDL语言程序的人能直直接接了了解解设计者所采用的描描述述方方式式。例如,使用结构描述方式来描述二选一电路,那么二选一电路的构造体就可以这样命名:ARCHITECTUREstructuralOFmuxIS2. 定义语句定义语句 定义语句位于ARCHITECTURE和BEGIN之间,用用于于对对构构造造体体内部所使用的信号、常数、数据类型和函数等进行定义内部所使用的信号、常数、数据类型和函数等进行定义,例如:ARCHITECTUREbehavOFmuxISSIGNALne
22、s1:BIT;BEGINENDbehav;信号定义和端口说明的语句一样,应有信号名和数据类型信号名和数据类型的说明。因它是内部连接用的信号内部连接用的信号,故没有也不需有方向的说明不需有方向的说明。3. 并行处理语句并行处理语句并行处理语句处于语句BEGIN 和END 之间,这些语句具体地描描述述了了构构造造体体的的行行为为及及其其连连接接关关系系。例如,二选一的数据流方式描述可以如例2-8所示。【例2-8】 ENTITYmux2ISPORT(d0,d1:INBIT;sel:INBIT;q:OUTBIT);ENDmux2;ARCHITECTUREdataflowOFmux2ISBEGINq=(
23、d0ANDsel)OR(NOTselANDd1);ENDdataflow;一个异或门实体对应的一个异或门实体对应的3种描述方式的构造体种描述方式的构造体【例例2-8】 异或门构造体的数据流方式描述:异或门构造体的数据流方式描述: ARCHITECTUREdata_flowOFxor_gateISBEGINc=(aand(notb)or(nota)andb);ENDdata_flow;【例例2-9】 异或门构造体的行为描述异或门构造体的行为描述: ARCHITECTUREbehavioralOFxor_gateISPROCESS(a,b)BEGINIF(a=0ANDb1)THENc=1;ELSI
24、F(a=1ANDb0)THENc=1;ELSEc=0;ENDIF;ENDPROCESS;ENDbehavioral;【例例2-10】 异或门构造体的结构描述异或门构造体的结构描述:ARCHITECTUREstructureOFxor_gateISCOMPONENTnot_gatePORT(a:INBIT;b:OUTBIT);ENDCOMPONENT;COMPONENTand_gatePORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENT;COMPONENTor_gatePORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENT;SIGNALna,nb:BIT
25、;SIGNALc1,c2:BIT; BEGINu1:not_gatePORTMAP(a,na);u2:not_gatePORTMAP(b,nb);u3:and_gatePORTMAP(a,nb,c1);u4:and_gatePORTMAP(b,na,c2);u5:or_gatePORTMAP(c1,c2,c);ENDstructure;2.2.2 VHDL语言构造体的子结构描述语言构造体的子结构描述在规模较大的电路设计中,全部电路都用惟一的一个模块来描述是非常不方便的。为此,电路设计者总希望将整个电路分成若干个相对比较独立的模块来进行电路的描述。这样,一个构造体可以用几个子结构,即相对比较独立
26、的几个模块来构成。VHDL语言可以有以下3 种种形形式式的子结构描述语句的子结构描述语句: BLOCK语句结构;语句结构; PROCESS语句结构;语句结构; SUBPROGRAMS结构。结构。 1BLOCK语句结构描述语句结构描述1) BLOCK语句的结构语句的结构采用BLOCK语句描述局部电路的书写格式如下所示:块结构名块结构名:BLOCK BEGIN END BLOCK 块结构名;块结构名;如果采用BLOCK语句来描述二选一电路,那么用VHDL语言就可以书写为例2-12形式。【例2-12】用VHDL语言描述二选一电路ENTITYmuxISPORT(d0,d1,sel:INBIT;q:OU
27、TBIT);ENDmux;ARCHITECTUREconnectOFmuxISSIGNALtmp1,tmp2,tmp3:BIT;BEGINcale:BLOCKBEGINtmp1=d0ANDsel;tmp2=d1AND(NOTsel);tmp3=tmp1ORtmp2;q=tmp3;ENDBLOCKcale;ENDconnect;2) BLOCK块和子原理图的关系块和子原理图的关系人们在用计算机电路辅助设计工具输入电原理图时,往往将一个大规模的电原理图分割成多张子原理大规模的电原理图分割成多张子原理图进行输入和存档图进行输入和存档。同样在VHDL语句中也不例外,电路的构造体电路的构造体对应整个电原
28、理图,而构造体可以对应整个电原理图,而构造体可以由多由多个个BLOCK块构成,每一个块构成,每一个BLOCK块块对应一张子原理对应一张子原理图。图。这样电原理图的分割关系和VHDL语言程序中用BLOCK分割构造体的关系是一一对应的。一个具体实例如图2-3所示。图2-3BLOCK块和子原理图的关系3) BLOCK中语句的并发性中语句的并发性在对程序进行仿真时,BLOCK语句中所描述的各个语句是可以并行执行并行执行的,它和书写顺序无关。在VHDL语言中将这样可以并行执行的语句称为并发语句并发语句(ConcurrentStatement)。当然,在构造体内直接书写的语构造体内直接书写的语句也是并发的
29、句也是并发的。在VHDL语言中也存在只能顺序执行顺序执行的语句,这一点将在后面介绍。4) 卫式卫式BLOCK(Guarded BLOCK)在图2-3中使用BLOCK语句,仅仅是将构造体划分成几个独立的程序模块,这和执行控制没有直接关系。如前所述,在系统仿真时BLOCK语句将被无条件地执行。但是,在实际电路设计中,往往会碰到这样的情况:当某一种条件得到满足时,BLOCK语句才可以被执行;而条件不满足时,该BLOCK语句将不能被执行。这就是卫式卫式BLOCK,它可以实现实现BLOCK的执行控制的执行控制。例如,现在用BLOCK语句来描述一个锁存器的结构。该锁存器是一个D触发器,它具有一个数据输入端
30、d,时钟输入端clk,输出端q和反相输出端qb。众所周知,只有clk有效时(clk=1),输出端q和qb才会随d端输入数据的变化而变化(电平触发方式)。此时,用卫式BLOCK语句描述该锁存器结构的VHDL语言程序如例2-13所示。【例【例2-13】ENTITYlatchISPORT(d,clk:INBIT;q,qb:OUTBIT);ENDlatch;ARCHITECTURElatch_guardOFlatchISBEGING1:BLOCK(clk=1)BEGINq=GUARDEDdAFTER5ns;qb=GUARDEDNOT(d)AFTER7ns;ENDBLOCKG1;ENDlatch_gua
31、rd;如上述程序所示,卫式BLOCK语句的格式为:BLOCK 卫式布尔表达式卫式布尔表达式当卫卫式式布布尔尔表表达达式式为为真真时(例中clk=1为真时),该BLOCK语句被启启动动执执行行;而当卫卫式式表表达达式式为为假假时,该BLOCK语句将不被执行不被执行。在BLOCK块中的两个信号传送语句都写有前卫前卫关键词关键词GUARDED,这表明只有卫式布尔表达式为真时,这两个语句才被执行。现在根据程序,描述一下锁存器的工作过程。当端口clk的值为“1”时,卫式布尔表达式为真。d端的输入值经5ns延迟以后从q端输出,并且对d端的值取反,经7ns后从qb端输出。当端口clk的值为“0”时,d端到q
32、、qb端的信号传递通道将被切断,q端和qb端的输出保持原状,不随d端值的变化而改变。2进程进程(PROCESS)语句结构描述语句结构描述1) PROCESS语句的结构语句的结构采用PROCESS语句描述电路结构的书写格式如下:进进程程名名: PROCESS(敏敏感感信信号号1,敏敏感感信信号号2,) BEGIN END PROCESS;进程名可以有,也可省略。PROCESS语句从PROCESS开始至ENDPROCESS结束。执行PROCESS语句时,通常带有若干个敏感信号量。这些信号量将在PROCESS结构的语句中被使用。用PROCESS语句结构描述的程序如例2-14所示。ENTITYmuxI
33、SPORT(d0,d1,sel:INBIT;q:OUTBIT);ENDmux;ARCHITECTUREconnectOFmuxISBEGINcale:PROCESS(d0,d1,sel)VARIABLEtmp1,tmp2,tmp3:BIT;BEGINtmp1:=d0ANDsel;tmp2:=d1AND(NOTsel);tmp3:=tmp1ORtmp2;qb) THEN tmp:=a; ELSE tmp:=b; END IF; RETURN tmp; END max; END bpac;3) 过程语句和函数语句的使用过程语句和函数语句的使用(1) 过过程程语语句句使使用用。例2-15定义的过程语
34、句在进程中可以用以下形式书写:PROCESS(.)BEGIN;vector_to_int(z,x_flag,q);ENDPROCESS;过程用于描述电路设计中经常经常出现的可以共享共享的某一功能电路。它可以在构造体、构造体、BLOCK、PROCESS和子程序和子程序中使用。(2) 函函数数语语句句的的使使用用。函数语句与过程语句类同,它也可以在构构造造体体、BLOCK、PROCESS和和子子程程序序中使用,如下例为函数在构造体中调用的格式如下:用FUNCTION语句描述最大值检出的程序:LIBRARY IEEE. NEWLIB; USE IEEE.STD_LOGIC_1164.ALL; USE
35、 NEWLIB.bpac.ALL; ENTITY peakdetect IS PORT (data: IN STD_LOGIC_VECTOR (5 DOWNTO 0); clk, set: IN STD_LOGIC; dataout: OUT STD_LOGIC_VECTOR (5 DOWNTO 0); END peakdetect ARCHITECTURE rtl OF peakdetect IS SIGNAL peak: STD_LOGIC_VECTOR (5 DOWNTO 0); BEGIN dataout=peak; PROCESS(clk) BEGIN IF( clkEVENT AN
36、D clk=1) THEN IF( SET=1) THEN peak=data; ELSE peak=MAX( data, peak); END IF; END IF; END PROCESS; END rtl; 在上述程序中,peak=MAX( data, peak) 就是调用FUNCTION的语句。在上例2-17包集合中的参数a 和和 b,在这里用data 和和 peak所代替。函数的返回值tmp 被赋予被赋予 peak。在MAX(a, b)函数的定义中,返回值tmp可以赋予信号或者变量信号或者变量,在本例中被赋予信号peak。 无论是过程还是函数,在VHDL语言中常常用于描述多次使用的公
37、共单元电路,以使设计者能方便地共享。为了能重复使用这些过程和函数,这些程序通常组织在包集合、库中。它们与包集合和库的关系是:多个过程和函数汇集在一起构成包集合(多个过程和函数汇集在一起构成包集合(Package),),而几个包集合汇集在一起就形成一个库(而几个包集合汇集在一起就形成一个库(Library)。)。有关包集合和库后面介绍,注意不同公司发布的包集合和库的登记方法是各不相同的。4)子程序重载子程序重载 子程序重载(Subprograms Overload)的语言特性使得能够声能够声明多个名字相同但参数表不同的函数和过程明多个名字相同但参数表不同的函数和过程。 在具有不同数据类型操作数构
38、成的同名函数中,以运算符重载运算符重载式函数最为常见式函数最为常见,它为不同数据类型间的运算带来了极大的方便。例:子程序重载举例。 运算符重载式函数FUNCTION“+”(L:STD_LOGIC_VECTOR;R:INTEGER)RETURNSTD_LOGIC_VECTOR;FUNCTION“+”(L:INTEGER;R:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;FUNCTION“+”(L:STD_LOGIC_VECTOR;R:STD_LOGIC)RETURNSTD_LOGIC_VECTOR;。q=q+1;。 在程序中,首先对重载操作符进行了声明,使用双引
39、号 “ ” 将需要声明的操作符括起来。这样,在执行q=q+1; 时,如果q 的类型为STD_LOGIC_VECTOR,1为整数,程序就自动调用第一个函数。 过程重载PROCEDURE swap(a1,a2: IN real; q1: OUT INTEGER); PROCEDURE swap(a1,a2: IN INTEGER; q1: OUT BIT); swap(1.5,2.1,out1); swap(4,6,out2);程序中声明了两个过程名、参数数目和模式相同,而各参数的数据两个过程名、参数数目和模式相同,而各参数的数据类型不同的过程类型不同的过程。程序执行时可以自动根据参量的数据类型来
40、调用相应的过程,例如语句1: swap(1.5,2.1,out1); 将调用第一个过程,而语句2: swap(4,6,out2); 将调用另外一个过程。2.3 库、包集合及配置库、包集合及配置2.3.1 库库库(Library)是经经编编译译后后的的数数据据的的集集合合,它存放包包集集合合定定义义、实体定义、构造体定义和配置定义。实体定义、构造体定义和配置定义。库的功能类似于UNIX和MS-DOS操作系统中的目目录录,库中存放设计的数据。在VHDL语言中,库的说明总是放在设设计计单单元的最前面元的最前面:LIBRARY 库名;库名;这样在设计单元内的语句就可使用库中的数据。由此可见,库的好处库
41、的好处就在于使设计者可以共享已经编译过的设计结果。共享已经编译过的设计结果。在VHDL语言中可以存在多个不同的库,但是库和库之间是独立库和库之间是独立的,不能互相嵌套。的,不能互相嵌套。1. 库的种类库的种类当前在VHDL语言中存在的库大致可以归纳为5种种:IEEE库库、STD库库、ASIC矢矢量量库库、WORK库库和和用用户户定定义义的的库库。1)IEEE库库。在IEEE库中有一个“STD_LOGIC_1164”的的包包集集合合,它是IEEE正式认可的标准包集合。现在有些公司 , 如 SYNOPSYS公 司 也 提 供 一 些 包 集 合“STD_LOGIC_ARITH”、“STD_LOGI
42、C_UNSIGNED”,尽管它们没有得到IEEE的承认,但是仍汇集在IEEE库中。2) STD库库。STD库是VHDL的标准库,在库中存放有称为“STANDARD”的的包包集集合合。由于它是VHDL的的标标准准配配置置,因此设计者如要调用“STANDARD”中的数据,可以不按标准格式说明。STD库中还包含有称作“TEXTIO”的的包包集集合合。在使用“TEXTIO”包集合中的数据时,应先说明库和包集合名,然后才可使用该包集合中的数据,例如,LIBRARYSTD;USESTD.TEXTIO.ALL;该包集合在测试时使用。3) 面面向向ASIC的的库库。在VHDL中,为了进行门门级级仿仿真真,各公
43、司可提供面向ASIC的逻辑门库。在该库中存放着与与逻逻辑辑门门一一一一对对应应的的实实体体。为了使用面向ASIC的库,对库进行说明是必要的。4) WORK库库。WORK库是现现行行作作业业库库。设计者所描述的VHDL语句不不需需要要任何说明,都将存放在WORK库中。在使用该库时无需无需进行任何说明。5) 用户定义库。用户定义库。用户为自身设计需要所开发的共用包共用包集合和实体等集合和实体等,也可以汇集在一起定义成一个库汇集在一起定义成一个库,这就是用户定义库或称用户库。在使用时同样要首先说明库名。2. 库的使用库的使用1) 库库的的说说明明。前面提到的5类库除除WORK库库和和STD库库之之外
44、外,其其他他3类类库库在在使使用用前前都都需需要要先先作作说说明明,第一个语句是“LIBRARY 库库名名;”,表明使用什么库。另外还要说明设计者要使用的是库中哪一个包集合以及包集合中的项目名(如过程名、函数名等)。这样第二个语句的格式可以是:USE LIBRARY_name.package_name.ITEM.name;所以,一般在使用库时首先要用两条语句对库进行说明,例如:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;2) 库库说说明明作作用用范范围围。库说明语句的作作用用范范围围从从一一个个实实体体说说明明开开始始到到它它所所属属的的构构造造体体、配配置置
45、为为止止。当一个源程序中出现两个以上的实体时,两条作为使用库的说明语句应在在每每个个实实体体说说明明语句前重复书写语句前重复书写,请参看例2-18。【例2-18】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand1ISENDand1;ARCHITECTURErtlofand1IS库使用说明ENDrtl;CONFIGURATIONs1OFand1ISENDs1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYor1ISCONFIGURATIONs2OFor1ISENDs2; 库使用说明2.3.2 包集合包集合
46、包包集集合合(Package)的说明像C语言中include语句一样,用来单纯地罗罗列列VHDL语言中所要用到的信信号号定定义义、常常数数定定义义、数数据据类类型型、元元件件语语句句、函函数数定定义义和和过过程程定定义义等,它是一个可可编编译译的的设设计计单单元元,也是库库结结构构中中的的一一个个层层次次。在使用包集合时可以用用USE语句说明语句说明。例如:USE IEEE.STD_LOGIC_1164.ALL;该语句表示在VHDL程序中要使用名为STD_LOGIC_1164的包集合中的所有定义或说明项。包集合的结构如下所示:PACKAGE 包集合名包集合名 IS 说明语句;说明语句;END
47、包集合名;包集合名; PACKAGE BODY 包集合名包集合名 IS 说明语句;说明语句;END 包集合名;包集合名;包集合标题包集合标题包集合体包集合体一个包集合由两大部分组成:包集合标题包集合标题(Header)和包集和包集合体合体。(PackageBody)包集合体是一个可选项可选项,也就是说,包集合可以只由包集合标题构成。一般包集合标题列出所有项包集合标题列出所有项的名称,而包集合体具体给出各项的细节的名称,而包集合体具体给出各项的细节。例如,在例2-16中,包集合由包集合标题和包集合两部分组成。在包集合标题中,定义了数据类型和函数的调用关系,而在包集合体中,具体地描述了实现该函数功
48、能的语句和数据的赋值。这种分开描分开描述的好处述的好处是,当函数的功能需要作某些调整或数据赋值需要变化时,只要改变包集合体的相关语句就行了,而无需改变包标题的说明,这样可以使重新编译的单元数目尽可能少重新编译的单元数目尽可能少。【例2-19】LIBRARYIEEE;USEIEEESTD_LOGIC_1164.ALL;PACKAGEupacISCONSTANTk:INTEGER:=4;TYPEinstructionIS(add,sub,adc,inc,srf,slf);SUBTYPEcpu_busISSTD_LOGIC_VECTOR(k-1DOWNTO0);ENDupac;上述的包集合是用户自定
49、义的。在该包集合中定义了CPU的指令这一数据类型和cpu_bus为一个4位的位矢量。由于它是用户自己定义的,因此编译以后就会自动地加到WORK库中,如要使用该包集合,则可用如下格式调用:USE WORK.upac.instruction;2.3.3 配置配置配置配置(Configuration)语句描述了层与层之间的连接关系层与层之间的连接关系以及实体与结构之间的连接关系实体与结构之间的连接关系。设计者可以利用这种配置语句来选择不同的构造体不同的构造体,使其与要设计的实体相对应与要设计的实体相对应。在仿真某一个实体时,可以利用配置来选择不同的构造体,进行性能对比试验以得到性能最佳的构造体得到性
50、能最佳的构造体。例如,要设计一个二输入四输出的译码器,如果一种结构中的基本元件采用反相器和三输入与门,而另一种结构中的基本元件都采用与非门,且它们各自的构造体是不一样的,并且都放在各自不同的库中,那么现在要设计的译码器,就可以利用配置语句实现对两种不同构造体的选择。配置语句的基本书写格式如下: CONFIGURATION 配置名配置名 OF 实体名实体名 IS 语句说明;语句说明; END 配置名;配置名;配置语句根据不同情况,其说明语句有简有繁说明语句有简有繁,下面举例进行说明。最简单的缺省配置格式结构(默认配置)缺省配置格式结构(默认配置)如下:CONFIGURATION 配置名配置名 O
51、F 实体名实体名 IS FOR 选配构造体名选配构造体名 END FOR;END 配置名;配置名;【例2-20】一个计数器实体的两个不同构造体的配置LIBRARYSTD;USESTD.STD_LOGIC.ALL;ENTITYcounterISPORT(load,clear,clk:INT_WLOGIC;Data_in:ININTEGER;Data_out:OUTINTEGER);ENDcounter;ARCHITECTUREcount_255OFcounterISBEGINPROCESS(clk)VARIABLEcount:INTEGER:=0;BEGINIFclear=1THENCount:
52、=0;ELSIFload=1THENCount:=data_in;ELSIF(clkEVENT)AND(clk=1)AND(clkLAST_VALUE=0)THENIF(count=255)THENCount:=0;ELSECount:=count+1;ENDIF;ENDIF;data_out=count;ENDPROCESS;ENDcount_255;ARCHITECTUREcount_64KOFcounterISBEGINPROCESS(clk)VARIABLEcount:INTEGER:=0;BEGINIF(clear=1)THNEcount:=0;ELSIFload=1THENcoun
53、t:=data_in;ELSIF(clkEVENT)AND(clk=1)AND(clkLAST_VALUE=0)THENIF(count=65535)THENcount:=0;ELSEcount:=count+1;ENDIF;ENDIF;data_out=count;ENDPROCESS;ENDcount_64K;CONFIGURATIONsmall_countOFcounterISFORcount_255ENDFOR;ENDsmall_count;CONFIGURATIONbig_countOFcounterISFORcount_64KENDFOR;ENDbig_count;在例2-20中,一个计数器实体可以实现两个不同一个计数器实体可以实现两个不同构造体的配置构造体的配置。需要注意的是,为达到这个目的,计数器实体中实体中对装入计数器和构成计数器的数据位宽度数据位宽度不应作具体说明不应作具体说明,只将输入和输出数据作为INTEGER(整型)数据来对待。这样就可以支持多种形支持多种形式的计数器式的计数器(如例中的8位计数器和16位计数器),以便在宿主机上方便地进行仿真。