VHDL的子程序子程序由函数和过程组成,函数只有输入参数和单一的返回值,而过程有任意多个输入、输出和双向参数。函数有类型转换的转换函数。决断函数为多驱动网络算出正确驱动值。过程被看作一种语句,而函数通常是表达式的一部分。过程能单独存在,而函数通常作为语句的一部分被请求。程序包用于封装属于多个设计单元分享的公共信息。程序包由程序包说明(说明数据类型、子程序和常量等)和程序包体(它含有子程序体与现有的延时常数)所组成。VHDL的子程序(1)子程序由执行公共操作的过程和函数组成。程序包是分享属于实体数据的一种机制,把子程序、数据类型和元件说明看成建立设计的工具,则程序包是工具箱1)过程返回多个变量,而函数则只返回一个变元。2)函数中所有参数是输入参数。而过程有输入参数,输出参数和双向参数。3)过程和函数都有两种形式:即并行过程和并行函数以及顺序过程和顺序函数。•并行的过程与函数可在进程语句和另一个子程序的外部,•而顺序函数和过程仅存在于进程语句和另一个子程序语句。•过程在结构体或者进程中按分散语句的形式存在,而函数经常在赋值语句或表达式中用。函数USEWORK.std_logic_1164.ALL;PACKAGEnum_typesISTYPElog8ISARRAY(0TO7)OFstd_logic;--line1ENDnum_types;USEWORK.std_logic_1164.ALL;USEWORK.num_types.ALL;ENTITYconvertISPORT(I1:INlog8;--line2O1:OUTINTEGER);--line3ENDconvert;ENTITYent1IS}...declaration_statementBEGIN}...comcurrent_statementENDENTITYent1;PROCESS(...)}...BEGIN}...ENDPROCESS;--FUNCTIONCALLY=FN1(...);--PROCEDURECALLlabel1:PD1(...);SUBPROGRAMCALLARCHITECTUREarch1OFent1IS}...declaration_statementBEGIN}...concurrent_statementENDENTITYent1;ps1:PROCESS(...)}...declaration_statementBEGIN}...concurrent_statementENDPROCESSps1;blk1:BLOCK}...declaration_statementblk2:BLOCK}...declaration_statementBEGIN}...concurrent_statementENDBLOCKblk2;BEGIN}...concurrent_statementENDBLOCKblk1;12222211121在ENTITY内能说明被动进程和被动子程序调用1)不在进程语句和子程序内的所有并行语句都可以对子程序做并行调用2)在进程语句和子程序内部只能按顺序调用子程序3)进程和子程序内的语句是顺序执行的语句进程插在1的位置子程序插在2的位置进程和子程序调用出现在何处VHDL的子程序(2)ARCHITECTUREbehaveOFconvertISFUNCTIONvector_to_int(S:log8)--line4RETURNINTEGERis--line5VARIABLEresult:INTEGER:=0;--line6BEGINFORiIN0TO7LOOP--line7result:=result*2;--line8IFS(i)='1'THEN--line9result:=result+1;--line10ENDIF;ENDLOOP;RETURNresult;--line11ENDvector_to_int;BEGINO1=vector_to_int(I1);--line12ENDbehave;behave结构体说明区中描述vector_to_int函数,函数在结构体中是透明的。函数对数组中每bit位置做移位和相加,(用*2)先移位,如果移出逻辑1值,就加1。最后调用函数的结果赋值到输出端口。函数的参量总只能是输入参数,上例的参量是constant类别的,没有显式地指定而是默认为一个常量。函数还有另一种参量是signal信号参量,由信号参量传入信号属性,并在函数中是可用的。语句的例外是属性’STABLE,’TRANSACTION,’QUIET和’DELAYED,他们将建立特殊的信号。包含信号参数的函数例子如下所示:函数名.变元和返回值函数说明区它能说明变量、常量和类型,但不能说明信号convertI1O1在结构体中做函数调用VHDL的子程序(3)USEWORK.std_logic_1164.ALL;ENTITYdffISPORT(d,clk:INstd_logic;q:OUTstd_logic);FUNCTIONrising_edge(SIGNALS:std_logic)--line1RETURNBOOLEANIS--line2BEGINIF(S'EVENT)AND(S='1')AND--line3(S'LAST_VALUE='0')THEN--line4RETURNTRUE;--line5ELSERETURNFALSE;--line6ENDIF;ENDrising_edge;ENDdff;ARCHITECTUREbehaveOFdffISBEGINPROCESS(clk)BEGINIFrising_edge(clk)THEN--line7q=d;--line8ENDIF;ENDPROCESS;ENDbehave;在实体中说明的函数和过程均属被动这是上升沿检查函数在实体中说明的函数可以在结构体中调用VHDL的子程序(4)两类函数;一是转换函数(conversionfunction),二是决断函数(resolutionfunction)。转换函数用于类型的转换,决断函数用于多个驱动信号母线的竞争。转换函数用来转换对象的一种类型到另一种类型,在元件具体装配语句中应允许不同类型信号和端口之间的映射,若想用的实体与另一设计中的实体用的数据类型不同时,就有这种类型转换的情况,假定设计者A正用的四值数据类型是:TYPEfourvalIS(X,L,H,Z);而设计者B用的数据类型包括了标识不同的四值:TYPEfourvalueIS(`X',`0',`1',`Z');如果设计者A想用设计者B的模块,而设计者B对模块接口的端口用fourvalue类型的值,那么设计者A不能在没有对端口的数据类型,转换到设计者B用的系统值时就用这个模块,但可以通过转换函数解决。第一种类型表示这四种状态的值为:X不定值L逻辑0值H逻辑1值Z高阻或称之为集电极开路的值第二种类型表示这四种状态的值为:`X'不定值`0'逻辑0值`1'逻辑1值`Z'高阻或称之为集电极开路的值VHDL的子程序(5)用函数将接受的fourval类型值返回fourvalue类型的值FUNCTIONconvert4val(S:fourval)RETURNfourvalueISBEGINCASESISWHENX=RETURN'X';WHENL=RETURN'0';WHENH=RETURN'1';WHENZ=RETURN'Z';ENDCASE;ENDconvert4val;***************************************************PACKAGEmy_stdISTYPEfourvalIS(X,L,H,Z);TYPEfourvalueIS('X','0','1','Z');TYPEfvector4ISARRAY(0TO3)OFfourval;ENDmy_std;USEWORK.my_std.ALL;ENTITYregISPORT(a:INfvector4;clr:INfourval;clk:INfourval;q:OUTfvector4);Fourval(fvector4)Fvector4(fourval)aa44clkclrreg四值转换函数VHDL的子程序(6)FUNCTIONconvert4val(S:fourval)RETURNfourvalueISBEGINCASESISWHENX=RETURN'X';WHENL=RETURN'0';WHENH=RETURN'1';WHENZ=RETURN'Z';ENDCASE;ENDconvert4val;FUNCTIONconvert4value(S:fourvalue)RETURNfourvalISBEGINCASESISWHEN'X’=RETURNX;WHEN'0'=RETURNL;WHEN'1'=RETURNH;WHEN'Z'=RETURNZ;ENDCASE;ENDconvert4value;ENDreg;XLHZ‘X’‘0’‘1’‘Z’XLHZXLHZ‘X’‘0’‘1’‘Z’convert4valueconvert4valVHDL的子程序(7)ARCHITECTUREstructureOFregISCOMPONENTdffPORT(d,clk,clr:INfourvalue;q:OUTfourvalue);ENDCOMPONENT;BEGINU1:dffPORTMAP(convert4val(a(0)),convert4val(clk),convert4val(clr),convert4value(q)=q(0));U2:dffPORTMAP(convert4val(a(1)),convert4val(clk),convert4val(clr),convert4value(q)=q(1));U3:dffPORTMAP(convert4val(a(2)),convert4val(clk),convert4val(clr),convert4value(q)=q(2));U4:dffPORTMAP(convert4val(a(3)),convert4val(clk),convert4val(clr),convert4value(q)=q(3));ENDstructure;u1u1u1u1a(0)a(1)a(2)a(3)clrclka(3)q(2)q(1)q(0)ddff(fourvalue)clrclkq(fourvalue)VHDL的子程序(8)下面是在称之为trans2的实体中含两个双向转换器件的例子。PACKAGEmy_packISTYPEninevalIS(Z0,Z1,ZX,R0,R1,RX,'0','1',FX);TYPEnvector2ISARRAY(0TO1)OFnineval;TYPEfourstateIS(X,L,H,Z);FUNCTIONconvert4state(a:fourstate)RETURNnineval;convert4stateFUNCTIONconvert9val(a:nineval)RETURNfourstate;ENDmy_pack;convert9valXLHZZ0,Z1,ZX,R0,R1,RX,0','1',FXZ0,Z1,ZX,R0,R1,RX,'0','1',FXXLHZconvert4statePACKAGEbodymy_packISFUNCTIONconvert4state(a:fourstate)RETURNninevalISBEGINCASEaISWHENX=RETURNFX;WHENL=RETURNF0;WHENH=RETURNF1;WHENZ=RETURNZX;ENDCASE;ENDconvert4state;XLHZX,L,H,ZFXF0F1ZXVHDL的子程序(9)FUNCTIONconvert9val(a:nineval)RETURNfourstateISBEGINCASEaISWH