文章目录
4.1 逻辑运算符
- 逻辑与
&&
- 逻辑或
||
- 逻辑非
!
注:无论是逻辑运算、逻辑比较还是逻辑等式等逻辑操作一般发生在条件判断语句中,其输出只有1或0,即成立(真)或不成立(假)。
4.2 关系运算符
- 小于
<
- 大于
>
- 小于或等于
<=
- 大于或等于
>=
在进行关系运算时,如果声明的关系是假的,则返回值为0,反之返回1;如果某个操作数的值不定,则关系是模糊的,返回值是不定值。
4.3 等式运算符
- 等于
==
- 不等于
!=
- 等于
==
- 不等于
!==
4.4 移位运算符
左移运算符<<
和右移运算符>>
都用0
来填补移出的空位。
4’b1001<<1 = 5’b10010;
//左移1位后用0填补低位1<<6 = 32’b1000000;
//左移6位后用000000填补低位4’b1001>>1 = 4’b0100;
//右移1位后,低1位丢失,高1位用0填补4’b1001>>4 = 4’b0000;
//右移4位后,低4位丢失,高4位用0填补
存疑:为什么左移和右移运算符的运算规则不同?
4.5 位拼接运算符
使用方法:{信号1的某几位,信号2的某几位,…,…,信号n的某几位}
{a,b[3:0],w,3'b101} ≡ {a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
{4{w}} ≡ {w,w,w,w}
{b,{3{a,b}}} ≡ {b,a,b,a,b,a,b}
4.6 缩减运算符
其与或非的运算规则类似于位运算符的与或非规则,但运算过程不同。缩减运算是对单个操作数进行与或非递推运算,最后的运算结果是1位的二进制数。
reg[3:0]B;
reg C;
C=&B;
C=(B[0]&B[1]&B[2]&B[3]);
4.7 优先级别
4.8 关键词
是事先定义好的确认符,用来组织语言结构。用小写字母定义,使用时要注意书写。变量的定义不要与关键词冲突。
4.9 赋值语句和块语句
赋值语句
非阻塞(Non_Blocking)赋值<=
(1)在块语句中,上面语句所赋的变量值不能立即就为下面的语句所用;
(2)块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的;
(3)在编写可综合的时序逻辑模块时,这是最常用的赋值方法。到目前为止,"always"模块内的reg信号都是采用非阻塞赋值方式。
always@(posedge clk)
begin
b<=a;
c<=b;//赋值是在"always"块结束后执行的,C为原来b的值
end
![](https://i-blog.csdnimg.cn/blog_migrate/bd7cace76850fd38a7f1c1fdeb992292.png)
非阻塞赋值方式的“always”电路图
阻塞(blocking)赋值方式=
(1)赋值语句执行完后,块才结束;
(2)b的值在赋值语句执行完后立刻改变;
(3)在时序逻辑中使用时,可能会产生意想不到的结果。
块语句
顺序块和并行块
顺序块begin_end | 并行块fork_join | |
---|---|---|
块内语句执行顺序 | 顺序执行 | 同时并行执行 |
延迟时间 | 相对于前一条语句的执行时间而言 | 相对于程序流程控制进入到块内的仿真时间(用来给赋值语句提供时序) |
程序流程控制跳出该语句块的时刻 | 最后一条语句执行完 | 按时间时序排序在最后的语句执行完后/一个disable语句执行时 |
例:用顺序块和延迟控制组合产生一个时序波形↓
parameter d=50;
reg[7:0] r;
begin //由一系列延迟产生的波形
#d r='h35;
#d r='hE2;
#d r='h00;
#d r='hF7;
#d -> end_ware;//触发事件end_ware
end
用并行块和延迟控制组合产生一个时序波形↓
begin //由一系列延迟产生的波形
#50 r='h35;
#100 r='hE2;
#150 r='h00;
#200 r='hF7;
#250 -> end_ware;//触发事件end_ware
end
块名
将名字加在begin或fork后面即可,原因如下:
(1)可以在块内定义局部变量;
(2)可以允许块被其他语句调用,如disable
语句。
(3)在verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入和跳出块并不影响存储在变量的值。
因此块名就提供了一个在任何仿真时刻确认变量值的方法。
起始时间和结束时间
顺序块begin_end | 并行块fork_join | |
---|---|---|
起始时间 | 第一条语句开始执行的时间 | 最后一条语句执行完的时间 |
结束时间 | 程序流程控制进入块的时间 | 时间排序在最后的语句执行完的时间 |
在块的嵌入时,块的起始时间和结束时间是很重要的。只有在该块完全执行完后,后面的语句才会执行。