(过程赋值的)阻塞赋值实现变量交换
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 的交换。
595

被折叠的 条评论
为什么被折叠?



