这篇文章将讨论如何在 verilog 中使用不同的运算符,这些运算符提供了一种在 verilog 设计中处理数字数据的方法。这种处理方法非常简单----和简单的逻辑门一样,但是设计者可能还需要对数据执行复杂的逻辑或数学运算。
无论如何,verilog 提供了许多的运算符,使设计者能够对数据执行各种不同的计算或运算。
大多数情况下,设计者可以使用verilog的运算符来创建可以被综合的布尔表达式或逻辑电路,但是也有一些运算符写出的代码是无法被综合的。
所以接下来一起看看那些可以在 verilog 代码中使用的各类运算符吧。
按位运算符可以将多个1位输入组合成一个1位输出,verilog向量类型也使用按位运算符。最常用的方式是使用按位运算符在 verilog 中实现逻辑门。
以下是verilog 中使用的位运算符的完整列表。
运算符  | 描述  | 
~  | 按位非 NOT  | 
&  | 按位与 AND  | 
~&  | 按位与非 NAND  | 
|  | 按位或 OR  | 
~|  | 按位或非 NOR  | 
^  | 按位异或 XOR  | 
~^  | 按位同或 XNOR  | 
下面的 verilog 代码展示了如何使用这些运算符。
y = ~a;        
y = a & b;    
y = a | b;    
y = a ~| b;    
y = a ~& b;    
y = a ^ b;    
y = a ~| b;算术运算符可以用来实现基本的算术运算。这些运算符很眼熟,因为它们大多都是日常生活中常见的数学符号。
虽然大多数综合工具都可以综合加法(+)、减法(-)和乘法(*)运算符,但这通常会导致设计的逻辑性能欠佳。因此,必要时需要设计专门实现这些功能的逻辑电路,或者直接在 FPGA 中使用DSP模块来更有效地实现这些操作。
设计者应该尽量避免在代码中使用取模(%)、指数(**)或除法(/)运算符,因为大多数综合工具都无法直接将其综合成实际电路。
以下是verilog 中使用的算术运算符的完整列表。
运算符  | 描述  | 
+  | 加法  | 
-  | 减法  | 
*  | 乘法  | 
/  | 除法  | 
%  | 取模  | 
**  | 指数  | 
下面的代码片段展示了如何使用这些运算符。
y = a + b;
y = a - b;
y = a * b;
y = a / b;
y = a % b;
y = a ** b;关系运算符可以用来比较两个不同变量的值,比较的结果将返回逻辑值1或逻辑值0----分别代表 真(true) 和假(false) 。
这些运算符和其他编程语言(如C、Java)中的运算符很相似,其中的大部分在基础的数学表达式中也很常见。
以下是verilog 中使用的关系运算符的完整列表。
运算符  | 描述  | 
>  | 大于  | 
>=  | 大于或等于  | 
<  | 小于  | 
<=  | 小于或等于  | 
==  | 等于  | 
!=  | 不等于  | 
下面的代码片段展示了如何使用这些运算符。
y = a > b;      //如果a大于b则y值为1,否则y值为0
y = a >= b;     //如果a大于或等于b则y值为1,否则y值为0
y = a < b;      //如果a小于b则y值为1,否则y值为0
y = a <= b;     //如果a小于或等于b则y值为1,否则y值为0
y = a == b;     //如果a等于b则y值为1,否则y值为0
y = a != b;     //如果a不等于b则y值为1,否则y值为0逻辑运算符和按位运算符类似。与关系运算符一样,这些表达式的结果是返回 1(真)或 0(假)。
同样,这些运算符类似于 C 或 Java 等语言中使用的运算符。在 verilog 中使用的逻辑运算符只有3个。
以下是verilog 中使用的逻辑运算符的完整列表。
运算符  | 描述  | 
&&  | 逻辑与  | 
||  | 逻辑或  | 
!  | 逻辑非  | 
下面的代码片段展示了如何使用这些运算符。注意在使用这些运算符时要使用括号来分隔表达式中的不同元素。
y = (a == b) && (c == d);    //如果a等于b且c等于d,则y值为1;否则y值为0
y = (a == b) || (a == c);    //如果a等于b且a等于c,则y值为1;否则y值为0
y = !(a == b);               //如果a等于b则y值为0;否则y值为1除了已经看到的运算符之外,还有一些额外的运算符可以用于特定的逻辑函数。
其中最有用和最常用的一种是移位运算符,如下表所示。
运算符  | 描述  | 
<<  | 逻辑左移  | 
>>  | 逻辑右移  | 
<<<  | 算术左移  | 
>>>  | 算术右移  | 
在设计数字电路时,经常会用到移位操作。因此,verilog 提供了一种简单技术来实现这些功能----移位运算符。
移位运算符需要两个参数。第一个参数是要移动的信号,第二个参数是要移动的位数。
使用逻辑移位运算符时,在将信号移位所需位数后,所有的空白位置都用 0 填充。相反,算术移位运算符则保留移位信号的符号位。因此,它们只能与有符号(signed)类型一起使用。
算术左移和逻辑左移时,右边低位都会补 0。逻辑右移时,左边高位会补 0;而算术右移时,左边高位则会补充符号位,以保证数据缩小后值的正确性。
下面的代码片段展示了如何使用移位运算符。
a = a << 3;
b = b >> 8;
c = $signed(c) <<< 3;
d = d >>> 5;在Verilog中,条件运算符可以用来来根据条件语句将数据分配给不同的信号。
要使用条件运算符,需要在 ? 运算符之前写一个逻辑表达式,然后判断它是真还是假。根据表达式的真假将两个值中的某一个赋值给输出。
这个运算符可能很熟悉,因为它也用于其他编程语言,例如C和Java。
下面的代码片段展示了条件运算符的一般语法。
output =  ?  :   当 
下面的代码片段展示了条件运算符的用法。
a = c > b ? c : b;    //如果c大于b,则a等于c;否则a等于b这些运算符的输出都是向量,但这两个运算符的输入可以是单个位或向量。
这两个 verilog 运算符如下表所示。
运算符  | 描述  | 
{ }  | 拼接运算符  | 
{{ }}  | 复制运算符  | 
使用 verilog 拼接运算符可以将两个或多个信号组合成一个向量。例如,有 2 个1bit的信号,设计者希望将它们组合起来用作多路选择器的地址。例如,下面的代码片段将产生一个值为 0011 的输出向量c。
c ={ 2'b00, 2'11};复制运算符可以将相同的值赋值给向量中的多个位。使用复制运算符时,必须指定想要复制的信号或值,以及想要复制它的次数。例如,下面的代码片段将产生一个值为 1111_1111 的输出向量c(1'b1被复制了8次)。
c = {8{1'b1}};下面的 verilog 代码展示了如何共同使用拼接运算符和复制运算符。
c = {a, {3{a,b}}};    //c = a_ab_ab_ab;📣您有任何问题,都可以在评论区和我交流📃!
📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!