文档介绍:子程序和程序包子程序和程序包 VHDL 向设计者提供了自定义子程序的机制,设计者可以在结构体说明部分或者进程语句的说明部分中定义子程序,并可以在该结构体或者该进程中调用这个子程序;如果某个子程序是一个共享资源,即在某个设计实体的多个结构体中都要调用该子程序,或者在不同的设计实体中要调用该子程序,则应当在程序包中定义该子程序。设计者在设计实体中说明的数据类型、对象、子程序、元件和属性等等,对于其它实体而言,是不可见的。 VHDL 向设计者提供了将共享资源封装在程序包中单独编译,并对多个设计实体均可见的机制。 子程序子程序子程序可以被看作是设计者自己定义的运算符。 VHDL 提供了两种子程序: 过程和函数。过程和函数的区别在于: 过程被过程调用语句启动执行, 并可以返回多个结果;而函数则被表达式所调用,并且只返回一个值。 过程当设计者自己定义了某种“运算”,而这种“运算”将产生多个返回值或者说多个结果时,通常使用过程来描述这种“运算”。其优点是:当设计者需要进行这种已定义好的“运算”时,使用过程调用语句,并用实际参数代替定义“运算”时说明的形式参数,即可以完成这种“运算”;而且可以在一个结构体甚至一个进程语句中,多次调用这种“运算”。定义一种“运算”实际上就是说明一个过程。过程说明的一般格式为: PROCEDURE 过程名(形参表) IS { 说明语句}BEGIN { 顺序语句}END [ PROCEDURE ][ 过程名]; 在过程说明的形参表中,形式参数可以是常量、信号和变量,对象模式可以是 IN、OUT 或INOUT ;如果没有说明形式参数的对象模式, 则其缺省模式为 IN;如果没有说明形式参数的数据类型,则其缺省模式为: IN模式的形式参数是常量类型, OUT 和INOUT 模式的形式参数是变量类型; 对于并行过程调用语句所调用的过程,由于 VHDL ’87的限制,形式参数不能为变量。在说明语句部分,可以说明过程内部的数据类型和局部对象。过程中的语句都是顺序语句; 如果顺序过程调用语句所在的进程没有敏感信号表,则在所调用的过程中,可以包含 WAIT 语句,否则不能包含 WAIT 语句。不正确地使用过程,可能导致出现意想不到的结果。例如:由于全局信号可以在结构体中的任何地方被访问,在某个过程中对一个全局信号赋值是合法的。但如果该信号没有作为一个实参传递给过程的话,那么,就有可能出现副作用:一个意想不到的多余返回值。因此,不推荐这种使用过程的方法。 函数当设计者自己定义的“运算”只有一个返回值时,虽然可以用过程描述这个“运算”,但更为常见的是用函数来描述该“运算”。函数说明的一般格式为: FUNCTION 函数名(形参表) RETURN 返回值类型 IS { 说明语句}BEGIN { 顺序语句}END [ FUNCTION ][ 函数名]; 在函数说明的形参表中,形式参数可以是常量和模式为 IN的信号;如果没有说明形式参数的数据类型,则其缺省模式为常量类型。在说明语句部分,可以说明函数内部的数据类型和局部对象。函数中的语句都是顺序语句;在函数内部,不容许包含 WAIT 语句和信号赋值语句。在程序包 Std_Logic_1164 中,定义了下面几种数据类型之间的类型转换函数(参阅附录 C: “STD_LOGIC_1164 程序包”): ①Std_Logic 与Bit 类型之间; ②Std_Logic_Vector 与Bit_vector 类型之间; ③Std_ULogic 与Bit 类型之间; ④Std_ULogic_Vector 与Bit_vector 类型之间。例如,程序包 Std_Logic_1164 中的函数 FUNCTION To_BitVector (s:Std_Logic_Vector ;xmap :Bit:= ‘0’) RETURN Bit_Vector ; 就定义了一个将 Std_Logic_Vector 类型转换为 Bit_Vector 类型的类型转换函数。