文章目录
1: 非阻塞赋值语句
非阻塞(Non_Blocking)赋值方式块结束后才完成赋值操作。b的值并不是立刻就改变的。对于时序电路中的always块的reg信号,一般采用非阻塞语句赋值。这种方式的赋值并不是马上执行的,也就是说always块内的下一条语句执行后,b并不等于a,而是保持原来的值。always块结束后,才进行赋值。
如:
module no_blocking (clk, a ,c
);
input clk;
input wire a;
output reg c;
reg b;
always @(posedge clk) begin
b <= a;
c <= b;
end
endmodule
得到的电路如下所示:
在clk信号的上升沿到来时,b就等于a,c就等于b,只不过赋值是在always块结束后执行的,c应为原来b的值。
2:阻塞赋值语句
赋值语句执行完后,块才结束,b的值在赋值语句执行完后立刻就改变的。如下为阻塞赋值写法:
module blocking (clk, a ,c
);
input clk;
input wire a;
output reg c;
reg b;
always @(posedge clk) begin
b = a;
c = b;
end
endmodule
生成的电路图就变为如下所示,可以看出,c和b的值在时钟上升沿到来时均取为a。
总结
- 在时序电路中最好使用非阻塞赋值,组合电路中使用阻塞赋值
- 在实际使用中,一些时序中要注意非阻塞赋值的特点,如想拉高某一使能信号后开始读写数据,此时使用非阻塞赋值时应该注意赋值不是立即发生。