小梅哥FPGA(3)---详解阻塞赋值和非阻塞赋值
1、对比
2、记住一句话即可
3、RTL原理图进行对比
4、阻塞赋值和非阻塞区别的区别
- 简单叙述阻塞赋值和非阻塞赋值的区别:
(1)阻塞赋值(=)必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件没有对应的电路。(要点为串行,立即生效)
(2)非阻塞赋值(<=)在赋值开始时计算表达式右边的值,在本次仿真周期结束时才更新被赋值变量,即赋值不是立即生效的;非阻塞赋值允许块中其他语句同时执行。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件有对应的电路。(要点:并行,不是立即生效,同时执行)
阻塞赋值是指过程块中的语句是串行执行的(即一条语句执行完成才能执行下一条语句);非阻塞赋值是指过程块中的语句是并行执行的,即所有的语句都可以在赋值操作开始时刻同时计算RHS,在赋值操作结束时刻同时更新LHS。
5、非阻塞赋值更新的时候用的是旧值,更新新值
非阻塞赋值(<=)读取上个周期的稳定旧值计算新值,再把新值在当前周期触发后统一更新到变量上。
更精准的一句话总结:
非阻塞赋值在时钟边沿触发时,先读取「上个周期稳定的旧值」计算新值,新值不会立即更新,要等整个always块执行完毕、当前时间步结束后才替换旧值,最终让变量在下一个时钟周期呈现新值。
举个最直观的例子:
always @(posedge clk) begin
counter <= counter + 1; // 非阻塞赋值
end
- 时钟上升沿触发时,
counter读取的是「上个周期稳定的旧值(比如5)」; - 计算出新值6,但不会立刻把
counter改成6; - 等
always块执行完,当前时间步结束后,counter才从5更新为6; - 下一个时钟上升沿触发时,读取的就是这个新值6。
核心逻辑:非阻塞赋值的“读取旧值”是拿上个周期的稳定值当计算原料,“更新新值”是给下个周期准备的,这正是硬件寄存器“边沿采样、延迟更新”的本质。

浙公网安备 33010602011771号