阻塞赋值 : “=” 可用于时序逻辑和组合逻辑,组合逻辑必须使用组合逻辑赋值
非阻塞赋值 : “<=”只能使用在时序逻辑中
在时序逻辑中,使用阻塞赋值和非阻塞赋值差了一个时钟周期
在时序逻辑中,通常使用非阻塞赋值,在一个变量赋值时,不能同时出现两种赋值方式
程序_仿真举例 :
程序为用一个计数器来控制,四个led中产生一个高电平的移位
1.阻塞
module yiwei(
input wire sclk ,
input wire rst_n ,
output reg [3:0] led
);
//阻塞
reg [5:0] cnt ;
always@(posedge sclk or negedge rst_n)begin
if(!rst_n)
cnt = 0 ;
else if(cnt==49)
cnt = 0 ;
else
cnt = cnt+1'b1 ;
end
always@(posedge sclk or negedge rst_n)begin
if(!rst_n)
led = 4'b0001 ;
else if(cnt==49)
led = {led[2:0],led[3]} ;
end
endmodule
2.非阻塞
module yiwei(
input wire sclk ,
input wire rst_n ,
output reg [3:0] led
);
//非阻塞
reg [5:0] cnt ;
always@(posedge sclk or negedge rst_n)begin
if(!rst_n)
cnt <= 0 ;
else if(cnt==49)
cnt <= 0 ;
else
cnt <= cnt+1'b1 ;
end
always@(posedge sclk or negedge rst_n)begin
if(!rst_n)
led <= 4'b0001 ;
else if(cnt==49)
led <= {led[2:0],led[3]} ;
end
endmodule
由两个仿真图比较可知,阻塞为当前触发,非阻塞为前一个值触发