小梅哥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。

核心逻辑:非阻塞赋值的“读取旧值”是拿上个周期的稳定值当计算原料,“更新新值”是给下个周期准备的,这正是硬件寄存器“边沿采样、延迟更新”的本质。

posted @ 2025-12-11 10:47  学不会傅里叶  阅读(295)  评论(0)    收藏  举报