FPGA 跨时钟域(CDC)基础:同步器、脉冲与多位数据
myfpga.com.cn 编辑部 · 2026-10-05
当信号从一个时钟域传到另一个时钟域,如果两个时钟没有确定的相位关系,采样边沿可能落在信号变化附近。接收触发器可能进入亚稳态;跨域设计要降低这种状态传播到后级逻辑的概率,并保证信息不会丢失或错读。
单比特稳定电平:同步器链
对持续时间足够长的单比特状态,常见做法是在目标时钟域使用串接的触发器进行同步。第一级接收异步输入,后续级提供额外解析时间;后级逻辑只使用同步器链的末级输出。
logic dst_clk, async_level, sync_ff1, sync_ff2;
logic level_dst;
always_ff @(posedge dst_clk) begin
sync_ff1 <= async_level;
sync_ff2 <= sync_ff1;
end
assign level_dst = sync_ff2;
这类同步器降低亚稳态传播风险,但不会让风险归零,也会增加若干目标时钟周期的延迟。同步器级数、器件属性和工具识别方式,应按目标 FPGA 与开发工具文档确认。不要把第一级输出同时用于其他逻辑。示例省略了模块端口和上电复位处理,实际设计需按目标器件及复位架构核实。
短脉冲和事件:不能只靠两级触发器
如果源时钟域的脉冲比目标时钟周期短,目标域可能完全采不到它。对于事件通知,可根据事件频率与传输语义使用脉冲展宽、toggle 同步或请求/应答握手;选择前要确认连续事件是否可能重叠,以及接收端是否必须逐个处理。
多位数据:保持数据一致性
把总线的每一位分别接入独立同步器,不能保证各位在同一笔传输中被接收。若各位在不同周期稳定下来,目标端可能组合出从未由源端发送过的值。
常见结构包括:
- 握手传输:源端保持数据稳定,通过同步后的控制信号通知目标端采样,并等待确认后再更新数据;
- 异步 FIFO:适合持续或成批的数据流,读写侧使用各自时钟;指针同步、满空判断和时序约束需按所用 FIFO 实现处理;
- 专用 CDC IP:当目标器件或工具提供经过验证的跨域模块时,可按其文档配置并检查约束。
CDC 设计必须与时序约束和静态分析配合。把跨域路径标为例外只会改变时序分析范围,不会自动建立安全的数据传输电路。
设计检查清单
- 为每个时钟域标明时钟来源、频率关系与复位方式;
- 按数据类型和传输语义选择同步器、握手或异步 FIFO;
- 确保单比特同步器的中间级没有被其他逻辑使用;
- 对多位跨域通路检查数据稳定窗口、指针同步和适用约束;
- 使用目标工具的 CDC 检查与综合报告复核结构;
- 通过仿真覆盖复位、连续事件、背压和频率差异等情况,并在目标硬件上验证。
先理解 FPGA RTL 组合逻辑与时序逻辑 与 有限状态机设计,再结合 FPGA 开发流程入门 了解约束、实现和板级验证如何衔接。
信息来源
- https://docs.amd.com/r/en-US/ug949-vivado-design-methodology/Clock-Domain-Crossing
- https://docs.amd.com/r/en-US/ug949-vivado-design-methodology/Single-Bit-CDC
- https://docs.amd.com/r/en-US/ug949-vivado-design-methodology/Multi-Bit-CDC
- https://www.intel.com/content/www/us/en/docs/programmable/683082/25-1/recommended-design-practices.html