|
线型/寄存器型 |
|
线型 |
|
线型 |
|
线型 |
|
线型 线型/寄存器型 |
|
线型/寄存器型 |
|
线型 |
|
线型 |
|
线型 |
|
线型 线型/寄存器型 |
寄存器型数据与线型数据的区别在于:寄存器型数据保持最后一次的赋值,而线型数据需要有持续的驱动。
图3:不同数据类型驱动规则图
注:1)、只能由线型/寄存器型驱动线型
2)、使用assign语句被连续赋值的变量必须是线型的;在always或initial程序块
(行为模块)中用“=”赋值的变量必须是寄存器型的。
1. 4.2 按抽象数据类型分
分以下几种:
l integer整型
在算术运算中整型数据被视为二进制补码形式的有符号数,而寄存器型数据当作无符号数来处理,除此以外整型数据与32位寄存器型数据在实际意义上相同。
l time时间型
时间型变量与整型相类似,只是它是64位的无符号数。
l real实型
实型数据在机器码表示法中是浮点型数值。Verilog提供了将实型数据转换成位矢量以及相反过程的系统功能。
l event事件型
它是一种特殊的变量类型,不具有任何值,作用是使模块不同部分的事件在时间上同步。
l parameter参数型
参数型数据是被命名的常量,在仿真开始前对其赋值,在整个仿真过程中保持其置不变,数据的具体类型是由所赋的值来决定的。可以用它来定义变量的位宽以及延迟时间等。
1.5 运算符和表达式
Verilog语言参考了C语言中大多数算符的语义和句法,一个例外,Verilog中没有增1++和减1——运算符。
1.5.1 算术运算符
在Verilog HDL语言中,算术运算符又称为二进制运算符,共有下面几种:
1 +(加法运算符,或正值运算符,如a + b,+3);
2 –(减法运算符,或负值运算符,如a – 3,-3);
3 *(乘法运算符,如a*3);
4 /(除法运算符,如5/3);
5 %(模运算符,或称为求余运算符,要求%两侧均为整型数据,如7%3的值为1)。
在进行整数除法运算时,结果值要略去小数部分,只取整数部分;而进行取模运算时结果的符号位采用模运算式里第一个操作数的符号位。如:
模运算表达式 结 果 说 明
11%3 2 余数为2
12%3 0 整除,即余数为0,
-10%3 -1 结果取第一个操作数的符号位,所以余数为-1
注意:在进行算术运算操作时,如果某一操作数有不确定的值X,则运算结果也是不定值X。%算子回送第一个操作数除以第二个操作数的余数。
下面是算术运算符应用的一个例子:
module arithmetic(a, b, out1, out2, out3, out4, out5)
input [2:0] a, b;
output [3:0] out1;
output [4:0] out3;
output [2:0] out2, out4, out5;
reg [3:0] out1;
reg [4:0] out3;
reg [2:0] out2, out4, out5;
always @(a or b)
begin
out1 = a+b; //加运算
out2 = a-b; //减运算
out3 = a*b; //乘法运算
out4 = a/b; //除法运算
out5 = a%b; //取模运算
end
endmodule
1.5.2 符号运算符
这类运算符只是将正号(+)和负号(-)赋给单个的操作数,通常操作数在定义时是没有符号的,在这种情况下,默认它为正值。
使用符号运算符的例子如下:
module sign(a, b, out1, out2, out3);
input [2:0] a, b;
output [3:0] out1, out2, out3;
reg [3:0] out1, out2, out3;
always @ (a or b)
begin
out1 = +a / -b;
out2 = -a + -b;
out3 = a * -b;
end
endmodule
1.5.3 关系运算符
关系运算符共有以下4种:
1 > 大于;
2 >= 大于等于;
3 < 小于;
4 <= 小于等于;
5 = = 逻辑相等;
6 != 逻辑不相等;
7 = = = 实例相等;
8 != = 实例不相等。
在进行关系运算时,如果操作数之间的关系成立,返回值为1;反之,关系不成立,则返回值为0;若某一个操作数的值不定,则关系是模糊的,返回值是不定值X。
关系运算符的使用方法见下例:
module relation(a, b, out1, out2, out3, out4);
input [2:0] a, b;
output out1, out2, out3, out4;
reg out1, out2, out3, out4;
always @ (a or b)
begin
out1 = a < b; //小于运算
out2 = a <= b; //小于等于运算
out3 = a > b; //大于运算
if (a >= b); //大于等于运算
out4 = 1;
else
out4 = 0;
end
endmodule
在Verilog语言种有4种等式运算符,即5~8。前二者为逻辑等式运算符,后二者为实例等式运算符,它们对其操作数进行比较,然后置一位标志位。二者区别在于,若操作数含有一位X或Z,逻辑算子置位为X,而实例算子可以比较含有X和Z的操作数。举例如下:
module equequ;
initial begin
$display (″'bx == 'bx is %b″, 'bx == 'bx);
$display (″'bx === 'bx is %b″, 'bx === 'bx);
$display (″'bz != 'bx is %b″, 'bz != 'bx);
$display (″'bz !== 'bx is %b″, 'bz !== 'bx);
end
endmodule
模块equequ的执行会产生如下结果:
'bx == 'bx is x
'bx === 'bx is 1
'bz != 'bx is x
'bz !== 'bx is 1
所有的关系运算符有着相同的优先级别。关系运算符的优先级别低于算术运算符的优先级别。
1.5.4 逻辑运算符
在Verilog HDL语言中有3种逻辑运算符:
1 && 逻辑与
2 || 逻辑或
3 ! 逻辑非
“&&”和“||”是二目运算符,要求有两个操作数,如(a > b)&&(b > c),(a < b)||(b < c)。而“!”是单目运算符,只要求一个操作数,如!(a > b)。下表为逻辑运算的真值表,它表示当a和b的值为不同的组合时,各种逻辑运算所得到的结果。
|
a |
b |
!a |
!b |
a&&b |
A|| b |
|
1 |
1 |
0 |
0 |
1 |
1 |
|
1 |
0 |
0 |
1 |
0 |
1 |
|
0 |
1 |
1 |
0 |
责任编辑:5life
本文共有0条评论,现在显示最新的5条。
|