在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位位矢量的输出。
文章出处登录后可见!