手握残阳沥血剑,心有冷月 凝霜刀,绝顶一览 众山小, 无悔世间走一遭,过程本身就是一种快乐。
运算符概述
1.逻辑运算符(&&,||,!)
//"&&""||"优先级高于关系运算符,"!"优先级高于算数运算符
(a>b)&&(x>y) //可以改写为a>b&&x>y
(a==b)||(x==y) //可以改写为a==b||x==y
(!a)||(a>b) //可以改写为!a||a>b
为提高程序可读性,明确表达各运算符间的优先关系,建议使用括号
2.关系运算符(<,>,<=,>=)
//关系运算符优先级低于算数运算符
a<b-1 //可以改写为a<(b-1)
Q-(1<a) //!!!不可以改写为 q-1<a 若1>a,前者返回的就是Q值
3.等式运算符
==等于 | !== 不等于 |
===等于 | !===不等于 |
““==”与“===”区别
if(a==1'bx) $display("AisX") //不会执行,因为X代表不定值
if(a===1'bx) $display("AisX") //会执行,因为X代表不定值,===能比较X和Z值
4.移位运算符: "<<“左移位运算符 “>>”右移位运算符
使用方法:a<<n 或a>>n "n"代表移位的位数
例子如下
module shift;
reg[3:0]x,result;
initial;
begin
x=1; //假设初始值为0001
result=(x<<2); //向左移两位后 x变为 0100,赋值给result
end
endmodule
注意
移位后位数变量的位数会发生变化
4'b1000<<1 =5'b10000;
5.位拼接运算符(Concatation):"{}"
用法:{信号1的某几位,信号2的某几位,...信号n的某几位}
几种表达方式:
{a,b[3:0],c,3'b101} //
{4(w)} //重复法,等同于{w,w,w,w}
{a,3{a,b}} //嵌套法,等同于{a,a,b,a,b,a,b}
6.缩减运算符(reduction operator):
缩减运算是对单个的操作数进行&,||,!的递推运算,最终结果为1位的二进制数。
例如:
reg B[3:0];
reg D;
D=&B;//相当于 C=(((B[0]&B[1])&B[2])&B[3])
7.运算符的优先级
赋值语句和块语句
1.赋值语句:包含阻塞赋值和非阻塞赋值
非阻塞赋值(non-blocking):
b<=a;//非阻塞赋值方式
- 块语句 结束后才完成赋值操作。意味着同步性只在块语句结束后生效
- b的数值并不是立刻改变的
- 这是常用的赋值方法
阻塞赋值(blocking):
b=a;//阻塞型赋值
- 赋值语句执行完后块语句才会结束
- b的数值是赋值语句执行后立刻改变的
在沿触发的always块中使用,综合后会产生意想不到的结果。
2.块语句:begin——end (标识顺序执行) 和 fork——join (标识并行执行)
用法如下:
begin
语句1;
语句2;
语句n;
end
fork :块名
块内声明语句
语句1;
语句2;
join
3.块名:只需将名字加在关键字后面就行
4.起始时间和结束时间:
顺序块:第一条语句开始被执行的时间为起始时间, 最后一条语句被执行完的时间为结束时间。
并行块:所有语句起始时间相同,按时间排序结束在最后 的语句的结束的时间为结束时间。
今日学习至此,慢慢前进,加油!