在语言编程中都会使用变量,变量可以容纳数据,一般称为数据对象(Data Objects)。在 VHDL中也有数据对象(Data Objects),它类似于一种容器,用于 接受不同数据类型的赋值。VHDL的数据对象有三类 ,即变量(VARIABLE) ,常量(CONSTANT)和信号(SIGNAL)。 变量(VARIABLE) ,常量(CONSTANT)与一般计算语言的数据对象类似, 但信号这一数据对象比较特殊 ,它具有更多的硬件特征是VHDL中最有特色的语言要素之一。
1. 数据对象的硬件特征
由于VHDL是硬件描述语言,那么VHDL的数据对象有哪些硬件特征呢?从硬件电路系统来看变量和信号相当于组合电路中元件之间的连线,信号的值即连线之间的逻辑值,如图1所示。常量相当于电路中的恒定电平如GND 或VCC等,一般用数字表示。

图1
那么信号与变量有什么区别呢?从行为仿真和VHDL语句功能上看, 信号与变量具有比较明显的区别,其差异主要表现如下:
- 接受和保持信号的方式不同。例如信号可以设置传输延迟量,而变量则不能。
- 信息保持与转递的范围不同。 变量只能作为局部的信息载体,如只能在所定义的进程中有效,而信号则可在整个构造体内使用,起到传递信息的作用。如在结构体中各进程间传递信息,变量的设置有时只是一种过渡 ,最后的信息传输和界面间的通信都靠信号来完成。
2. 变量(VARIABLE)
在 VHDL 语法规则中, 变量是一个局部量, 只能在进程和子程序中使用。 变量不能将信息带出对它作出定义的进程或子程序。 变量的赋值是一种理想化的数据传输,是立即发生或实现, 不存在任何延时的行为。 VHDL 语言规则不支持变量附加延时语句, 变量常用在实现某种算法的赋值语句中。其它语言也有类似行为特性,如verilog语言中阻塞与非阻塞赋值语句等。其中阻塞赋值语句相当与VHDL语言的变量赋值,非阻塞赋值相当于这里的信号(signal)赋值。变量声明和变量使用探讨如下。
-
变量声明
变量声明的格式如下:
VARIABLE 变量名 数据类型 := 初始值;
例如变量定义语句
VARIABLE a : INTEGER ; –声明a 为整数型变量,没有初始值。
VARIABLE b, c : INTEGER := 2 ; –声明 b 和c 整数型变量 ,初始值为2 。
VARIABLE d : STD_LOGIC ; –声明d 为STD_LOGIC变量
需要注意的是变量作为局部量 ,其适用范围仅限于定义了该变量的进程或子程序中, 仿真过程中惟一的例外是共享变量。 变量的值将随变量赋值语句的运算而改变, 变量的初始值可以是一个与变量具有相同数据类型的常数值, 也可以是一个全局静态表达式, 这个表达式的数据类型必须与所赋值的变量一致。 初始值不是必需的, 综合时将略去所有的初始值。
-
变量赋值语句
- 变量赋值语句的语法格式如下:
目标变量名 := 表达式;
变量赋值符号是 := , 赋值语句右方的表达式或常数必须与变量具有相同数据类型;表达式可以是一个运算表达式 ,也可以是一个数值。 通过赋值操作, 新的变量值的获得是立刻发生的。 变量赋值语句左边的变量,可以是单值变量,也可以是一个变量的集合, 即数组型变量。
- 变量赋值语句的语法格式如下:
VARIABLE x, y : REAL ;
VARIABLE a ,b : BIT_VECTOR( 0 TO 7 ) ;
x := 100.0 ; — 实数赋值 x 是实数变量
y := 1.5+x ; — 运算表达式赋值 y 也是实数变量
a := b ;
a := “1010101” ; — 位矢量赋值 a 的数据类型是位矢量
a (3 TO 6) := ( ‘1’ ,’1′ ,’0′, ‘1’) ; — 段赋值 注意赋值格式
a (0 TO 5) := b (2 TO 7) ;
a (7) := ‘0’ ; — 位赋值
其中 a 和 b 是以变量数组的方式定义的, 它们的位宽都为8, 即分别含有8个单变量 a (0), a (1),… a (7)和 b (0), b (1),… b (7)。 赋值方式也可以是多种多样的。
-
- 共享变量
VHDL 93 支持共享变量 共享变量具有某种全局性特征。它可以在进程和子程序之外定义,也可以在结构体, 块或程序包中定义。 以下是共享变量定义示例,
SHARED VARIABLE share_var : BOOLEAN := true;
共享变量也具有变量的特性,即赋值立即生效。但由于共享变量的建模特性过于复杂,因此一般的综合器都不支持共享变量的使用。因此在变量的结果需要在多个进程或子程序间传递时,一般将变量赋值给信号,再由信号传递到别的进程或子程序中去。