1. 非阻塞赋值 (<=): 用于时序逻辑块,如 always @(posedge clk)。非阻塞赋值表示同时发生的赋值,不会等待右侧表达式的计算完成。
module SequentialLogic (
input wire clk,
input wire reset,
input wire data,
output reg q
);
// 非阻塞赋值
always @(posedge clk or negedge reset)
begin
if (!reset)
q <= 1'b0; // 复位时输出为0
else
q <= data; // 在时钟上升沿接受输入数据
end
endmodule
2. 阻塞赋值 (=): 用于组合逻辑块,如 always @*。阻塞赋值表示按照语句的顺序逐个执行,右侧表达式的计算完成后才会进行下一个赋值。
module CombinationalLogic (
input wire a,
input wire b,
output wire result
);
// 阻塞赋值
always @*
result = a & b;
endmodule
在阻塞赋值中,下一个语句的执行会等待当前语句的赋值完成。这样可以确保按照代码的书写顺序逐个执行。
在时序逻辑中,通常使用非阻塞赋值以确保时钟触发时的并行操作。在组合逻辑中,阻塞赋值用于描述同一时刻的顺序执行逻辑。在实际设计中,根据逻辑的需求和时序关系选择适当的赋值方式非常重要。
转载请注明出处:http://www.zyzy.cn/article/detail/11025/Verilog