子程序声明的格式如下:
    procedure 过程名(形式参数表);
    function 函数名(形式参数表) return 返回值类型;
  函数只能用以计算并返回数值,而不能用以改变与函数形参相关的对象的值,因此,函数的参量只能是方式为in的信号或常量;而过程则可以改变与过程形参相关的对象的值,因而过程的参量可以为in,out,inout方式。在子程序形式参数中,如果未指定参量的输入输出方式,则默认方式为in;如果未指定类型,则规定in方式的参量是常量类型,out方式和inout方式的参量为变量类型。VHDL容许定义无参量的函数与过程,即在子程序形式声明中缺省形式参数表。函数与过程的另一个区别是:函数必须定义返回值的类型,而过程不需要。
  过程体与函数体定义它们所实现的操作,由一系列顺序语句组成。内部声明部分提供了这些语句所需要的内部的相关事项的声明。因为函数必须有返回值,因而必须含有返回语句,后面跟一个得到返回值的表达式。而过程可以包含无表达式的返回语句,也可以缺省,默认最后一个语句后面有一个返回语句。无论过程还是函数,返回语句可有多个,分别表示各个分支的出口。
  过程体的格式:
    procedure 过程名(形式参数表) is
      内部声明;
    begin
      顺序语句; -- (可包含有语句:return; )
    end 过程名;
  函数体的格式:
    function 函数名(形式参数表) return 返回值类型 is
      内部声明;
    begin
      顺序语句; -- (包含有语句: return 表达式;)
    end 函数名;
  尽管一个子程序可以调用其他的子程序,但它却不能引用元件,因而子程序不能定义连接子元件的信号。
  下面举一个简单的子程序体的例子:
    function Min(X,Y:Integer) return Integer is
    begin
      if X<Y then return X;
      else return Y;
      end if
    end Min;

  
  
· 子程序声明和子程序体可以在任何声明部分声明。
  · 形式参数表类似于端口声明的关联表, 但参数前可有对象类(signal, variableconstant)的声明。
  · 过程形式参数表中可有in, out, inout方式;但函数只有in方式。默认为in方式。
  · in方式的参数可为信号、常量,默认为常量。
  · out, inout方式的参数可为信号、变量,默认为变量。
  · 子程序可以无参数:
     procedure P;
     function F return Bit;
  · 过程调用通过并行调用语句或顺序调用语句实现,函数调用则是表达式的一部分。
  · 子程序的运行过程与进程的运行过程不同。进程运行不会停止,只是处在激活与挂起两种状态,挂起时信号、变量值保持不变,因而进程内部定义的变量再激活时仍保持挂起时的值,初值只在开始运行时一次性赋值。而子程序则在每一次被调用时赋初值,与先前是否被调用过无关。子程序返回时,其运行即结束,将输出值或返回值传送给调用者之后不再保存任何信息。
  · 子程序体中的语句被认为是进程内的一部分,并行过程调用认为是含有一个类似的顺序过程调用语句的进程。参看后面关于并行过程调用语句的内容。因此,与进程的情况类似,子程序体中只能有顺序语句,子程序内部声明中不能有信号声明。子程序中出现的信号必须通过参数传递进来,进程中出现的信号则只能是在外部声明,包括结构体(architecture)或块语句(block)和程序包(package)等。