异步复位信号在跨时钟域CDC中的处理原则

今天,继续学习CDC跨时钟域问题。看下图:

这张图片展示的是数字电路设计中一个非常关键的概念:复位同步化(Reset Synchronization),特别是针对异步复位信号的同步释放(de-assertion),以避免亚稳态和确保系统可靠启动。


一、整体结构概览

图像分为左右两部分:

  • 左侧 :电路图 ------ 展示了如何用两个触发器(F2, F3)对异步复位信号 rst_n 进行同步化处理,输出同步后的复位信号 o_rst_n。

  • 右侧 :时序波形图 ------ 展示了输入异步复位 rst_n、时钟 clk_B 和输出同步复位 o_rst_n 的时间关系,特别标注了"Synchronous de-assert"(同步释放)。


二、左侧电路图详解

1. 元件说明:

  • rst_n:异步低电平有效复位信号(active-low asynchronous reset)。它可能来自外部或不同时钟域,因此是"异步"的。

  • clk_B:目标时钟域的主时钟。所有同步操作都基于这个时钟。

  • F2, F3:两个D触发器(Flip-Flop),构成经典的"双级同步器"结构。

  • o_rst_n:经过同步处理后的复位信号,用于驱动本时钟域内的其他逻辑。

2. 连接方式:

  • rst_n 同时连接到 F2 和 F3 的异步复位端(通常标记为 CLR 或 RST,图中用小圆圈表示低电平有效)。

  • F2 的数据输入 D 接高电平(T = 1,即常数1),时钟接 clk_B。

  • F2 的输出 Q 连接到 F3 的数据输入 D。

  • F3 的时钟也接 clk_B,其输出 Q 即为 o_rst_n。

  • 注意:F2 和 F3 的异步复位端都被 rst_n 控制 ------ 这意味着当 rst_n=0 时,两个触发器都会被强制清零(输出0);当 rst_n=1 时,它们开始在时钟边沿采样数据。

✅ 这是一个标准的"异步复位 + 同步释放"电路结构。


三、右侧时序波形图详解

1. 信号定义:

  • rst_n(紫色):原始异步复位信号。在某个时刻被拉低(assert),然后又被拉高(de-assert)。

  • clk_B(灰色):目标时钟域的时钟,周期性方波。

  • o_rst_n(紫色):同步后的复位输出信号。

2. 关键行为分析:

(1)复位断言(Assert)阶段:
  • 当 rst_n 被拉低时,F2 和 F3 立即被异步清零 → o_rst_n 立刻变为低电平(即使不在时钟边沿)。

  • 这保证了复位能立即生效,不受时钟限制 ------ 符合"异步复位"的特性。

(2)复位释放(De-assert)阶段:
  • 当 rst_n 被拉高(释放)时,F2 和 F3 不再被强制清零,但它们的输出不会立刻变化。

  • F2 在下一个 clk_B 上升沿采样 D=1 → 输出变高。

  • F3 在再下一个 clk_B 上升沿采样 F2 的输出(此时已是1)→ 输出变高。

  • 因此,o_rst_n 是在第二个时钟上升沿之后才从低变高 ------ 实现了"同步释放"。

📌 图中标注 "Synchronous de-assert" 并指向 o_rst_n 上升沿的位置,强调这是与时钟对齐的释放动作。


四、为什么需要这样做?------ 设计动机

问题背景:

如果直接使用异步复位信号去复位多个寄存器,而该复位信号在释放时没有与时钟对齐,可能导致:

复制代码
亚稳态(Metastability):某些寄存器在复位释放瞬间处于不确定状态。

复位不一致(Reset Skew):不同寄存器在不同时间退出复位状态,导致逻辑错误。

功能异常:比如计数器未归零就开始计数,状态机进入非法状态等。

解决方案:

通过两级触发器同步器,将异步复位的释放过程同步到目标时钟域,确保:

✅ 所有受 o_rst_n 控制的寄存器在同一时钟周期内同时退出复位状态

✅ 避免亚稳态传播到后续逻辑

✅ 满足建立/保持时间要求,提高系统可靠性


五、为何只用两级?

  • 第一级(F2)负责捕获异步信号的变化,可能会进入亚稳态。

  • 第二级(F3)提供一个时钟周期的时间来让第一级稳定下来,从而大大降低亚稳态传递的概率。

  • 在实际工程中,对于复位信号这种低频且重要的控制信号,两级同步器已足够安全(MTBF > 系统寿命)。


六、总结:核心思想

复制代码
"异步复位,同步释放"
  • Assert(置位):异步发生,立即生效 → 快速响应复位需求。

  • De-assert(释放):同步于时钟边沿 → 保证系统安全、一致地恢复正常运行。

这是一种广泛应用于 FPGA/ASIC 设计中的最佳实践,尤其适用于跨时钟域复位管理或多模块协同启动场景。

相关推荐
曲径海盗3 天前
【Python 学习第 41 天】for 循环
python·学习笔记·编程入门
曲径海盗4 天前
【Python 学习第 38 天】for 循环
python·学习笔记·编程入门
曲径海盗4 天前
【Python 学习第 40 天】for 循环
python·学习笔记·编程入门
曲径海盗5 天前
【Python 学习第 37 天】for 循环
python·学习笔记·编程入门
曲径海盗5 天前
【Python 学习第 39 天】for 循环
python·学习笔记·编程入门
曲径海盗12 天前
【Python 学习第 34 天】条件判断 if/else
python·学习笔记·编程入门
泡泡糖的中文规格书13 天前
HDLbits 1.2 学习笔记
fpga开发·学习笔记·verilog
曲径海盗15 天前
【Python 学习第 33 天】条件判断 if/else
python·学习笔记·编程入门
曲径海盗15 天前
【Python 学习第 31 天】复习:变量与数据类型 等 3 题
python·学习笔记·编程入门
曲径海盗15 天前
【Python 学习第 32 天】字符串基础
python·学习笔记·编程入门