| 类型 | 动作触发 | 敏感列表写法 | 优点 | 缺点 | 常见用途 |
|---|---|---|---|---|---|
| 异步 + 高有效 | rst = 1 时立即复位 | posedge rst | 响应快,直观 | 释放复位时可能亚稳态 | 外设复位、POR |
| 异步 + 低有效 | rst_n = 0 时立即复位 | negedge rst_n | 硬件常见,抗干扰好 | 释放不安全需同步 | 系统级 reset |
| 同步 + 高有效 | 时钟沿 + rst=1 时复位 | 无需把 rst 放敏感列表 | 逻辑简单,安全 | 需要时钟 | FPGA 推荐方式 |
| 同步 + 低有效 | 时钟沿 + rst_n=0 时复位 | 无需把 rst 放敏感列表 | 系统低电平规范兼容 | 同步逻辑变复杂(!rst_n) | 模块内局部复位 |
同步复位、高有效(Synchronous Reset, Active-High)

module test (
input clk,
input rst, // active-high synchronous reset
input d,
output reg q
);
always @(posedge clk) begin
if (rst)
q <= 1'b0;
else
q <= d;
end
endmodule
同步复位、低有效(Synchronous Reset, Active-Low)

module test (
input clk,
input rst_n, // active-low synchronous reset
input d,
output reg q
);
always @(posedge clk) begin
if (!rst_n)
q <= 1'b0;
else
q <= d;
end
endmodule
异步复位、高有效(Asynchronous Reset, Active-High)

module test (
input clk,
input rst, // active-high asynchronous reset
input d,
output reg q
);
always @(posedge clk or posedge rst) begin
if (rst)
q <= 1'b0;
else
q <= d;
end
endmodule
异步复位、低有效(Asynchronous Reset, Active-Low)

module test (
input clk,
input rst_n, // active-low asynchronous reset
input d,
output reg q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1'b0;
else
q <= d;
end
endmodule
- 注:在Quartus中,两种类型的异步复位得到的RTL图示结果是相同的,都是仅一个 DFFE 的基础结构,这可能是软件的显示优化。如下图,在赛灵思的文档中,异步复位低有效综合为FDCE原语,对应的异步复位高有效通过增加反相器实现。

同步复位器:异步复位 + 同步释放
-
外部复位信号通常为异步输入(通常低有效,带上拉电阻)。由于存在亚稳态风险,需要避免在复杂设计中直接使用异步复位驱动逻辑。
-
使用同步复位时,信号
rst必须与时钟同步,且在时钟有效期间保持有效,满足建立和保持要求(纯同步复位通常只用于内部生成的复位信号(如状态机超时复位),不适合做系统级主复位)。 -
因此,Intel(Altera)和 Xilinx 的官方建议:Asynchronous assertion and synchronous de-assertion of reset。
- 异步置位:确保任何时刻都能强系统进入已知状态
- 同步释放:避免复位撤销时因跨时钟域导致部分寄存器退出复位、部分未退出,造成状态机错乱
-
实现的主要结构类似跨时钟域同步中的双触发器同步器:
// 功能:将异步复位 rst_n_in 转换为同步复位信号 sync_rst_n
// 输出 sync_rst_n 可用于其他同步逻辑的复位(低有效)
module test (
input clk,
input rst_n_in, // 异步复位输入,低有效
output reg sync_rst_n // 同步复位输出,低有效
);
reg rst_dff1, rst_dff2;
always @(posedge clk or negedge rst_n_in) begin
if (!rst_n_in) begin
rst_dff1 <= 1'b0;
rst_dff2 <= 1'b0;
end else begin
rst_dff1 <= 1'b1; // 开始释放(同步释放)
rst_dff2 <= rst_dff1;
end
end
assign sync_rst_n = rst_dff2;
endmodule

- 示例代码:
// 功能:带同步复位的 D 触发器
// 外部复位:低有效异步 rst_n
// 内部逻辑:使用高有效同步复位 sync_rst
module test (
input clk,
input rst_n, // 异步复位输入,低有效(外部)
input d,
output reg q
);
// 同步化复位信号:生成高有效同步复位
reg rst_sync0, rst_sync1;
wire sync_rst; // 高有效同步复位
// 第一级:异步采样(允许异步置0)
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
rst_sync0 <= 1'b0;
else
rst_sync0 <= 1'b1;
end
// 第二级:同步传递
always @(posedge clk) begin
rst_sync1 <= rst_sync0;
end
assign sync_rst = !rst_sync1; // 当复位释放后,sync_rst = 0;复位期间 sync_rst = 1
// 主逻辑:同步复位 DFF(高有效)
always @(posedge clk) begin
if (sync_rst)
q <= 1'b0;
else
q <= d;
end
endmodule
注意事项
- 推荐低有效(active-low): 外部按钮/电源监控芯片通常输出低有效复位(开漏+上拉),抗干扰更强。
- 加消抖和滤波: 机械开关需硬件 RC 滤波或 FPGA 内部 debounce 逻辑(基于计数器的消抖逻辑,一旦信号跳变,计数器清零)。
- 保证足够脉宽: 复位脉冲宽度应 > 系统最慢时钟周期 × 2(确保所有模块都能捕获,按键复位的话多按一会儿复位按钮)。
- 复位释放必须在时钟稳定之后: 使用 PLL/MMCM时,最好在
locked信号有效后再释放复位。(assign rst_n_async = rst_n_ext & mmcm_locked; // 两者都有效才允许释放) - 需要复位的:状态机、计数器、控制信号、FIFO 指针等影响功能正确性的寄存器。
- 无需复位的:纯数据通路寄存器(如流水线中间结果)、RAM 输出寄存器。减少复位网络负载,改善时序,节省功耗。

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



