您的问题中的示例有一个小错误,应该是:
always @ (posedge clk or negedge reset) begin
if (~reset) begin //<-- Reset when rest low
//Initialize the signals
end
else begin
//do something
end
end
当negedge reset
信号变低时将触发,因此您希望重置条件匹配。这是一个低电平有效复位。对于您想要的高电平有效复位(Reset when reset == 1
):
always @ (posedge clk or posedge reset) begin //<--Posedge trigger reset
if (reset) begin //<-- Reset when rest high
//Initialize the signals
end
else begin
//do something
end
end
重置条件不必为 0。它可以是任何东西,但它必须是已知的静态值。即NOTnext_state
等a+b
。它连接触发器的复位引脚,这就是我们保持名称复位的原因。
ASIC 中首选低电平有效复位,因为没有电源时它处于复位状态。当芯片启动时,您通常会在时钟的位置同步释放复位。通常至少有 2 个姿势。这避免了少量时间的复位故障。
因为您希望在芯片上电时应用低电平有效复位,所以当上电时一切都处于已知状态,我们使用异步复位。使用同步重置,您不知道第一个状态是什么。需要清除数据的状态机和过滤器经常使用同步复位。异步复位用于上电复位 (POR) 以设置已知值。
使用该if (reset) else
结构以便综合工具可以将其视为具有异步复位的触发器,尝试另一个结构可能会很好地模拟,甚至可能会合成(不正确),但您很容易会遇到硬件错误,而这些错误不会在模拟制作中显示调试非常困难。
您可能有兴趣阅读设置复位触发器 (SR Flip-Flop)。这只是一个没有切换功能的 JK。
可以使用以下暗示:
always @ (posedge clk or negedge reset or posedge set) begin
if (~reset) begin
//reset the signals
end
else if (set) begin
//set the signals
end
else begin
//do something
end
end