赞
踩
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
。因为这两条赋值语句使用的是非阻塞赋值 (<=
),它们不会立即执行,而是会在同一个时钟边沿的结束时同时生效。因此,这个过程实际上是:
b_out
的值,并计划在本周期结束时赋值给 a_out
。a_out
的值,并计划在本周期结束时赋值给 b_out
。由于非阻塞赋值的同步性,这两个赋值不会互相干扰,最终在一个时钟周期内实现 a_out
和 b_out
的交换。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。