目录
一.子程序概述
1.子程序的功能
2.子程序的种类
3.子程序的组成
4.可重载子程序
5.子程序的调用
二.函数的定义及使用
1.函数定义
2.函数首
3.函数体
4.使用说明
三.重载函数
四.函数调用
五.过程的定义及使用
1.过程的定义
2.过程首
3.过程体
4.过程的调用
六.重载过程
七.过程的调用
1.顺序过程调用
2.并行过程调用
3.过程调用的步骤
八.程序包的定义和使用
1.程序包的内容
2.程序包的定义
子程序,是为了更有效地完成重复性的算法设计工作,利用顺序语句来定义和完成算法的的一种VHDL程序模块。
子程序不能直接读取信号值或者向信号赋值,而只能通过子程序调用与子程序的界面端口进行通信。
子程序有过程(PROCEDURE)和函数(FUNCTlON)两种类型。
二者的区别有:
(1)过程的调用可通过其界面获得多个返回值,而函数只能返回一个值;
(2)在函数入口中,所有参数都是输入参数,而过程有输入参数、输出参数和双向参数;
(3)过程一般被看做是一种语句结构,而函数通常是表达式的一部分;
(4)过程可以单独存在,而函数通常作为语句的一部分调用。
子程序的结构包括子程序首和子程序体。
子程序分成子程序首和子程序体的好处是,在一个大系统的开发过程中,子程序的界面,即子程序首是在公共程序包中定义的。
这样一来,一部分开发者可以开发子程序体,另一部分开发者可以使用对应的公共子程序。
这是因为,对于子程序体的修改,并不会改变子程序首的界面参数和出/入口方式的定义,从而对子程序体的改变不会改变调用子程序的源程序的结构。
VHDL子程序具有可重载性的特点,即允许有许多重名的子程序,但这些子程序的参数类型及返回值数据类型是不同的。
1.综合后的子程序将映射于目标芯片中的一个相应的电路模块,且每一次子程序的调用,都将在硬件结构中产生具有相同结构的不同电路模块。而普通软件中的N次子程序调用,将是子程序的N次重复执行。
为什么VHDL中的子程序调用和普通软件中的子程序调用的执行不一样呢?
普通软件中的N次子程序调用,由于其执行是顺序执行的,因此根据子程序的调用顺序,每调用1次,则对应的子程序将执行一次。
VHDL中的N次子程序调用,N个子程序的调用执行是同时执行的,因此需要N个对应子程序的硬件电路才能完成其功能。
2.在进程中允许对子程序进行调用。也可以在VHDL的结构体或程序包中的任何位置对子程序进行调用。
3.从硬件角度讲,一个子程序的调用类似于一个元件模块的例化,也就是说,VHDL综合器为子程序的每一次调用都生成一个电路逻辑模块。所不同的是,元件的例化将产生一个新的设计层次,而子程序调用只对应于当前层次的一部分。
函数体包括对数据类型、常数、变量等的局部说明以及用以完成规定算法或转换的顺序语句,并以关键词END FUNCTION 以及函数名结尾。
一旦函数被调用,就将执行这部分语句。
如果要将一个已编制好的函数并入程序包,函数首必须放在程序包的说明部分,而函数体需放在程序包的包体内。
如果只是在一个结构体中定义并调用函数,则仅需函数体即可。函数首的作用只是作为程序包的有关此函数的一个接口界面。
1.VHDL允许以相同的函数名定义函数,即重载函数(OVERLOADED FUNCTION)。
重载函数,要求函数中定义的操作数具有不同的数据类型,以便调用时用以分辨不同功能的同名函数。
2.VHDL中预定义的操作符,如“+”、“AND”、“MOD”、“>”等均可以被重载,以赋予新的数据类型操作功能。
也就是说,通过重新定义运算符的方式,允许被重载的运算符能够对新的数据类型进行操作,或者允许不同的数据类型之间用此运算符进行运算。
1.函数调用就是执行一个给定名字和参数的函数,并返还一个指定数据类型的值给函数名。函数调用的语句格式如下:
(1)括号中的实参表达式称为实参,它可以是一个具体的数值,也可以是一个标识符,是当前调用程序中函数形参的接受体。
在此调用格式中,形参名即为当前欲调用的过程中已说明的参数名,即与实参表达式相联系的形参名。
(2)被调用中的形参名与调用语句中的实参表达式的对应关系有位置关联法和名字关联法两种,位置关联可以省去形参名。
2.一个函数的调用有三个步骤:
首先将IN模式的实参值赋给欲调用的函数中与它们对应的形参;
然后执行这个函数;
最后将函数lN模式的形参值赋还给对应的函数名。
过程由过程首和过程体两部分组成,过程首不是必须的,过程体可以独立存在和使用。过程(PROCEDURE)的定义格式如下:
过程首由过程名和参数表组成。参数表用于对常数、变量和信号三类数据对象目标作出说明,并用关键词IN、OUT和INOUT定义这些参数的工作模式,即信息的流向。
注意:
一般地,可在参量表中定义三种流向模式,即IN、OUT和INOUT。若只定义了lN模式而未定义目标参量类型,则默认为常量;若只定义了INOUT或OUT,则默认目标参量类型是变量。
过程体是由顺序语句组成的,过程的调用即启动了对过程体的顺序语句的执行。
过程体中的说明部分只是局部的,其中的各种定义只能适用于过程体内部。
过程体的顺序语句部分可以包含任何顺序执行的语句,包括WAIT语句。但如果一个过程是在进程中调用的,且这个进程已列出了敏感参量表,则不能在此过程中使用WAIT语句。
过程与函数一样可以重复调用或嵌套式调用。综合器一般不支持含有WAIT语句的过程。
两个或两个以上有相同的过程名和互不相同的参数数量及数据类型的过程称为重载过程(OVERLOADED PROCEDURE)。对于重载过程,也是靠参量类型来辨别究竞调用哪一个过程的。
顺序过程调用就是在顺序语句的环境中执行一个给定名字和参数的过程。
调用过程的语句格式如下:
括号中的实参表达式称为实参,它可以是一个具体的数值,也可以是一个标识符,是当前调用程序中过程形参的接受体。
在此调用格式中,形参名即为当前欲调用的过程中已说明的参数名,即与实参表达式相联系的形参名。
被调用中的形参名与调用语句中的实参表达式的对应关系有位置关联法和名字关联法两种,位置关联可以省去形参名。
并行过程调用语句可以作为一个并行语句直接出现在结构体或块语句中。并行过程调用语句的功能等效于包含了同一个过程调用语句的进程。并行过程调用语句的语句调用格式与前面讲的顺序过程调用语句的是相同的,即过程名(关联参量名)。
首先将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;
然后执行这个过程;
最后将过程中IN和INOUT模式的形参值赋还给对应的实参。
程序包常用来封装属于多个设计单元分享的信息,一个程序包至少应包含如下四种内容中的一种。
3.程序包结构中,程序包体并非是必须的,对于没有子程序说明的程序包体可以省去。因此程序包首可以独立定义和使用。