VHDL语言应用基础3(子程序,库)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

PART5SUBPROGRAM子程序由一组顺序语句组成,是为了在程序中重复使用而设立的。子程序不是一个独立的编译单位,只能置于实体或程序包中,在结构体中定义的子程序对于该结构体来说是局部的,即不能被其它设计层次的结构体调用。如果要在其它结构体中调用同一个子程序,就需要把子程序定义到程序包中。VHDL中的子程序有两类:过程(PROCEDURE):过程通过其接口返回0个或多个值。函数(FUNCTION):函数直接返回单个值。子程序包含两部分:即子程序声明和主体部分。在程序包中声明子程序时,子程序声明必须要在程序包声明中,子程序主体必须要在程序包体中。一、函数的定义与引用函数语句的作用是输入若干参数,通过函数运算求值,最后返回直接一个值。函数语句的格式为:FUNCTION函数名(参数表)RETURN数据类型;--函数首FUNCTION函数名(参数表)RETURN数据类型IS--函数体[子程序声明部分;]BEGIN顺序语句;END函数名;函数首是程序包与函数的接口界面。如果要将一个函数组织成程序包入库,则必须定义函数首,且函数首应放在程序包的说明部分,而函数体应放在程序包的包体内。如果只在一个结构体中定义并调用函数,则只需定义函数体即可。其中:参数表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数;在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfunISPORT(A:INstd_logic_Vector(0TO2);M:OUTstd_logic_Vector(0TO2));ENDfun;ARCHITECTUREartOFfunISFUNCTIONsam(X,Y,Z:BIT)RETURNBITISBEGINRETURN(XANDY)ORZ;ENDsam;函数应用实例只有输入变量BEGINPROCESS(A)BEGINM(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;ENDart;当A的3个位中任何一位有变化时,将启动对sam函数的调用,并将返回值赋给M输出。函数调用是一个表达式。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackexpIS--定义程序包FUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;--定义函数首FUNCTIONfunc1(a,b,c:REAL)RETURNREAL;--定义函数首FUNCTION*(a,b:INTEGER)RETURNINTEGER;--定义函数首FUNCTIONas2(SIGNALin1,in2:REAL)RETURNREAL;--定义函数首END;PACKAGEBODYpackexpISFUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS--定义函数体BEGINIFabTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;--结束FUNCTION语句END;--结束PACKAGEBODY语句LIBRARYIEEE;--函数应用实例USEIEEE.STD_LOGIC_1164.ALL;USEWORK.packexp.ALL;ENTITYaxampISPORT(dat1,dat2:INSTD_LOGIC_VECTOR(3DOWNTO0);dat3,dat4:INSTD_LOGIC_VECTOR(3DOWNTO0);out1,out2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREbhvOFaxampISBEGINout1=max(dat1,dat2);--用在赋值语句中的并行函数调用语句PROCESS(dat3,dat4)BEGINout2=max(dat3,dat4);--顺序函数调用语句ENDPROCESS;END;二、过程的定义与引用过程的作用是传递信息,即通过参数进行内外的信息传递。其中参数需说明(信号、变量及常量)类别、类型及传递方向。过程定义的格式为:PROCEDURE过程名(参数声明)IS[子程序声明部分];BEGIN顺序语句;END[PROCEDURE][过程名];其中:参数声明指明了输入、输出端口的数目和类型。参数声明的语法格式为:[参数名:方式]方式参数类型有in\out\inout\buffer等四种。在PROCEDURE结构中,参数可以是输入也可以是输出。在没有特别指定的情况下,“IN”作为常数;而“OUT”和“INOUT”则看作“变量”进行拷贝。在过程语句执行结束后,如没有特别说明,输出和输入输出参数将按变量对待将值传递给调用者的变量。如果调用者需要输出和输入输出作为信号使用,则在过程参数定义时要指明是信号。例如:PROCEDUREshift(din:INSTD_LOGIC_VECTOR;SIGNALdou:OUTSTD_LOGIC_VECTOR;q:INOUTINTEGER)ISBEGIN...ENDshift;过程的调用是一条语句,调用时通过其接口返回0个或多个值。根据环境的不同,过程调用有两种方式,即顺序语句方式和并行语句方式。在一般的顺序语句自然执行过程中,一个过程被执行,则属于顺序语句方式;当某个过程处于并行语句环境中时,其过程体中定义的任一IN或INOUT的目标参量发生改变时,将启动过程的调用,这时的调用属于并行语句方式。过程的调用LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfunISPORT(A:INstd_logic_Vector(0TO2);M:OUTstd_logic_Vector(0TO2));ENDfun;ARCHITECTUREart1OFfunISPROCEDUREsam1(X,Y,Z:INBIT;N:OUTBIT)ISBEGINN:=(XANDY)ORZ;ENDsam1;过程应用实例不仅有输入变量还有输出变量。BEGINsam1(A(0),A(1),A(2),N(0));sam1(A(2),A(0),A(1),N(1));sam1(A(1),A(2),A(0),N(2));M(0)=N(0);--等效于:M=N(2)&N(1)&N(0);M(1)=N(1);M(2)=N(2);ENDart1;过程的调用即启动了对过程体的顺序语句的调用,调用3次。过程调用是一条语句。Ex1:写出一个函数模型,将一个无符号数转换成一个整数。functionbv_to_integer(bv:inbit_vector)returnintegerisvariableresult:integer:=0;beginforindexinbv'rangeloopresult:=result*2+bit'pos(bv(index));endloop;returnresult;endbv_to_integer;EX2:把上面的函数用过程来实现,并补充成完整的可编译程序entityPROCEDURE1isport(a:inbit_vector(3downto0);b:outinteger);endPROCEDURE1;architectureoneofPROCEDURE1isPROCEDUREbv_to_integer(bv:inbit_vector;signalresult:outinteger)isvariabletem:integer:=0;beginforindexinbv'rangelooptem:=tem*2+bit'pos(bv(index));endloop;result=tem;endbv_to_integer;beginbv_to_integer(a,b);endone;在PROCEDURE结构中,参数可以是输入也可以是输出。而FUNCTION语句中括号内的所有参数都是输入参数或输入信号,因此在括号内指明端口方向的“IN”可以省略。FUNCTION的输入值由调用者拷贝到输入参数中,如果没有特别指定,在FUNCTION语句中按常数处理。通常各种功能的FUNCTION语句的程序都被集中在包集合(Package)中。PART6LIBRARY,PAKAGEANDCONFIGRATION除了实体和构造体之外,包集合、库及配置是在VHDL语言中另外3个可以各自独立进行编译的源设计单元。库(Library):用于存放预先编译好的程序包(PACKAGE)和数据集合体。常用的库有IEEE、STD、WORK、用户库等。这些设计单元可用作其他VHDL描述的资源。用户编写的设计单元既可以访问多个设计库,又可以加入到设计库中,被其他单元所访问。使用格式为:LIBRARY库名称;一、设计库1.库的种类当前在VHDL语言中存在的库大致可以分为5类:IEEE库,STD库,ASIC矢量库,用户定义的库和WORK库。IEEE库。常用的资源库。IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的一些包集合,如STD_LOGIC_ARITH(算术运算库)、STD_LOGIC_UNSIGNED等。STD库。VHDL的标准库。库中存放有称为“standard”的标准包集合,其中定义了多种常用的数据类型,均不加说明可直接引用。STD库中还包含有称为“textio”的包集合。在使用“textio”包集合中的数据时,应先说明库和包集合名,然后才可使用该包集合中的数据。ASIC矢量库。在VHDL语言中,为了进行门级仿真,各公司可提供面向ASIC的逻辑门库。在该库中存放着与逻辑门一一对应的实体。为了使用面向ASIC的库,对库进行说明是必要的。WORK库。WORK库是现行作业库。设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中。WORK库对所有设计都是隐含可见的,因此在使用该库时无需进行任何说明。用户定义库。用户定义库简称用户库,是由用户自己创建并定义的库。设计者可以把自己经常使用的非标准(一般是自己开发的)包集合和实体等汇集成在一起定义成一个库,作为对VHDL标准库的补充。用户定义库在使用时同样要首先进行说明。2.库的使用1)库的说明前面提到的5类库,除WORK库和STD库之外,其他3类库在使用前都首先要作说明。库说明语句的语法形式为:LIBRARY库名;--说明使用什么库USE包集合名;--说明使用库中哪一个包集合及包集合中的项目(如过程名、函数名等)如:包集合名最多为三个层次,即:library-name.packge-name.item-nameLIBRARY语句和USE语句的作用范围:仅限于紧跟其后的实体和结构体。若一个源程序中出现两个以上的实体时,库说明语句应该在每个实体前重复书写。例如:二、包集合在VHDL中数据类型、常量及子程序在实体说明和结构体内定义,而这些数据类型、常量及子程序对其他设计实体是不可见的。为使它们对其他设计实体可见,VHDL提供了程序包(Package)。用程序包可定义一些公用的子程序、常量以及自定义数据类型等。各种VHDL编译系统都含有多个标准程序包,如Std-Logic-1164和Standard程序包。用户也可以自行设计程序包(保存到WORK下)。包集合包括包头和包体两部分。包头用来声明包中的类型、元件、函数和子程序;而包体则用来存放说明中的函数和子程序。不含有子程序和函数的包集合不需要包体。(1)程序包声明单元的一般格式:PACKAGE程序包名IS说明语句END[程序包名];其中说明语句为:USE语句、类型定义、常量定义

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功