3. 同步链设计原理

跨时钟域信号进入目的时钟域后,第一件事不是“立刻使用”,而是先让它在目的时钟域中稳定下来。同步链的本质,是用目的时钟对异步输入进行重新采样,把亚稳态风险限制在同步链内部,而不是让它传播到后续组合逻辑或状态机。不同信号类型需要不同的同步结构:电平信号适合两级触发器同步器,边沿事件适合边沿检测同步器,窄脉冲需要脉冲同步器,而多比特或需要确认的传输则要用握手同步器。

核心原则:同步链只解决“单比特信号跨时钟域采样”的亚稳态问题;多比特数据必须配合握手、格雷码或异步 FIFO,不能简单并联多个两级同步器。

一、两级触发器同步器:最基础的电平同步

两级触发器同步器由两个级联的 D 触发器构成,二者使用同一个目的时钟。异步输入先进入第一级触发器,经过一个目的时钟周期后再进入第二级,第二级输出才允许被后续逻辑使用。第一级触发器可能进入亚稳态,但在一个时钟周期内通常能恢复到稳定电平;第二级触发器再次采样,进一步降低亚稳态传播概率。

其结构可以理解为:异步输入 → 第一级触发器 → 第二级触发器 → 目的域逻辑。两级触发器之间不能插入组合逻辑,否则会破坏同步链的稳定性。同步器输出应直接驱动后续逻辑,或只经过极短组合路径。

// 两级触发器同步器(Verilog 示例)
module sync_2ff (
    input  wire clk_dst,
    input  wire rst_n,
    input  wire async_in,
    output wire sync_out
);
    reg ff1, ff2;
    always @(posedge clk_dst or negedge rst_n) begin
        if (!rst_n) begin
            ff1 <= 1'b0;
            ff2 <= 1'b0;
        end else begin
            ff1 <= async_in;
            ff2 <= ff1;
        end
    end
    assign sync_out = ff2;
endmodule

两级同步器适用于慢速变化电平信号,例如复位释放、模式选择、使能标志。它不适用于多比特总线,也不适用于需要保持窄脉冲宽度的信号。

二、边沿检测同步器:把电平变化变成单周期事件

边沿检测同步器是在两级触发器同步器基础上增加一个延迟触发器,通过比较相邻两拍的值来产生上升沿或下降沿脉冲。其典型结构为:异步输入 → 第一级 → 第二级 → 第三级延迟;第二级与第三级进行逻辑组合,得到边沿指示。

// 上升沿检测同步器
reg ff1, ff2, ff3;
always @(posedge clk_dst or negedge rst_n) begin
    if (!rst_n) {ff1, ff2, ff3} <= 3'b000;
    else        {ff1, ff2, ff3} <= {async_in, ff1, ff2};
end
assign rise_pulse = ff2 & ~ff3;

边沿检测同步器输出的是目的时钟域下的单周期脉冲,适合触发一次动作、置位一个标志或启动一个状态机。需要注意的是,如果输入信号变化太快,目的时钟可能采不到边沿;因此输入信号在目的域看来必须满足最小脉宽要求,通常要求至少保持两个目的时钟周期以上。

三、脉冲同步器:跨时钟域传递窄脉冲

当源时钟域产生的是一个窄脉冲,而目的时钟频率较低时,直接使用两级同步器可能完全丢失该脉冲。脉冲同步器采用“翻转保持 + 边沿还原”的思路:源域每来一个脉冲,就翻转一个电平信号;该电平信号经过两级同步器进入目的域;目的域再对同步后的电平做边沿检测,还原出单周期脉冲。

其信号流为:源域脉冲 → 源域 T 触发器翻转 → 两级同步器 → 目的域边沿检测 → 目的域脉冲。这种结构要求源域脉冲间隔不能太短,必须保证翻转后的电平在目的域被至少采样到一次,否则会漏脉冲。

脉冲同步器适合低频事件通知,不适合连续高速脉冲流。若脉冲间隔小于目的时钟周期,应改用异步 FIFO 或握手方式。

四、握手同步器:多比特与可靠传输的常用方案

握手同步器通过请求与应答信号完成跨时钟域传输。源域把数据放到总线上,然后拉高 req;req 经过两级同步器进入目的域;目的域采样数据后拉高 ack;ack 再经过两级同步器返回源域;源域收到 ack 后撤销 req,完成一次传输。

握手同步器的关键点在于:数据总线在 req 有效期间必须保持稳定,直到 ack 返回后才能改变。这样目的域采样时,数据已经稳定,不会出现多比特同时变化导致的采样错误。握手同步器适用于配置寄存器、控制字、低速数据包等场景。

四类同步链结构对比 两级触发器同步器 FF1 FF2 电平信号 / 慢变化 边沿检测同步器 FF1 FF2 FF3 电平变化 → 单周期脉冲 脉冲同步器 T 翻转 FF1 FF2 窄脉冲 → 翻转 → 还原 握手同步器 REQ ACK 多比特 / 可靠传输 选择依据 • 电平信号、慢变化:两级触发器同步器 • 需要单周期事件触发:边沿检测同步器 • 窄脉冲、低频事件:脉冲同步器 • 多比特数据、需要确认:握手同步器

五、四类同步器对比与选型清单

同步器类型 适用信号 输出形式 关键约束 典型场景
两级触发器同步器 单比特电平 目的域电平 输入需满足最小脉宽 复位释放、使能、模式选择
边沿检测同步器 电平变化 单周期脉冲 变化间隔大于目的周期 启动信号、事件触发
脉冲同步器 窄脉冲 目的域脉冲 脉冲间隔不能过密 低频中断、事件通知
握手同步器 多比特数据 数据 + 确认 req 期间数据保持稳定 配置寄存器、控制字传输

六、常见误区与复盘

  • 误区一:多比特信号直接并联两级同步器。多个比特路径延迟不同,可能在同一目的时钟沿采到不同步的值,导致数据错误。应使用握手或格雷码。
  • 误区二:同步器后直接接组合逻辑。组合逻辑毛刺可能被后续触发器误采,同步器输出应尽量直接进入触发器或仅经过极短路径。
  • 误区三:忽略最小脉宽。窄脉冲若小于目的时钟周期,可能完全丢失。脉冲同步器或握手方式更可靠。
  • 误区四:复位信号不做同步。异步复位释放若靠近时钟沿,可能造成不同触发器退出复位时间不一致,应使用复位同步器。
同步链不是“万能跨时钟域方案”。它只解决单比特采样稳定性问题;多比特、高吞吐、低延迟场景应优先考虑异步 FIFO、格雷码计数器或握手协议。

总结来看,两级触发器同步器是基础,边沿检测同步器把电平变化转成事件,脉冲同步器解决窄脉冲丢失,握手同步器解决多比特可靠传输。设计时应先判断信号类型、变化频率和位宽,再选择对应结构,并确保同步链内部没有组合逻辑、输入满足最小脉宽、多比特数据不直接并联同步。