您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 第6章子程序与程序包
第6章子程序与程序包子程序程序包本章内容:6.1子程序子程序就是在主程序调用它以后能够将处理结果返回主程序的程序模块。它是利用顺序语句实现算法的,应用它可以更有效地完成重复性的设计工作。定义位置(程序包、结构体和进程)决定使用范围。子程序具有可重载的特点,即允许有许多重名的子程序,但其参数、返回值的数据类型不同。VHDL中有两种类型的子程序:过程(Procedure)和函数(Function)。6.1子程序函数与过程函数的参量只能是方式为IN的信号和常量,而过程的参量可以为in,out和inout方式;过程能返回多个变量,函数只能有一个返回值;过程中可以有WAIT语句,而函数中却不能有该语句。在VHDL中有多种函数形式,如库中现成的具有专用功能的预定义函数和用于不同目的的自定义函数。函数的语言表达格式如下:FUNCTION函数名(参数表)RETURN数据类型--函数首FUNCTION函数名(参数表)RETURN数据类型IS--函数体[说明部分]BEGIN顺序语句;ENDFUNCTION函数名;函数定义格式:FUNCTION函数名(参数表)RETURN数据类型--函数首FUNCTION函数名(参数表)RETURN数据类型IS--函数体[说明部分]BEGIN顺序语句;ENDFUNCTION函数名;6.1.1函数说明:(1)函数首和函数体定义位置程序包:函数首放在包说明中;函数体放在包体中;用USE打开。结构体:结构体的说明部分,只需要函数体部分,并且只对该设计实体可见。进程:进程的说明部分,只需要函数体部分,只对该进程可见。(2)参数信号或常数,默认为常数6.1.1函数函数首函数首是由函数名、参数表和返回值的数据类型三部分组成的。函数首的名称即为函数的名称,需放在关键词FUNCTION之后,它可以是普通的标识符,也可以是运算符(这时必须加上双引号)。6.1.1函数【例】FUNCTIONFUNC1(A,B,C:REAL)RETURNREAL;FUNCTION*(A,B:INTEGER)RETURNINTEGER;--注意函数名*要用引号括住FUNCTIONAS2(SIGNALIN1,IN2:REAL)RETURNREAL;--注意信号参量的写法以上是三个不同的函数首,它们都放在某一程序包的说明部分。函数首函数体函数体包括对数据类型、常数、变量等的局部说明以及用以完成规定算法或转换的顺序语句,并以关键词ENDFUNCTION以及函数名结尾。一旦函数被调用,就将执行这部分语句。6.1.1函数【例】ENTITYFUNCISPORT(A:INBIT_VECTOR(0TO2);M:OUTBUT_VECTOR(0TO2));ENDENTITYFUNC;ARCHITECTUREARTOFFUNCISFUNCTIONSAM(X,Y,Z:BIT)RETURNBITIS--定义函数SAM,该函数无函数首BEGINRETURN(XANDY)ORY;ENDFUNCTIONSAM;函数体BEGINPROCESS(A)ISBEGINM(0)=SAM(A(0),A(1),A(2));M(1)=SAM(A(2),A(0),A(1));M(2)=SAM(A(1),A(2),A(0));ENDPROCESS;ENDARCHITECTUREART;--当A的三个位输入元素A(0)、A(1)和A(2)中的任何一位有变化时,将启动对函数SAM的调用,并将函数的返回值赋给M输出函数体例6-3architectureBehavioraloffuncisfunctionmax(x,y,z:std_logic)returnstd_logicisbeginreturn(xandyandz);endfunctionmax;beginf(0)=max(a(0),b(0),c(0));f(1)=max(a(1),b(1),c(1));f(2)=max(a(2),b(2),c(2));f(3)=max(a(3),b(3),c(3));endBehavioral;函数调用过程的定义格式:PROCEDURE过程名(参数表);--过程首PROCEDURE过程名(参数表)IS--过程体开始[说明部分;]BEGIN顺序语句;ENDPROCEDURE过程名;--过程体结束6.1.2过程过程首过程首由过程名和参数表组成。参数表用于对常数、变量和信号三类数据对象目标作出说明,并用关键词IN、OUT和INOUT定义这些参数的工作模式,即信息的流向。6.1.2过程【例】PROCEDUREPRO1(VARIABLEA,B:INOUTREAL);PROCEDUREPRO2(CONSTANTA1:ININTEGER;VARIABLEB1:OUTINTEGER);PROCEDUREPRO3(SIGNALS1:INOUTBIT);过程首过程体过程体是由顺序语句组成的,过程的调用即启动了对过程体的顺序语句的执行。过程体中的说明部分只是局部的,其中的各种定义只能适用于过程体内部。过程体的顺序语句部分可以包含WAIT语句。但如果一个过程是在进程中调用的,且这个进程已列出了敏感参量表,则不能在此过程中使用WAIT语句。6.1.2过程【例6-5】PROCEDUREPRG1(VARIABLEV1:INOUTBIT_VECTOR(0TO7))ISBEGINCASEV1ISWHEN“0000”=V1:=“0101”;WHEN“0101”=V1:=“0000”;WHENOTHERS=V1:=“1111”;ENDCASE;ENDPROCEDUREPRG1;过程体例6-6architectureBehavioraloffuncisPROCEDUREand3(signalx,y,z:instd_logic;signale:outstd_logic)isbegine=xandyandz;ENDPROCEDUREand3;beginand3(a(0),b(0),c(0),f(0));and3(a(1),b(1),c(1),f(1));and3(a(2),b(2),c(2),f(2));and3(a(3),b(3),c(3),f(3));endBehavioral;过程调用为了使已定义的常数、数据类型、元件调用说明以及子程序能被更多的VHDL设计实体方便地访问和共享,可以将它们收集在一个VHDL程序包中。多个程序包可以并入一个VHDL库中,使之适用于更一般的访问和调用范围。这一点对于大系统开发,多个或多组开发人员并行工作显得尤为重要。6.2库和程序包库的语句格式:LIBRARY库名;这一语句相当于为其后的设计实体打开了以此库名命名的库,以便设计实体可以利用其中的程序包。如语句“LIBRARYIEEE;”表示打开IEEE库。6.2.1库(LIBRARY)库的种类VHDL程序设计中常用的库有四种:1)IEEE库IEEE库是VHDL设计中最为常见的库,它包含有IEEE标准的程序包和其他一些支持工业标准的程序包。2)STD库VHDL语言标准定义了两个标准程序包,即STANDARD和TEXTIO程序包,它们都被收入在STD库中。6.2.1库(LIBRARY)3)WORK库WORK库是用户的VHDL设计的现行工作库,用于存放用户设计和定义的一些设计单元和程序包。因此自动满足VHDL语言标准,在实际调用中不必显式说明。4)VITAL库VITAL库是各FPGA/CPLD生产厂商提供的面向ASIC的逻辑门库。使用VITAL库,可以提高VHDL门级时序模拟的精度,因而只在VHDL仿真器中使用。库的种类库的用法在VHDL语言中,库的说明语句总是放在实体单元前面,而且库语言一般必须与USE语言同用。库语言关键词LIBRARY指明所使用的库名,USE语句指明库中的程序包。一旦说明了库和程序包,整个设计实体都可进入访问或调用,但其作用范围仅限于所说明的设计实体。6.2.1库(LIBRARY)例如:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;以上的三条语句表示打开IEEE库,再打开此库中的STD_LOGIC_1164程序包和STD_LOGIC_UNSIGNED程序包的所有内容。库的用法【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.STD_ULOGIC;USEIEEE.STD_LOGIC_1164.RISING_EDGE;库的用法收集已定义的常数、数据类型、元件调用说明以及子程序,使其能被更多的VHDL设计实体方便地访问和共享。6.2.2程序包(PACKAGE)程序包结构:由如下四种基本结构组成。常数说明:主要用于预定义系统的宽度,如数据总线通道的宽度。数据类型说明:主要用于说明在整个设计中通用的数据类型,例如通用的地址总线数据类型定义等。元件定义:主要规定在VHDL设计中参与元件例化的文件(已完成的设计实体)对外的接口界面。子程序说明:用于说明在设计中任一处可调用的子程序。6.2.2程序包(PACKAGE)程序包结构:PACKAGE程序包名IS--程序包首程序包首说明部分;END[PACKAGE][程序包名];PACKAGEBODY程序包名IS--程序包体程序包体说明部分以及包体内容;END[PACKAGEBODY][程序包名];6.2.2程序包(PACKAGE)程序包首程序包首的说明部分可收集多个不同的VHDL设计所需的公共信息,其中包括数据类型说明、信号说明、子程序说明及元件说明等。程序包结构中,程序包体并非是必须的,程序包首可以独立定义和使用。程序包结构【例6-7】PACKAGEPAC1IS--程序包首开始TYPEBYTEISRANGE0TO255;--定义数据类型BYTESUBTYPEBYTE1ISBYTERANGE0TO15;--定义子类型BYTE1CONSTANTC1:BYTE:=255;--定义常数C1SIGNAS1:BYTE1;--定义信号S1程序包首COMPONENTBYTE_ADDERIS--定义元件PORT(A,B:INBYTE;C:OUTBYTE;OVERFLOW:OUTBOOLEAN);ENDCOMPONENTBYTE_ADDER;FUNCTIONMY_FUNCTION(A:INBYTE)RETURNBYTE;--定义函数ENDPACKAGEPAC1;--程序包首结束程序包首程序包体程序包体用于定义在程序包首中已定义的子程序的子程序体。程序包体说明部分可以是USE语句(允许对其他程序包的调用)、子程序定义、子程序体、数据类型说明、子类型说明和常数说明等。程序包结构【例6-8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackexpIS--定义程序包首FUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;--定义函数首END;程序包体PACKAGEBODYpackexpIS--定义程序包体FUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)--定义函数体RETURNSTD_LOGIC_VECTORISBEGINIFabTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;--结束FUNCTION语句END;--结束PACKAGEBODY语句程序包体【例6-9】引用例6-8中定义的程序包packexp中的函数max:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.packexp.ALL;ENTITYaxampISPORT(dat1,dat2:INSTD_LOGIC_VECTOR(3DOWNTO0);dat3,dat4:INSTD_LOGIC_VECTOR(3DOWNTO0);out1,out2
本文标题:第6章子程序与程序包
链接地址:https://www.777doc.com/doc-3219652 .html