首页 百科知识 4.4操作符

4.4操作符

时间:2022-10-15 百科知识 版权反馈
【摘要】:在VHDL中共有4类操作符,可以分别进行逻辑运算、关系运算、算术运算和并置运算。操作符是有优先级的,例如,逻辑运算符“NOT”在所有操作符中其优先级最高。如表4.3所示列出了所有操作符的优先次序。在数据位较长的情况下,若要使用算术运算符进行电路设计,特别是使用乘法运算符“*”,应特别慎重。这样的比较结果显然是不符合实际情况的。

4.4 操作符

在VHDL中共有4类操作符,可以分别进行逻辑运算(LOGICAL)、关系运算(RELATIONAL)、算术运算(ARITHMETIC)和并置运算(CONCATENATION)。操作符是有优先级的,例如,逻辑运算符“NOT”在所有操作符中其优先级最高。如表4.3所示列出了所有操作符的优先次序。

表4.3 操作符的优先级

img108

1.逻辑运算符

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

NOT——取反;

AND——与;

OR——或;

NAND——与非;

NOR——或非;

XOR——异或。

运算符的左边和右边,以及代入的信号的数据类型必须相同。在预定义包STANDARD中,这6种逻辑运算符只可以对“BIT”型的逻辑数据进行逻辑运算。

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

img109

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

img110

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

2.算术运算符

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

+——加;

-——减;

*——乘;

/——除;

MOD——求模;

REM——取余;

+——正;(一元运算)

-——负;(一元运算)

**——指数;

ABS——取绝对值。

被操作符所操作的对象是操作数,需要注意的是,操作数的类型应该和操作符所要求的类型相一致。在STANDARD中,算术运算符只对整数有效,但一些厂家设计的程序包的扩展,算术运算符可操作的操作数类型也增加了。例如,“+”和“−”在STANDARD中仅可对整数进行操作,但经过IEEE库中的程序包STD_LOGIC_UNSIGNED对“+”、“−”的再次定义,使得“+”、“−”运算对STD_LOGIC及STD_LOGIC_VECTOR类型也可以操作。

程序包STD_LOGIC_UNSIGNED对“+”、“−”运算的定义,以下截取了一部分:

img111

在程序包的支持下,设计者可以方便地对STD_LOGIC类型的数据进行运算,如例4-11所示。

【例4-11】STD_LOGIC数据类型的使用

img112

在例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位的位矢量进行比较:

img113

上例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定义如下:

img114

若c(5)='0',c(4)='0',c(3)=b(1),c(2)=b(0),c(1)='1',c(0)=a,则有

img115

若c(5)~c(0)均为“0”,还可写为:

img116

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈