运算符、赋值语句和结构说明语句
一、逻辑运算符:
(1)&& 逻辑与;
(2)|| 逻辑或;
(3)!逻辑非。
“&&”和“||”是双目运算符,“!”是单目运算符
逻辑运算符是对整体进行运算的,注意与位运算符的区分;逻辑运算符中的&&和||低于关系运算符,!高于算术运算符,不过为了提高程序的可读性,建议使用括号。
二、关系运算符:
(1)<,小于;
(2)>,大于;
(3)<=,小于或等于;
(4)>=,大于或等于;
结果是假的,返回0;结果是真的,返回1;结果是模糊的,返回不定值
所有的关系运算符有着相同的优先级别。关系运算符的优先级别低于运算符的优先级别。
三、等式运算符:
(1)==(等于);
(2)!=(不等于);
(3)===(等于);
(4)!==(不等于)。
注意:求反号、双等号、三个等号之间不能有空格
“==”和“!=”又称逻辑等式运算符,当操作数中的某些位是不定值x或高阻值z时,结果为不定值x;而“===”和“!==”对不定值和高阻值也进行比较,另两个操作数必须完全一样,结果才为1,“===”和“!==”常用与case表达式的判别,所以又称为“case等式表达式”。
四、移位运算符:
(1)“<<”(左移位运算符);
(2)“>>”(右移位运算符)。
注意:左移运算符和右移运算符都用0来填补移出的空位,其中左移会使位得以拓展,右移位数不变。
五、位拼接运算符:
{信号1的某几位,信号2的某几位,...,...,信号n的某几位},中间用逗号隔开,最后用大括号括起来表示一个信号整体。
位拼接表达式中不允许出现没有指明位数的信号;位拼接可以用重复法来简化表达式:{4{w}}等同于{w,w,w,w};位拼接还可以用嵌套的方式来表达:{b,{3{a,b}}}等同于{b,a,b,a,b,a,b}。
六、缩减运算符:
&是单目运算符,如:
reg [3:0] B ;
reg C;
C = &B;
相当于:
C=((B[0]&B[1])&B[2])&B[3];
具体运算过程是这样的:第一步先将操作数的第1位与第2位进与、或、非运算;第二步将运算结果与第三位进行与、或、非运算,直至最后一位。
七、优先级别
八、阻塞赋值与非阻塞赋值:
(1)非阻塞赋值(“<=”)
1.在语句块中,上面语句所赋的变量值不能立即就为下面的语句所使用;
2.块结束后才能完成这次赋值操作,而所赋的值是上一次赋值得到的;
3.在编写可综合时序逻辑模块时,这是最常用的赋值方法。
例子:用非阻塞赋值法确定reg型信号b和c
always@( posedge clk)
begin
b<=a;
c<=b;
end
上述代码综合后得到如下电路图:
4.7.2阻塞赋值(“=”)
1.在赋值语句执行完后,块才结束;
2. b的值在赋值语句执行完后立刻就改变;
3.在时序逻辑中使用,可能会产生意想不到的结果。
例子:用阻塞赋值法确定reg型信号b和c
always@( posedge clk)
begin
b=a;
c=b;
end
上述代码综合后得到如下电路图:
b<=a;
always块内的下一条语句执行后,b并不等于a,而是保持原来的值,always块结束后,才进行赋值。
b=a;
这种赋值是马上执行的,也就是说执行下一条语句时,b已等于a。
九、块语句
(1)顺序块(begin_end):
1.块内语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
2.每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
3.直到下一条语句执行完,程序流程控制才跳出该语句块。
begin
语句1;
语句2;
语句n;
end
或
begin :块名
语句1;
语句2;
语句n;
end
begin 后可加块名,块内声明语句可以是参数声明语句,reg型变量声明语句,integer型声明语句和real型变量声明语句。
(2)并行块(fork_join):
1.块内语句是同时执行的,即程序流程一进入到该并行块,块内语句则开始同时并行地执行。
2.块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间。
3.延迟时间是用来给赋值语句提供执行时序的。
4.当按时间顺序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
格式如下:
fork
语句1;
语句2;
语句n;
end
或:
fork:块名
语句1;
语句2;
语句n;
end
fork后可加块名,语句块内的说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句和事件(event)说明语句。如果两条语句在同一时刻对同一个变量产生影响,那么将会引起隐含的竞争。
(3)块名:
1可以在块内定义局部变量,即只在块内使用的变量;
2可以通过块名被其他块调用,如disable语句。
3在Verilog语言中,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块并不影响存储在变量的值。
(4)起始时间和结束时间
对于顺序块,起始时间就是第一条语句开始被执行的时间,结束时间就是最后一条语句执行完的时间;对于并行快,起始时间对于块内所有的语句都是相同的,即程序流程控制进入该块的时间,其结束时间是按时间排序在最后的语句执行结束的时间。
当把一个块嵌入到另一个块时,块的起始时间和结束时间是很重要的。至于跟在块后面的语句只有在该块的结束时间到了才开始执行。也就是说,只有该块完全执行完后,跟在后面的语句才可以执行。