4.4 操作符
在VHDL中共有4类操作符,可以分别进行逻辑运算(LOGICAL)、关系运算(RELATIONAL)、算术运算(ARITHMETIC)和并置运算(CONCATENATION)。操作符是有优先级的,例如,逻辑运算符“NOT”在所有操作符中其优先级最高。如表4.3所示列出了所有操作符的优先次序。
表4.3 操作符的优先级
1.逻辑运算符
在VHDL中逻辑运算符共有6种,它们分别是:
NOT——取反;
AND——与;
OR——或;
NAND——与非;
NOR——或非;
XOR——异或。
运算符的左边和右边,以及代入的信号的数据类型必须相同。在预定义包STANDARD中,这6种逻辑运算符只可以对“BIT”型的逻辑数据进行逻辑运算。
当一个语句中存在两个以上的逻辑表达式时,在C语言中运算有自左至右的优先级顺序的规定,而在VHDL中,左右没有优先级差别。例如,在下例中,如去掉式中的括号,那么从语法上来说是错误的:
当然也有例外,如果一个逻辑表达式中只有“AND”,“OR”,“XOR”运算符,那么改变运算顺序将不会导致逻辑的变化。此时,括号是可以省略的。例如:
在所有逻辑运算符中NOT的优先级最高。
2.算术运算符
VHDL有10种算术运算符,它们分别是:
+——加;
-——减;
*——乘;
/——除;
MOD——求模;
REM——取余;
+——正;(一元运算)
-——负;(一元运算)
**——指数;
ABS——取绝对值。
被操作符所操作的对象是操作数,需要注意的是,操作数的类型应该和操作符所要求的类型相一致。在STANDARD中,算术运算符只对整数有效,但一些厂家设计的程序包的扩展,算术运算符可操作的操作数类型也增加了。例如,“+”和“−”在STANDARD中仅可对整数进行操作,但经过IEEE库中的程序包STD_LOGIC_UNSIGNED对“+”、“−”的再次定义,使得“+”、“−”运算对STD_LOGIC及STD_LOGIC_VECTOR类型也可以操作。
程序包STD_LOGIC_UNSIGNED对“+”、“−”运算的定义,以下截取了一部分:
在程序包的支持下,设计者可以方便地对STD_LOGIC类型的数据进行运算,如例4-11所示。
【例4-11】STD_LOGIC数据类型的使用
在例4-11中,只有将std_logic_unsigned设为参考程序包,才可以实现“a+b”的运算,否则程序在编译过程中,编译器会提示错误:“Operator"+"is not defined for such operands”。
若对“STD_LOGIC_VECTOR”进行“+”(加)、“−”(减)运算时,两边的操作数和所代入变量的位长如不同,则会产生语法错误。另外,“*”运算符两边的位长相加后的值和要代入的数据对象的位长不相同时,同样也会出现语法错误。
实际上,能够真正综合逻辑电路的算术运算符只有“+”、“−”、“*”。在数据位较长的情况下,若要使用算术运算符进行电路设计,特别是使用乘法运算符“*”,应特别慎重。因为对于16位的乘法运算,综合时逻辑门电路会超过2000个门。对于算术运算符“/”、“MOD”、“REM”,分母的操作数为2乘方的常数时,逻辑电路综合是可能的。
3.关系运算符
VHDL中有6种关系运算符,它们分别是:
=——等于;
/=——不等于;
<——小于;
<=——小于等于;
>——大于;
>=——大于等于。
在关系运算符的左右两边是运算操作数,不同的关系运算符对两边的操作数的数据类型有不同的要求。在进行关系运算时,左右两边的操作数的数据类型必须相同,但是位长却不一定相同。
在利用关系运算符对位矢量数据进行比较时,比较过程是从最左边的位开始,自左至右按位进行比较的。在数据位长不同的情况下,只能按自左至右的比较结果作为关系的结果。例如,对3位和4位的位矢量进行比较:
上例a的值为10,而b的值为7,a应该比b大。但是,由于位矢量是从左至右按位比较的,当比较到次高位时,a的次高位为“0”而b的次高位为“1”,故比较结果b比a大。这样的比较结果显然是不符合实际情况的。
为了能使位矢量进行关系运算,在程序包“STD_LOGIC_UNSIGNED”中对“STD_LOGIC_VECTOR”关系运算重新作了定义,使其可以正确地进行关系运算。注意在使用时必须首先说明调用该程序包。位矢量还可以和整数进行关系运算。
4.并置运算符
并置运算符“&”或“,”用于位的连接。例如,将4个位用并置运算符“&”连接起来就可以构成一个具有4位长度的位矢量。两个4位的位矢量用并置运算符“&”连接起来就可以构成8位长度的位矢量。
有三个信号a、b、c定义如下:
若c(5)='0',c(4)='0',c(3)=b(1),c(2)=b(0),c(1)='1',c(0)=a,则有
若c(5)~c(0)均为“0”,还可写为:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。