在VHDL语言中共有4类操作符,可以分别进行逻辑运算(logical)、关系运算(relational)、算术运算(Arithmetic)和并置运算(Concatenation)。需要注意的是,被操作符所操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,例如逻辑运算符NOT,在所有操作符中其优先级最高。下表所有操作符的优先次序。

操作符的优先级

一、逻辑运算符

在VHDL语言中逻辑运算符共有6种,它们分别是:

NOT——取反;

AND——与;

OR——或;

NAND——与非;

NOR——或非;

XOR——异或。

这6种逻辑运算符可以对“STD_LOGIC”和“STD_LOGIC_VECTOR”等数据进行逻辑运算。必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。

当一个语句中存在两个以上的逻辑表达式时,在C语言中运算有自左至右的优先级顺序的规定,而在VHDL语言中,左右没有优先级差别。例如,在下例中,如去掉式中的括号,那么从语法上来说是错误的:

x <=(a AND b)OR(NOT c AND d);

当然,如果一个逻辑表达式中只有“AND”,“OR”,“XOR”运算符,那么改变运算顺序将不会导致逻辑的改变。此时,括号是可以省略的。例如:

a <= b AND c AND d AND e;

a <= b OR c OR d OR e;

在所有逻辑运算符中NOT的优先级最高。

二、 算术运算符

VHDL语言有10种算术运算符,它们分别是:

十——加;

— ——减;

* ——乘;

/——除;

MOD ——求模;

REM ——取余;

+——正;(一元运算)

— ——负;(一元运算)

** ——指数;

ABS ——取绝对值。

在算术运算中,对于一元运算的操作数(正、负)可以为任何数值类型(整数、实数、物理量)。加法和减法的操作数也和上面一样,具有相同的数据类型,而且参加加、减运算的操作数的类型也必须相同。乘除法的操作数可以同为整数和实数。物理量可以被整数或实数相乘或相除,其结果仍为一个物理量。物理量除以同一类型的物理量即可得到一个整数量。求模和取余的操作数必须是同一整数类型数据。一个指数的运算符的左操作数可以是任意整数或实数,而右操作数应为一整数。

若对“STD_LOGIC_VECTOR”进行“+”(加)、“一”(减)运算时,两边的操作数和代入的变量位长如不同,则会产生语法错误。另外,“*”运算符两边的位长相加后的值和要代入的变量的位长不相同时,同样也会出现语法错误。

三、关系运算符

VHDL语言中有6种关系运算符,它们分别是:

=——等于;

/=———不等于;

<——小于;

<=———小于等于;

>——大于;

>=——大于等于。

在关系运算符的左右两边是运算操作数,不同的关系运算符对两边的操作数的数据类型有不同的要求。其中等号“=”和不等号“/=”可以适用所有类型的数据。其它关系运算符则可使用于整数(INTEGER)和实数(REAL)、位(STD_LOGIC)等校举类型以及位矢量(STD_LOGIC_VECTOR)等数组类型的关系运算。在进行关系运算时,左右两边的操作数的数据类型必须相同,但是位长度不一定相同。当然也有例外的情况,在利用关系运算符对位矢量数据进行比较时,比较过程是从最左边的位开始。自左至右按位进行比较的。在位长不同的情况下,只能按自左至右的比较结果作为关系运算的结果。例如,对3位和4位的位矢量进行比较:

SIGNAL a:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL b:STD_LOGIC_VECTOR(2 DOWNTO 0);

a <= “1010”; --10

b <= “111”; --7

IF( a > b) THEN

ELSE

上例a的值为10,而b的值为7,a应该比b大。但是,由于位矢量是从左至右按位比较的,当比较到次高位时,a的次高位为“0”而b的次高位为“1”,故比较结果b比a大。这样的比较结果显然是不符合实际情况的。

为了能使位矢量进行关系运算,在包集合“STD_LOGIC_UNSIGNED”中对“STD_LOGIC_VECTOR”关系运算重新作了定义,使其可以正确的进行关系运算。注意在用时必须首先说明调用该包集合。

四、并置运算符

并置运算符“&”用于位的连接。例如,将4个位用并置运算符”&”连接起来就可以构成一个具有4位长度的位矢量。两个4位的位矢量用并置运算符“&”连接起来就可以构成8位长度的位矢量。

如en是b(0)~b(3)的允许输出信号,

tmp_b <= b AND (en & en & en & en)

这个语句表示b的4位位矢量由en进行选择得到一个4位位矢量的输出。