运算符
运算符可分为以下几类:
(1) 算术运算符(+,-,*,/,%) (2) 赋值运算符(=,<=) (3) 关系运算符(>,<,>=,<=,==,!=) (4) 逻辑运算符(&&,||,!)
(5) 条件运算符(?:)
(6) 位运算符(~,|,^,&,^~) (7) 移位运算符(<<,>>) (8) 拼接运算符({ })
3.4.1 算术运算符
“+”(加法运算符),”-“(减法运算符),”*”(乘法运算符),”/”(除法运算符,如 7/3 =2),
“%”(取模运算符,也即求余数,如 7%3=1,余数为 1)
3.4.2 赋值运算符
“=”阻塞赋值,”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解
为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在 always
块语句执行完成后,才进行赋值。如下面的阻塞赋值:
代码如下: 激励文件如下
module top(din,a,b,c,clk); `timescale 1 ns/1 ns
ZYNQ MPSoC 开发平台 FPGA 教程
http://www.alinx.com.cn 69 / 219
input din;
input clk;
output reg a,b,c;
always @(posedge clk)
begin
a = din;
b = a;
c = b;
end
endmodule
module top_tb() ;
reg din ;
reg clk ;
wire a,b,c ;
initial
begin
din = 0 ;
clk = 0 ;
forever
begin
#({$random}%100)
din = ~din ;
end
end
always #10 clk = ~clk ;
top
t0(.din(din),.a(a),.b(b),.c(c),.clk(clk)) ;
endmodule
可以从仿真结果看到,在 clk 的上升沿,a 的值等于 din,并立即赋给 b,b 的值赋给 c。
如果改为非阻塞赋值,仿真结果如下,在 clk 上升沿,a 的值没有立即赋值给 b,b 为 a 原
来的值,同样,c 为 b 原来的值
可以从两者的 RTL 图看出明显不同:
阻塞赋值 RTL 图 非阻塞赋值 RTL 图
一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免仿真时出现竞争冒险现象;在组
合逻辑中使用阻塞赋值,执行赋值语句后立即改变;在 assign 语句中必须用阻塞赋值。
ZYNQ MPSoC 开发平台 FPGA 教程
http://www.alinx.com.cn 70 / 219
3.4.3 关系运算符
用于表示两个操作数之间的关系,如 a>b,a<b,多用于判断条件,例如:
If (a>=b) q <=1’b1 ;
else q <= 1’b0 ;
表示如果 a 的值大于等于 b 的值,则 q 的值为 1,否则 q 的值为 0
3.4.4 逻辑运算符
“&&”(两个操作数逻辑与),”||”(两个操作数逻辑或),”!”(单个操作数逻辑非)例如:
If (a>b && c <d) 表示条件为 a>b 并且 c<d; if (!a)表示条件为 a 的值不为 1,也就是 0。
3.4.5 条件运算符
“?:”为条件判断,类似于 if else,例如 assign a = (i>8)?1’b1:1’b0 ;判断 i 的值是否大于 8,如
果大于 8 则 a 的值为 1,否则为 0。
3.4.6 位运算符
“~”按位取反,”|”按位或,”^”按位异或,”&”按位与,”^”按位同或,除了”~”只需要一个
操作数外,其他几个都需要两个操作数,如 a&b,a|b。具体应用在后面的组合逻辑一节中有
讲解。
3.4.7 移位运算符
“<<”左移位运算符,”>>”右移位运算符,如 a<<1 表示,向左移 1 位,a>>2,向右移两位。
3.4.8 拼接运算符
“{ }”拼接运算符,将多个信号按位拼接,如{a, b},将 a 的低 4 位,b 的低 2 位拼接
成 6 位数据。另外,{n{a}}表示将 n 个 a拼接,{n{1’b0}}表示 n 位的 0 拼接。如{8{1’b0}}
表示为 8’b0000_0000.
页:
[1]