34 / 37 · 概念
时钟域边界与亚稳态
理解两级同步器的适用范围,区分单比特、短脉冲与多比特传输。
课时内容可免费阅读,选课后可保存学习进度。
来自其他时钟的输入没有边沿间隔保证
setupsetup 捕获时钟边沿之前,输入数据必须保持稳定的最短时间。违反建立时间就无法保证存储结果。了解更多、hold 条件保持时间 捕获时钟边沿之后,输入数据仍必须保持稳定的最短时间。需结合上下文,将此时序要求与普通的数值保持行为区分。了解更多要求数据在接收时钟边沿附近足够稳定。按钮或另一个独立时钟域的输出,与接收边沿之间的关系任意,因此很难始终保证这些条件。
这可能使触发器触发器 在指定时钟边沿存储输入,并保持到下一边沿的元件。输入必须满足 setup、hold 条件。了解更多内部状态在一段时间内无法迅速稳定到 0 或 1,即发生亚稳态(metastability)。普通 0/1 RTL 仿真并不直接表达这种模拟现象。测试波形干净,并不意味着跨时钟域传输安全。
两级同步器适用于保持足够长时间的单比特信号
module level_synchronizer (
input logic clk_dst,
input logic rst_dst,
input logic async_level,
output logic synced_level
);
logic first_stage;
always_ff @(posedge clk_dst) begin
if (rst_dst) begin
first_stage <= 1'b0;
synced_level <= 1'b0;
end else begin
first_stage <= async_level;
synced_level <= first_stage;
end
end
endmodule即使第一个触发器进入不稳定状态,该结构也在下一级读取前留出稳定时间。功能电路只使用最后一级输出,不直接分支使用第一级输出。上述 reset 假设与目的时钟同步。
实际实现需按工具和器件要求设置同步器同步器 使来自另一时序域的信号能够在接收时钟域中使用的电路。不能把用于单比特的多级触发器直接套用到多位数据。属性、缩短级间布线,并执行 STA、CDC 检查等。仅仅用了两个寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多,并不保证布局和路径条件也已满足。
异步输入进入第一级,功能电路只使用末级输出。级间时间提供了稳定机会,但并不保证模拟亚稳态亚稳态 存储元件暂时无法稳定为 0 或 1 的模拟状态。同步电路降低其传播概率,但不能将发生概率降为零。一定消失。
- 异步电平: 与目的时钟没有固定相位关系
- meta FF: 可能出现不稳定状态
- synced FF: 在下一个目的时钟边沿捕获
- 功能电路: 只使用最后一级
降低失败概率,但不能降为零
在一种简化模型中,平均故障间隔 MTBF 呈现以下趋势。
是可用于恢复稳定的时间, 是器件特性参数, 是接收时钟频率, 是异步输入转换频率。实际计算需要器件专用常数,不能仅凭此公式给任意电路标出“安全若干年”的数字。
不同问题不能套用同一种电路
| 要传递的信息 | 仅用两级单比特同步是否足够? | 应考虑的结构 |
|---|---|---|
| 保持足够长时间的电平 | 满足概率与延迟要求时可用 | 目的时钟域同步器 |
| 短于目的时钟周期的脉冲 | 可能完全漏掉脉冲 | 脉冲展宽、翻转编码、握手 |
| 必须同时解释的多位数据 | 各位可能呈现不同时刻的值 | 稳定总线配合握手、异步 FIFO |
| 机械按钮 | 触点反复弹跳是另一个问题 | 同步后再消抖 |
例如四位数值从 0111 变为 1000 时,若分别同步每一位,可能短暂观察到从未实际存在过的组合。要保留总线一致性,必须设计整组数据与传输完成之间的关系。
延伸阅读:MIT OpenCourseWare — Synchronization, Metastability and Arbitration
自己试试
接收时钟为 50MHz,输入脉冲宽度为 5ns。加了两级同步器后,能否声称所有脉冲都会被检测?按钮弹跳也会一并消除吗?
阅读解释
50MHz 的周期为 20ns。5ns 脉冲可能在两个接收边沿之间出现并消失,连第一级都无法捕获。单纯增加同步器级数不能解决脉冲保留问题,需要脉冲展宽或握手等约定;按钮弹跳还需要另行消抖。