Verilog语法之四:运算符

文章转自微信公众号,花蚂蚁

原文链接:Verilog语法之四:运算符


Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类:

  • 算术运算符(+,-,×,/,%)

  • 赋值运算符(=,<=)

  • 关系运算符(>,<,>=,<=)

  • 逻辑运算符(&&,||,!)

  • 条件运算符(?:)

  • 位运算符(~,|,^,&,^~)

  • 移位运算符(<<,>>)

  • 拼接运算符({ })

  • 其它

在Verilog HDL语言中运算符所带的操作数是不同的,按其所带操作数的个数运算符可分为三种:

  • 单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。

  • 二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。

  • 三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符分隔开。

见下例:

下面对常用的几种运算符进行介绍。

1.算术运算符

在Verilog HDL语言中,算术运算符又称为二进制运算符,共有下面几种:

  • + (加法运算符,或正值运算符,如 rega+regb,+3)

  • (减法运算符,或负值运算符,如 rega-3,-3)

  • × (乘法运算符,如rega*3)

  • / (除法运算符,如5/3)

  • % (模运算符,或称为求余运算符,要求%两侧均为整型数据。如7%3的值为1)

在进行整数除法运算时,结果值要略去小数部分,只取整数部分。而进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位。见下例。

2.位运算符

Verilog HDL作为一种硬件描述语言,是针对硬件电路而言的。在硬件电路中信号有四种状态值1,0,x,z.在电路中信号进行与或非时,反映在Verilog HDL中则是相应的操作数的位运算。

Verilog HDL提供了以下五种位运算符:

  • ~     //取反

  • &    //按位与

  •  |     //按位或

  • ^    //按位异或

  •  ^~  //按位同或(异或非)

说明:

  • 位运算符中除了~是单目运算符以外,均为二目运算符,即要求运算符两侧各有一个操作数.

  • 位运算符中的二目运算符要求对两个操作数的相应位进行运算操作。

下面对各运算符分别进行介绍:

2.1"取反"运算符~

~是一个单目运算符,用来对一个操作数进行按位取反运算。

其运算规则见下表:

举例说明:

2.2"按位与"运算符&

按位与运算就是将两个操作数的相应位进行与运算,

其运算规则见下表:

2.3"按位或"运算符|

按位或运算就是将两个操作数的相应位进行或运算。

其运算规则见下表:

2.4 "按位异或"运算符^(也称之为XOR运算符)

按位异或运算就是将两个操作数的相应位进行异或运算。

其运算规则见下表:

2.5 "按位同或"运算符^~

按位同或运算就是将两个操作数的相应位先进行异或运算再进行非运算.

其运算规则见下表:

不同长度的数据进行位运算

两个长度不同的数据进行位运算时,系统会自动的将两者按右端对齐.位数少的操作数会在相应的高位用0填满,以使两个操作数按位进行操作.

3.逻辑运算符

在Verilog HDL语言中存在三种逻辑运算符:

  • &&    逻辑与

  • ||       逻辑或

  • !        逻辑非

"&&"和"||"是二目运算符,它要求有两个操作数,如(a>b)&&(b>c),(a<b)||(b<c)。

"!"是单目运算符,只要求一个操作数,如!(a>b)。

下表为逻辑运算的真值表。它表示当a和b的值为不同的组合时,各种逻辑运算所得到的值。

逻辑运算符中"&&"和"||"的优先级别低于关系运算符,"!" 高于算术运算符。见下例:

  • (a>b)&&(x>y) 可写成: a>b && x>y

  • (a==b)||(x==y) 可写成:a==b || x==y

  • (!a)||(a>b) 可写成: !a || a>b

为了提高程序的可读性,明确表达各运算符间的优先关系,建议使用括号.

4.关系运算符

关系运算符共有以下四种:

  • a < b a小于b

  • a > b a大于b

  • a <= b a小于或等于b

  • a >= b a大于或等于b

在进行关系运算时,如果声明的关系是假的(flase),则返回值是0,如果声明的关系是真的(true),则返回值是1,如果某个操作数的值不定,则关系是模糊的,返回值是不定值。

所有的关系运算符有着相同的优先级别。关系运算符的优先级别低于算术运算符的优先级别。见下例:

从上面的例子可以看出这两种不同运算符的优先级别。当表达式size-(1<a)进行运算时,关系表达式先被运算,然后返回结果值0或1被size减去。而当表达式 size-1<a 进行运算时,size先被减去1,然后再同a相比。

5.等式运算符

在Verilog HDL语言中存在四种等式运算符:

  • == (等于)

  • != (不等于)

  • === (等于)

  • !== (不等于)

这四个运算符都是二目运算符,它要求有两个操作数。"=="和"!="又称为逻辑等式运算符。其结果由两个操作数的值决定。由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。

而"==="和"!=="运算符则不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数必需完全一致,其结果才是1,否则为0。"==="和"!=="运算符常用于case表达式的判别,所以又称为"case等式运算符"。这四个等式运算符的优先级别是相同的。下面画出==与===的真值表,帮助理解两者间的区别。

下面举一个例子说明“==”和“===”的区别。

例:

6.移位运算符

在Verilog HDL中有两种移位运算符:

  • << (左移位运算符)

  • >>(右移位运算符)。

其使用方法如下:

a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。下面举例说明:

从上面的例子可以看出,start在移过两位以后,用0来填补空出的位。

进行移位运算时应注意移位前后变量的位数,下面将给出一例。

例:

7.位拼接运算符

在Verilog HDL语言有一个特殊的运算符:位拼接运算符{}。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:

即把某些信号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。见下例:

也可以写成为

在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。

位拼接还可以用重复法来简化表达式。见下例:

位拼接还可以用嵌套的方式来表达。见下例:

用于表示重复的表达式如上例中的4和3,必须是常数表达式。

8.缩减运算符

缩减运算符是单目运算符,也有与或非运算。

其与或非运算规则类似于位运算符的与或非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与或非运算,操作数是几位数则运算结果也是几位数。

而缩减运算则不同,缩减运算是对单个操作数进行或与非递推运算,最后的运算结果是一位的二进制数。

缩减运算的具体运算过程是这样的:第一步先将操作数的第一位与第二位进行或与非运算,第二步将运算结果与第三位进行或与非运算,依次类推,直至最后一位。

例如:

相当于:

由于缩减运算的与、或、非运算规则类似于位运算符与、或、非运算规则,这里不再详细讲述,请参照位运算符的运算规则介绍。

9.优先级别

下面对各种运算符的优先级别关系作一总结。见下表:  

优先级不用记,原因:

1.极少在一条语句里用多个操作符,如果用了,说明你的逻辑写的不好

2.如果有,加括号更保险

 10.学习例程

对语法知识有了初步的了解之后,下一步就应该“模仿”了。

我给小白们准备了一份礼物,下面是我精心整理的n多verilog代码。帮助小白们由浅至深的“模仿”。在模仿的过程中能够进一步的巩固之前了解的语法知识。

这些Verilog例程基本涵盖了以后可能遇到的所有用法,参考这些代码,可以做出你想要的任何设计。
当你想要用Verilog编写一段代码实现某个功能时,如果你能够想到参考哪段代码能够实现你的设计,那么恭喜你,你已经入门了!!!

所有示例代码,点击链接获取。

01-锁存器、触发器、寄存器、移位寄存器等

【免费】VerilogHDL示例代码之01-锁存器、触发器、寄存器、移位寄存器等资源-CSDN文库

02-逻辑门、三态门、mux等

【免费】VerilogHDL示例代码之02-逻辑门、三态门、mux等资源-CSDN文库

03-各种计数器

【免费】VerilogHDL示例代码之03-各种计数器资源-CSDN文库

04-各类加法器

【免费】VerilogHDL示例代码之04-各类加法器资源-CSDN文库

05-乘法器

【免费】VerilogHDL示例代码之05-乘法器资源-CSDN文库

06-异步复位同步释放

【免费】VerilogHDL示例代码之06-异步复位同步释放资源-CSDN文库

07-分频

【免费】VerilogHDL示例代码之07-分频资源-CSDN文库

08-语法语句

【免费】VerilogHDL示例代码之08-语法语句资源-CSDN文库

09-串并转换

【免费】VerilogHDL示例代码之09-串并转换资源-CSDN文库

10-状态机设计

【免费】VerilogHDL示例代码之10-状态机设计资源-CSDN文库

11-编解码应用

【免费】VerilogHDL示例代码之11-编解码应用资源-CSDN文库

12-仿真语法举例

【免费】VerilogHDL示例代码之12-仿真语法举例资源-CSDN文库

13-进阶设计

【免费】VerilogHDL示例代码之13-进阶设计资源-CSDN文库


我将Verilog的语法进行了总结,写了13篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。详情点击                     

小白如何快速入门Verilog?-CSDN博客

Verilog语法之〇:Verilog HDL简介/Verilog语法介绍-CSDN博客

Verilog语法之一:简单的Verilog HDL模块-CSDN博客

Verilog语法之二:常量-CSDN博客

Verilog语法之三:变量-CSDN博客

。。。。。。

更多课程,敬请期待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值