阻塞赋值
符号“=”用于阻塞的赋值,凡是在组合逻辑(如在assign语句中)赋值的需要使用用阻塞赋值。阻塞赋值“=”在begin和end之间的语句是顺序执行,属于串行语句。always语句的敏感变量如果不含有时钟,即always(*)这样描述,那么也属于组合逻辑,需要使用阻塞赋值。
一个组合逻辑的例子:
always @(*) begin
case (led_ctrl_cnt)
2'd0 : led = 4'b0001;
2'd1 : led = 4'b0010;
2'd2 : led = 4'b0100;
2'd3 : led = 4'b1000;
default : led = 4'b0000;
endcase
end
非阻塞赋值
“<=”用于阻塞赋值,凡是在时序逻辑(如在always语句中)赋值的需要使用非阻塞赋值,非阻塞赋值“<=”在begin和end之间的语句是并行执行,属于并行执行语句。这个是和C语言最大的一个差异点,要逐步理解并行执行的概念。时序逻辑指的是带有时钟的always块逻辑,只有always带有时钟,那么这个逻辑才能是时序逻辑。
一个时序逻辑的例子:
//用于产生0.5秒使能信号的计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
if (sys_rst_n == 1'b0)
counter <= 1'b0;
else if (counter_en)
counter <= 1'b0;
else
counter <= counter + 1'b1;
end