FPGA开发——verilog的运算符以及相关优先级的介绍

一、简介

        在我们学习任何一门编程语言时,不可避免的都会遇见运算符和相关的运算优先级的问题,只有掌握了各个运算符的优先级关系我们才能进行更好的代码编写。在前面的时候因为我没有遇到因为优先级而导致的工程结果错误,所以没有过多注意,但是遇到之后才发现运算符优先级的重要性。

二、verilog运算符

在verilog语言中也有属于它的特殊运算符,今天我们就来看看verilog的运算符。

1、基本运算符

在Verilog 语言中,也是和其他编程语言一样拥有下面这几个基本操作符,同时也是我们最为常见的运算符:
(1)+ (加法运算符)
示例:assign Y = A + B ; //将A与B相加,计算结果赋值给Y
(2)- (减法运算符)
示例:assign Y = A - B; //将A的值减去B的值,计算结果赋值给Y
(3)* (乘法运算符)
示例:assign Y = A * B;//将A与B乘积的结果赋值给Y
(4)/ (除法运算符)
示例:assign Y = A / B; //将变量A的值除以B结果赋值给Y
(5)% (模运算符, 或者称为求余运算符,要求%两侧均为整型数据,例如7%3的值为1)

2、位运算符

(1)取反运算符 ~ :
assign Y = ~A;//若A = 4’b1011; 则Y的值为4’b0100, 即按照每个bit位进行取反操作。

(2)按位与操作 & :
assign Y = A & B; //若A的值为4’b1011, B的值为4’b0101, 则Y的值为4’b0001

(3)按位或操作 | :
assign Y = A | B; //若A的值为4’b1011, B的值为4’b0101, 则Y的值为4’b1111

(4)按位异或 ^ :
assign Y = A ^ B;//若A的值为4’b1011, B的值为4’b0101, 则Y的值为4’b1110

(5)按位同或 ^~
assign Y = A ^~ B;//若A的值为4’b1011, B的值为4’b0101, 则Y的值为4’b0001

在这里我们需要特别注意的是~、&、|和 !、&&、||操作的相关区别,因为在编程当中我们会经常使用这些操作 

3、关系运算符

          Verilog 语法中表示关系运算的有:大于(>); 小于(<); 大于等于(>=); 小于等于(<=)这里的用法和C语言等的使用方法一样,这里就不展开说了。

4、逻辑运算符

Verilog 语法中的逻辑运算符也是我们所熟知的 逻辑与(&&), 逻辑或(||), 逻辑非(!)三个基本运算符。在这里我们针对的是表达式的逻辑正确与否进行编写的,最终的结果只能是0或1,而在位运算符中的~、&、|是根据数据的每个位进行操作的,只有当操作的变量为1位时,两种运算符的结果相等。掌握这6个运算符的区别可以使我们编程的结果更加准确。

5、移位运算符

        移位运算符是二元运算符,左移符号为“<<”,右移符号为“>>”,将运算符左边的操作数左移或右移指定的位数,用 0 来补充空闲位。如果右边操作数的值为 x 或 z,则移位结果为未知数 x。在应用以为运算符的时候一定要注意它的这个特性,那就是空闲位用 0来填充,也就是说,一个二进制数不管原数值是多少,只要一直移位,最终全部会变为0。

        用最好理解的方法来说,将一个数据进行左右移操作就是将这个数据进行乘除操作,左移1位就是×2,右移1位就是÷2。和乘除运算实现的结果一样,唯一的区别就是和乘除运算符的优先级不一样。乘除运算符优先级高于移位运算符。

6、拼接运算符

         在Verilog HDL语言中有1个特殊的运算符:位拼接运算符 {} ,用这个运算符可以把两个或者是多个信号的某些位拼接起来进行运算操作。 使用拼接运算符我们不仅可以实现拼接的功能,还能实现赋值、循环移位等功能,这些都是我们在代码编写时常用的功能

实例:

拼接功能:Y={a[1],b[2],c[0]};这里假设Y是三位变量,a[1]=1,b[2]=0,c[0]=3;那么最后Y的结果就是103。

复制功能:Y={8'{1'b1}};这里假设Y是8位变量,就是将1'b1的值复制到Y的8个位置。

循环移位功能:Y={a[6:0],a[7]};这里假设Y是8位变量,最终实现的结果就是将a的值进行一个向左的循环移位功能,可以用于LED流水灯,数码管位选等操作。

7、条件运算符

        如果在条件语句中,只执行单个的赋值语句时,用条件表达式会更方便。条件运算符
为“ ? : ”,它是一个三元运算符,即有三个参与运算的量。
由条件运算符组成的条件表达式的一般形式为:表达式 1 ? 表达式 2 : 表达式 3
执行过程是:当表达式 1 为真,则表达式 2 作为条件表达式的值,否则以表达式 3 作
为条件表达式的值。例如:当 a = 6, b = 7,条件表达式(a > b) ? a : b 的结果为 7。

三、运算符优先级

        我们在进行多种类型运算符混合使用时,一定要特别注意运算符之间的优先级关系,不然就算编译不会报错,我们的结果也会出错。像使用乘除、加减和移位运算符时,我们要将移位运算符使用一个括号,不然就会先执行乘除,再执行加减,最后才执行移位,这样就会造成结果出错。

例如:a=b/2+c>>1,这就是一个错误的写法,我们想要计算的是b/2+c/2的值,但是因为移位运算符优先级没有加法的高,所以会先计算b/2+c,最后将这个结果进行移位计算,所得到的结果就会出错。正确的写法应该是a=b/2+(c>>1)

 

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子小芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值