fpga系列 HDL:verilog fpga 同步复位&异步复位&同步复位器(异步复位 + 同步释放)相关代码和区别

类型动作触发敏感列表写法优点缺点常见用途
异步 + 高有效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原语,对应的异步复位高有效通过增加反相器实现。
    https://docs.amd.com/r/en-US/ug953-vivado-7series-libraries/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 输出寄存器。减少复位网络负载,改善时序,节省功耗。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值