Verilog基本语法——运算符和表达式

来源:互联网 发布:2017流行网络用语 编辑:程序博客网 时间:2024/06/16 15:33

本文是Verilog学习笔记,参考于《Xilinx FPGA开发实用教程》和夏宇闻老师的Verilog经典教程系列

在Verilog HDL语言中运算符所带的操作数是不同的,按其所带操作数的个数运算符可分为三种:
1) 单目运算符(unary operator):带一个操作数,操作数放在运算符的右边。
2) 二目运算符(binary operator):带二个操作数,操作数放在运算符的两边。
3) 三目运算符(ternary operator):带三个操作,这三个操作数用三目运算符分隔开。

1.基本的算术运算符

在Verilog HDL语言中,算术运算符又称为二进制运算符,共有下面五种:
1. + ———— 加法运算符或正值运算符(s1+s2,+3)
2. - ———— 减法运算符或负值运算符(s1-s2,-5)
3. * ———— 乘法运算符(s1*3)
4. / ———— 除法运算符(s1/3)
5. % ———— 模运算符(s1%3)

2. 赋值运算符

赋值运算符分为连续赋值和过程赋值两种

2.1 连续赋值

连续赋值语句只能用来对线网型变量进行赋值,而不能对寄存器变量进行赋值

基本语法格式:

线网型变量类型[线网型变量位宽] 线网型变量名;assign #(延时量) 线网型变量名 = 赋值表达式// wire a;// assign a = 1'b1

2.2 过程赋值

过程赋值主要用于两种结构化模块(initial模块和always模块)中的赋值语句。在过程块中只能使用过程赋值语句(不能在过程块中出现连续赋值语句),同时过程赋值语句也只能用在过程赋值模块中

基本格式为:

<被赋值变量><赋值操作符><赋值表达式>// reg c;// always @(a)// begin//      c = 1'n0;// end

<赋值操作符>是”=”或”<=”(分别代表了阻塞赋值和非阻塞赋值)

过程赋值变量只能对寄存器类型变量(reg,integer,real和time)进行操作

2.3 关系运算符

关系运算符公有以下8种:
1. > ———— 大于;
2. >= ———— 大于等于;
3. < ———— 小于;
4. <= ———— 小于等于
5. == ———— 逻辑相等
6. != ————逻辑不相等
7. === ———— 实例相等
8. !== ———— 实例不相等
在进行关系运算符时,如果操作数之间的关系成立,返回值为1;关系不成立,则返回值为0;若一个操作数的值不定,则关系是模糊的,返回值是不定值X

2.4 逻辑运算符

在Verilog HDL语言中存在三种逻辑运算符:
1. && 逻辑与
2. || 逻辑或
3. ! 逻辑非
“&&”和”||”是双目运算符,它要求有两个操作数,”!”是单目运算符,只要求一个操作数

2.5 条件运算符

条件运算符格式:

y = x ? a : b

三个操作数,若x是True(1),返回a,否则返回b

2.6 位运算符

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

逻辑运算符:
1. ~ ———— 非
2. & ———— 与
3. | ———— 或
4. ^ ———— 异或
5. ^~ ———— 同或
6. ~& ———— 与非
7. ~| ———— 或非

2.7 移位运算符

移位运算符:
1. “<<” ———— 左移 (左移一位 相当于乘2)
2. “<<” ———— 右移 (右移一位 相当于除2)
格式:

s1<<NS1>>N

2.8 拼接运算符

拼接运算符可以将两个或更多信号的某位并接起来进行运算操作

格式:

{s1 , s2 , ... , sn}

将某些信号的某些位详细地列出来,中间用逗号隔开,最后一个大括号表示一个整体信号

2.9 一元约简运算符

一元约简运算符是单目运算符,其运算规则类似于位运算符中的与、或、非,但其运算过程不同

约简运算符对单个操作数进行运算,最后返回一位数,运算过程:将操作数第一位和第二位进行与或非运算;再将第二位和第三位进行与或非运算直到最后一位

reg [3:0]s1;reg s2;s2 = &s1; //&为一元约简运算符"与"
阅读全文
0 0