verilog教程(4)——运算符和表达式-Anlogic-安路社区-FPGA CPLD-ChipDebug

verilog教程(4)——运算符和表达式

表达式

表达式由运算符和操作数构成,其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。操作数可以是任意的数据类型,只是某些特定的语法结构要求使用特定类型的操作数。操作数可以为常数,整数,实数,线网,寄存器,时间,位选,域选,存储器及函数调用等。

运算符

算术运算符

在常用的算术运算符主要是 :

  • 加法(二元运算符):“+”;
  • 减法 (二元运算符): “”;
  • 乘法(二元运算符):“*”;

关系运算符

关系运算符有:

  • ?>(大于)
  • ?<(小于)
  • ?>=(不小于)
  • ?<=(不大于)
  • = = (逻辑相等)
  • ! = (逻辑不等)

关系操作符的结果为真( 1 )或假( 0 )。如果操作数中有一位为X 或Z ,那么结果为X 。

逻辑运算符

逻辑运算符有:

  • && (逻辑与)
  • || (逻辑或)
  • ! (逻辑非)

用法为:(表达式1) 逻辑运算符 (表达式2) ….
这些运算符在逻辑值0(假) 或1(真) 上操作。逻辑运算的结果为0 或1 。

位逻辑运算符

按位运算符有:

  • ~(一元非):(相当于非门运算)
  • &(二元与):(相当于与门运算)
  • |(二元或): (相当于或门运算)
  • ^(二元异或):(相当于异或门运算)
  • ~ ^, ^ ~(二元异或非即同或) :(相当于同或门运算)

这些操作符在输入操作数的对应位上按位操作。 例如:

A = 'b0110;
B = 'b0100;
那么:
A | B 结果为0 1 1 0
A & B
结果为0 1 0 0
如果操作数长度不相等, 长度较小的操作数在最左侧添0 补位。例如 'b0110 ^ 'b10000 'b00110 ^ 'b10000 结果相同都为‘ b 1 0 11 0

下图给出了位运算符的真值表。

&(与) 0 1 x   |(或) 0 1 x
0 0 0 0   0 0 1 x
1 0 1 x   1 1 1 1
x 0 x x   x x 1 x
^(异或) 0 1 x   ~^(同或) 0 1 x
0 0 1 x   0 1 0 x
1 1 0 x   1 0 1 x
x x x x   x x x x

条件运算符

条件操作符根据条件表达式的值选择表达式,形式如下:
cond_expr ? expr1 : expr2
如果cond_expr 为真(即值为1 ),选择expr1 ;如果cond_expr 为假(值为0 ),选择expr2 。如果cond_expr x z ,结果将是按以下逻辑expr1 expr2 按位操作的值: 0 0 0 1 1 1 ,其余情况为x
如下所示
:
wire [2:0] Student = Marks > 18 ? Grade_A : Grade_C;
计算表达式Marks > 18; 如果真, Grade_A 赋值为Student; 如果Marks < =18, Grade_C 赋值为Student

连接运算符

连接操作是将小表达式合并形成大表达式的操作。形式如下:
{expr1, expr2, . . .exprN}
实例如下所示:

wire [7:0] Dbus;
assign Dbus [7:4] = {Dbus [0], Dbus [1], Dbus[2], Dbus[ 3 ] } ;
/ /以反转的顺序将低端4 位赋给高端4 位。
assign Dbus = {Dbus [3:0], Dbus [ 7 : 4 ] } ;
/ /高4 位与低4 位交换。

由于非定长常数的长度未知, 不允许连接非定长常数。例如, 下列式子非法:
{Dbus,5} / /不允许连接操作非定长常数。

运算符的优先级

不同运算符之间,优先级是不同的。下表列出了操作符优先级从高至低的排列顺序。当没有圆括号时,Verilog 会根据操作符优先级对表达式进行计算。为了避免由操作符优先级导致的计算混乱,在不确定优先级时,建议用圆括号将表达式区分开来。

运算符 运算符号 优先级
单目运算 + – ! ~ 最高
乘、除、取模 * / %  
加减 + –  
移位 <<  >>  
关系 <  <=  >  >=  
等价 ==  !=  ===  !===  
归约 & ~&  
  ^ ~^  
  | ~|  
逻辑 &&  
  ||  
条件 ?: 最低
请登录后发表评论

    没有回复内容