Verilog 运算符简介

Posted 孤独的单刀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog 运算符简介相关的知识,希望对你有一定的参考价值。

这篇文章将讨论如何在 verilog 中使用不同的运算符,这些运算符提供了一种在 verilog 设计中处理数字数据的方法。这种处理方法非常简单----和简单的逻辑门一样,但是设计者可能还需要对数据执行复杂的逻辑或数学运算。

无论如何,verilog 提供了许多的运算符,使设计者能够对数据执行各种不同的计算或运算。

大多数情况下,设计者可以使用verilog的运算符来创建可以被综合的布尔表达式或逻辑电路,但是也有一些运算符写出的代码是无法被综合的。

所以接下来一起看看那些可以在 verilog 代码中使用的各类运算符吧。

1、Verilog 按位运算符(Bit Wise Operators

按位运算符可以将多个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;

2、Verilog 算术运算符(Arithmetic Operators

算术运算符可以用来实现基本的算术运算。这些运算符很眼熟,因为它们大多都是日常生活中常见的数学符号。

虽然大多数综合工具都可以综合加法(+)、减法(-)和乘法(*)运算符,但这通常会导致设计的逻辑性能欠佳。因此,必要时需要设计专门实现这些功能的逻辑电路,或者直接在 FPGA 中使用DSP模块来更有效地实现这些操作。

设计者应该尽量避免在代码中使用取模(%)、指数(**)或除法(/)运算符,因为大多数综合工具都无法直接将其综合成实际电路。

以下是verilog 中使用的算术运算符的完整列表。

运算符

描述

+

加法

-

减法

*

乘法

/

除法

%

取模

**

指数

下面的代码片段展示了如何使用这些运算符。

y = a + b;
y = a - b;
y = a * b;
y = a / b;
y = a % b;
y = a ** b;

3、Verilog 关系运算符(Relational Operators

关系运算符可以用来比较两个不同变量的值,比较的结果将返回逻辑值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

4、Verilog 逻辑运算符(Logical Operators

逻辑运算符和按位运算符类似。与关系运算符一样,这些表达式的结果是返回 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

5、Verilog 移位运算符(Shift Operators

除了已经看到的运算符之外,还有一些额外的运算符可以用于特定的逻辑函数。

其中最有用和最常用的一种是移位运算符,如下表所示。

运算符

描述

<<

逻辑左移

>>

逻辑右移

<<<

算术左移

>>>

算术右移

在设计数字电路时,经常会用到移位操作。因此,verilog 提供了一种简单技术来实现这些功能----移位运算符。

移位运算符需要两个参数。第一个参数是要移动的信号,第二个参数是要移动的位数。

使用逻辑移位运算符时,在将信号移位所需位数后,所有的空白位置都用 0 填充。相反,算术移位运算符保留移位信号的符号位。因此,它们只能与有符号(signed)类型一起使用。

算术左移和逻辑左移时,右边低位都会补 0。逻辑右移时,左边高位会补 0;而算术右移时,左边高位则会补充符号位,以保证数据缩小后值的正确性。

下面的代码片段展示了如何使用移位运算符。

a = a << 3;
b = b >> 8;
c = $signed(c) <<< 3;
d = d >>> 5;

6、Verilog 条件运算符(Conditional Operators

在Verilog中,条件运算符可以用来来根据条件语句将数据分配给不同的信号。

要使用条件运算符,需要在 ? 运算符之前写一个逻辑表达式,然后判断它是真还是假。根据表达式的真假将两个值中的某一个赋值给输出。

这个运算符可能很熟悉,因为它也用于其他编程语言,例如C和Java。

下面的代码片段展示了条件运算符的一般语法。

output = <condition> ? <true> : <false>

<condition> 中给出的表达式计算结果为时,输出将是 <true> 中给出的值;如果条件表达式的计算结果为,输出则是 <false> 中给出的值。

下面的代码片段展示了条件运算符的用法。

a = c > b ? c : b;    //如果c大于b,则a等于c;否则a等于b

7、Verilog 拼接运算符Concatenation Operators)和复制运算符(Replication Operators)运算符

这些运算符的输出都是向量,但这两个运算符的输入可以是单个位或向量。

这两个 verilog 运算符如下表所示。

运算符

描述

拼接运算符

复制运算符

使用 verilog 拼接运算符可以将两个或多个信号组合成一个向量。例如,有 2 个1bit的信号,设计者希望将它们组合起来用作多路选择器的地址。例如,下面的代码片段将产生一个值为 0011 的输出向量c

c = 2'b00, 2'11;

复制运算符可以将相同的值赋值给向量中的多个位。使用复制运算符时,必须指定想要复制的信号或值,以及想要复制它的次数。例如,下面的代码片段将产生一个值为 1111_1111 的输出向量c(1'b1被复制了8次)

c = 81'b1;

下面的 verilog 代码展示了如何共同使用拼接运算符和复制运算符。

c = a, 3a,b;    //c = a_ab_ab_ab;

  • 📣您有任何问题,都可以在评论区和我交流📃!

  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!


以上是关于Verilog 运算符简介的主要内容,如果未能解决你的问题,请参考以下文章

FPGA教程案例26在FPGA中通过verilog来实现小数的基础运算

FPGA学习----Verilog HDL语法

脚本推荐-verilog自动对齐

关于fpga的除法

[从零开始学习FPGA编程-23]:进阶篇 - 基本组合电路-门电路级组合逻辑运算(Verilog语言)

[从零开始学习FPGA编程-19]:快速入门篇 - 操作步骤4-1- Verilog 软件下载与开发环境的搭建- Altera Quartus II版本