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

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

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

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

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

  • 实现代码如下:

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
  • 首先,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 的交换。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值