FPGA 进阶 38:多时钟系统设计——时钟规划、数据交接与复位隔离
本文是
fpga/进阶层第 42 篇,是时钟网络与约束(单个时钟怎么约束)、CDC 单 bit、异步 FIFO(跨域原语)、复位策略的架构整合篇:把这些零件组装成一个多时钟系统。
本文要回答的问题
- 多时钟工程的设计从哪一步开始?时钟拓扑怎么画?
- 域间数据交接有哪几种标准通道?
- 复位怎么随时钟域组织?
- CDC 正确性靠什么验证(为什么仿真靠不住)?
一、时钟拓扑先行
写 RTL 前先产出一张时钟拓扑表,每个时钟一行:
| 时钟 | 频率 | 来源 | 供给模块 | 与谁同源/异步 |
|---|---|---|---|---|
| sys_clk | 100M | 板载晶振→MMCM in | 全局 | 与 logic_clk 同源 |
| logic_clk | 200M | MMCM clk0 | 数据处理 | 与 sys_clk 同源 |
| adc_clk | 80M | ADC 随路钟(外部) | 采集前端 | 与系统异步 |
| rx_rec_clk | 125M | SerDes CDR 恢复 | 网络接收 | 与系统异步 |
| ddr_clk | 333M | MIG 内部 | DDR 控制器 | IP 自管 |

原则:
- 能同源就同源:接口两端时钟尽量由同一 MMCM 派生(同源可精确时序分析),异步域数量越少越好;
- 天生异步的(独立晶振、恢复钟、外板来钟)才做异步处理;
- 一个 MMCM 集中派生系统内频率,少造时钟树(见时钟网络篇)。
二、域间交接:三种标准通道
| 跨域数据 | 通道 | 要点 |
|---|---|---|
| 数据流(连续、高频) | 异步 FIFO | 深度覆盖最忙突发;FWFT 方便读侧;见 FIFO 篇 |
| 单 bit 控制/脉冲 | 双 FF 同步器 | 电平同步/边沿检测/脉冲展宽,见 CDC 篇 |
| 多 bit 慢变配置 | 握手 | 请求-应答分别同步;或单 bit 通知 + 目标域读稳定寄存器 |
铁律:
- 模块端口时钟域显式命名:
s_axis_*配s_axis_aclk、m_axis_*配m_axis_aclk、AXI-Lite 配axilite_aclk,从端口名就看得出域; - 跨域逻辑只许例化标准 CDC 模块(
sync_2ff、async_fifo、cdc_handshake),评审时一搜就全; - 流接口统一 valid/ready,频率差由反压/FIFO 吸收。
三、复位随域组织
- 每个时钟域自己的复位:异步断言、同步释放(见复位策略),由该域时钟打两拍释放;
- 跨域的"复位"不要直接拉——目标域用自己的时钟同步释放;
- 上电顺序:MMCM locked → 释放各域复位;FIFO/IP 复位按 IP 手册时序;
- 异步 FIFO 两侧复位可以分开(各自域),但初次上电两侧都要复位到空。
四、典型骨架

五、验证与评审清单
- 时钟拓扑表与代码一致、经过评审;
report_clock_interaction无意外的 Unconstrained/Async 路径;- CDC 报告清零(
report_cdc/ SpyGlass CDC):每个跨域路径都可归类到同步器/FIFO/握手; - 异步 FIFO 深度按突发+响应裕量核算;
- 每域复位独立同步释放、MMCM locked 联动;
- 上板在跨域点预留 ILA 观测点。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 不画时钟表写到哪算哪 | 跨域漏网、随机错 | 先拓扑表后 RTL |
| 多 bit 总线裸跨域 | 采样到中间态 | FIFO/握手 |
| 端口看不出时钟域 | 评审无法识别 CDC | 时钟域显式命名 |
| 一个全局复位拉所有域 | 释放不同步/亚稳 | 每域同步释放 |
| 能用同源却用独立钟 | 异步域泛滥 | 同 MMCM 派生 |
| 只靠仿真验 CDC | 上板偶发 | report_cdc 清零 |
相关与延伸
零件:时钟网络与约束、CDC 单 bit、异步 FIFO、FIFO 设计、复位策略。 数据搬运:DMA 数据搬运架构;质量门禁:RTL 质量检查。
一句话总结
多时钟系统设计先画时钟拓扑表:每个时钟的频率/来源/去向/同源或异步关系一列清楚,能同源(同 MMCM 派生)就同源以减少异步域,天生异步(独立晶振/恢复钟/外板钟)才走异步处理。域间只准三种标准通道:数据流走异步 FIFO(深度覆盖最忙突发)、单 bit 控制走双 FF 同步器、多 bit 慢变配置走握手,模块端口按时钟域命名(m_axis_aclk)、跨域只例化标准 CDC 模块。复位每域独立、异步断言同步释放、由 MMCM locked 联动。CDC 是结构问题仿真抓不到——靠 report_cdc/SpyGlass 静态检查清零加跨域点 ILA 观测,而不是仿真运气。