当前位置:   article > 正文

fpga系列 HDL: 06 (过程赋值的)非阻塞赋值实现变量交换

fpga系列 HDL: 06 (过程赋值的)非阻塞赋值实现变量交换

(过程赋值的)阻塞赋值实现变量交换

module swap_example (
    input clk,
    input rst,
    input [7:0] a,
    input [7:0] b,
    output reg [7:0] a_out,
    output reg [7:0] b_out
);
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            a_out <= 8'b0;
            b_out <= 8'b10101010;;
        end else begin
            reg [7:0] temp;
            temp = a_out;
            a_out = b_out;
            b_out = temp;
        end
    end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(过程赋值的)非阻塞赋值实现变量交换

  • 非阻塞赋值的特性保证了在同一个时钟周期内,即使多个非阻塞赋值之间存在依赖关系,它们也会同时更新,从而避免竞争条件和不确定行为:

  • 并行执行:非阻塞赋值不会立即更新目标寄存器的值,而是将要更新的值排队,直到所有的右值都计算完毕后,才会在同一个时钟周期内同时更新目标寄存器的值。

  • 同步更新:所有的非阻塞赋值将在同一个时钟边沿同时生效。

  • 实现代码如下:

module swap_example (
    input clk,
    input rst,
    input [7:0] a,
    input [7:0] b,
    output reg [7:0] a_out,
    output reg [7:0] b_out
);
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            a_out <= 8'b0;
            b_out <= 8'b10101010;;
        end else begin
            a_out <= b_out;
            b_out <= a_out;
        end
    end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 首先,a_out <= b_out;b_out 的当前值排队给 a_out
  • 其次,b_out <= a_out;a_out 的当前值排队给 b_out

因为这两条赋值语句使用的是非阻塞赋值 (<=),它们不会立即执行,而是会在同一个时钟边沿的结束时同时生效。因此,这个过程实际上是:

  1. 读取当前周期的 b_out 的值,并计划在本周期结束时赋值给 a_out
  2. 读取当前周期的 a_out 的值,并计划在本周期结束时赋值给 b_out

由于非阻塞赋值的同步性,这两个赋值不会互相干扰,最终在一个时钟周期内实现 a_outb_out 的交换。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/672613
推荐阅读
相关标签
  

闽ICP备14008679号