FPGA 入门 30:PLL/MMCM 时钟向导——clk_wiz 出多路时钟
更新时间:2026-09-12。本文是
fpga/入门层第 32 篇。别用逻辑分频见 计数器与分频,时钟树/复位见 时钟与复位,调 IP 流程见 IP 核怎么调。
本文要回答的问题
- 锁相环(PLL)凭什么能把一个晶振频率变成多个精确频率?反馈、VCO、分频系数大致怎样工作?
- 倍频系数和分频系数如何计算?给定输入 50MHz 和想要的 125MHz、25MHz,VCO 频率怎么落在合法范围?
- PLL 与 MMCM 有什么差别,什么时候普通 PLL 不够、必须用 MMCM 的移相和动态重配置?
- 输出时钟为什么必须接 BUFG 走全局时钟树,clk_wiz 在背后替你做了哪些连线?
- locked 信号的电学含义是什么,上电时不等待 locked 会出现什么样的故障?
- 多个时钟域、多个时钟向导、CMT 布局和 clock region 限制在入门阶段要注意什么?
- 时钟质量指标(抖动 jitter、占空比、相位误差)和时序报告里的时钟不确定性有什么关系?
一、PLL/MMCM 解决什么
板上一颗晶振(如 100MHz)→ 需要多路不同频率/相位时钟(逻辑 100M、网口 125M、音频/外设若干 M)。
晶振 100MHz ─► MMCM/PLL(clk_wiz) ─┬─ clk_out1 100MHz ─BUFG─► 逻辑
├─ clk_out2 125MHz ─BUFG─► 网口
└─ clk_out3 25MHz ─BUFG─► 外设
locked ─────────────► 稳定后才释放复位| 计数器分频 | PLL/MMCM | |
|---|---|---|
| 能倍频 | 不能 | 能 |
| 频率/相位 | 仅整数分频 | 多路、移相、调占空比 |
| 输出走线 | 普通布线(差) | BUFG 时钟树(好) |
| 用途 | 内部“慢动作”使能 | 真正的时钟 |
二、配置与例化要点
- Clocking Wizard:设输入频率 → Output Clocks 加多路(各填频率/相位)→ 勾 locked;
- 例化后 clk_out* 接各模块;输出时钟工具自动约束(晶振输入仍要 create_clock);
- MMCM 比 PLL 多精细移相 + 动态重配置(DRP),源同步对齐/动态调频时用。
三、上电时序:等 locked 再工作
clk_wiz_0 u_pll(
.clk_in1(clk_board), .reset(1'b0),
.clk_out1(clk_100), .clk_out2(clk_125),
.locked(pll_locked)
);
// 下游复位: locked 为低时一直复位, 锁定后经复位同步器释放
// rst_n_sys = pll_locked 再进入门26的 reset_sync四、PLL 工作原理直觉:反馈如何锁定频率
不必掌握模拟电路细节,也能理解 PLL 的核心机制。锁相环由四部分组成:相位/频率检测器、环路滤波器、压控振荡器(VCO)和反馈分频器。输入参考时钟和「VCO 输出经反馈分频后的时钟」同时进入检测器,检测器比较两者的相位和频率:若反馈时钟慢了,就提高 VCO 的控制电压让它加速;快了就降低。控制电压经低通滤波变得平滑,避免来回抖动。负反馈最终让两个信号的频率相等、相位差稳定,此时称为「锁定(locked)」。
设输入先经预分频 M(实际实现里还有输入倍频因子),VCO 运行在高频,再用不同的输出分频系数 N1、N2、N3 产生各路输出。直观上,输出频率等于「输入频率 × 倍频因子 ÷ 输出分频」。因为所有分频都来自同一个锁定的 VCO,各路输出不仅频率精确,而且彼此保持确定的相位关系(相关时钟),这是用多个独立晶振做不到的。FPGA 内的 PLL/MMCM 是数字与模拟混合的硬核,参数由 Clocking Wizard 算出的系数配置,用户不需要设计滤波元件。
MMCM(Mixed-Mode Clock Manager)在 PLL 基础上增加了精细相移网络和更灵活的分频/占空比控制:输出相位可以按 VCO 周期的若干分之一步进调节,甚至运行中通过动态重配置端口(DRP)修改频率、相位;还能做反相输出、非 50% 占空比。普通多路频率合成用 PLL 或 MMCM 差异不大;源同步接口(时钟和数据一起从芯片外送来,采样时刻要精确移到数据眼中央)、动态调频、精细相位扫描写场景必须用 MMCM(接口对齐见进阶 LVDS 源同步)。
把四个部件连成环路,「锁定」的含义就直观了:

高亮的反馈分频器是「倍频」的物理来源:检测器强迫反馈时钟与参考同频,VCO 就必须运行在参考的 M 倍;各输出分频器再从这个高频公共母线上分出不同频率,所以多路输出天然保持确定的相位关系。
五、频率规划与系数计算
配置 clk_wiz 时,工具看似自动算系数,但若想要的频率组合非法或误差大,必须看得懂它给的反馈。规划顺序一般是:
- 确定输入:板载晶振频率(如 50MHz/100MHz/200MHz)和单端/差分电平,这个频率必须与 XDC 中 create_clock 完全一致(见 XDC 篇);
- 列出所有输出需求:每路频率、是否需要相位、大致用途和时钟域归属;
- 检查 VCO 合法区间:器件手册给出 VCO 频率上下限(7 系列约 600~1200MHz 量级,不同速度等级不同)。向导会先把输入倍频到 VCO,再分频输出。输入 50MHz、想要 125MHz 时,工具选择倍频到某个公共高频(例如 1000MHz 或附近合法值),再除以 8 得 125MHz;同时另一路除以 40 得 25MHz;
- 处理不可整除:若请求频率无法由整数分频精确得到,向导会标红或给出实际频率和误差(ppm 或百分比),误差要在下游接口(如以太网 MII、音频 MCLK)允许范围内,必要时调整输入频率(换晶振/PLL 级联);
- 控制时钟数量与负载:一路输出经一个 BUFG 驱动一棵全局时钟树,过多时钟会占满 BUFG 和时钟区域资源;多个模块若能用同一时钟加使能降速,就不要开新输出(时钟使能法见 计数器篇)。
向导底部通常显示实际输出频率、误差、VCO 频率、抖动估算和资源(MMCM/PLL + BUFG 数量)。把这些数字记入设计笔记,不要只看「能 Generate 成功」——一个有 2% 误差的「115200」串口时钟、或一个频率看似接近但超接口规范的 MII 时钟,会在上板时以难查的偶发错误回报。
五步规划顺序落成流程图,配置向导前先在纸上走完一遍:

前两步是「需求」,后三步是「约束」,顺序不能倒——先数清楚要几路、各多少,再让 VCO 区间和资源上限去否决或修正需求,比配完了发现标红再回头改要省一整轮迭代。
六、从 clk_wiz 到时钟树:信号路径与自动约束
理解 IP 输出在芯片里走的路径,有助于读懂时钟报告和资源冲突。典型路径是:板载晶振从时钟 capable 管脚进入输入缓冲(IBUFG/IBUFDS),送入 MMCM/PLL 的时钟输入端;PLL 内部锁定后,多路输出各自进入全局时钟缓冲 BUFG(或 BUFGCE 带使能、BUFIO/BUFR 等局部时钟资源用于 I/O 串行器),再驱动全局时钟树到所有使用该时钟的触发器。clk_wiz 在生成时会把这些缓冲和连线全部包好,默认选项下你只看到 clk_in1、clk_out1…、locked,但实现后的层级里可以看到 BUFG、MMCM 原语。
约束方面,用户只在晶振输入端口写 create_clock;工具综合 IP 后自动为每个输出建立 generated clock,记录它和输入时钟的分频/倍频与相位关系,时序分析据此检查所有时钟域以及同源时钟之间的路径。不要在 clk_out 端口再手写 create_clock,那会与自动派生时钟冲突。多个 clk_wiz 级联(一个 PLL 驱动另一个)时,派生关系自动传递;如果两个时钟来自不同晶振,即便频率相同也是异步关系,跨域信号必须按 CDC 处理并用 set_clock_groups 切断分析(见 XDC 篇)。
资源位置上,一个 CMT(Clock Management Tile)包含一个 MMCM 和一个 PLL 及相关缓冲,分布在芯片各时钟区域。时钟从某个 CMT 出发能方便地驱动相邻若干区域,极远端的大量负载可能导致时钟布线紧张或需要额外缓冲。入门设计通常自动布局即可;当实现报告提示 clock region 超限、时钟功耗过大或偏斜异常时,再查看时钟拓扑报告,考虑把使用某时钟的逻辑约束到相关区域、增加 BUFG 复制、或减少时钟数量。
把这条从晶振到触发器的完整通路画出来,clk_wiz 替你包好的部分就清楚了:

主干四级(晶振 → 输入缓冲 → MMCM → BUFG → 时钟树)缺一不可,且每一级都走专用资源;右侧 locked 支路是控制通路,不参与时钟分发,但决定下游何时被允许使用这条时钟树。读时序报告里的 clock summary,对照的正是这张图上的每一级。
七、locked 与启动时序:不可省略的握手
locked 是时钟管理 IP 最重要的状态信号,但它常被新手悬空。PLL 从复位释放到锁定有三个阶段:输入时钟稳定并通过检测、VCO 爬坡到目标频率、输出分频和相位对齐稳定,总时间从几十微秒到毫秒级,取决于器件和配置。在这期间,输出可能停在固定电平、输出错误频率或出现窄脉冲。让下游逻辑在这种「时钟」上跑,触发器会在任意时刻被错误触发,状态机、FIFO 指针可能进入非法状态;更麻烦的是 PLL 通常最终能锁定,于是故障只在上电瞬间发生、之后再也无法复现。
标准启动结构(在 时钟与复位篇 已概述)是:外部复位(按键、电源复位)与「locked 为低」做或逻辑,产生持续到时钟稳定之后的异步复位请求;该请求送进每个时钟域各自的复位同步器,同步释放。这样按下复位或时钟丢失时全片立刻进入复位,锁定并同步后才有序启动。clk_wiz 的 reset 端口若使用,要按手册给出的最小宽度和电平驱动;很多设计可以把 reset 固定为无效,仅靠上电行为和 locked 门控,但保留复位端口便于热重启整个时钟系统。
运行中输入时钟可能短暂丢失(外部时钟源切换、干扰),部分器件/IP 提供 clock gone/status 信号,配合 locked 拉低触发复位;高可靠设计还会用本地稳定时钟监测参考时钟。仿真时要给 PLL 行为模型留出锁定时间,不要在复位后立刻检查业务输出;Testbench 可以强制 locked 早高以加速仿真,但要另做一个「真实锁定延迟」测试确认启动状态机覆盖了等待区间。调试上电问题时,把 locked 接到一个 LED 或 ILA 探针,是判断「时钟系统是否活着」的第一步。
标准上电时序按时间先后是四次握手:

关键在第二步到第三步之间那段空白:下游逻辑在这段时间里必须被复位按住,任何「先跑起来再说」的侥幸都会变成上电偶发错乱。复位释放发生在最后一步而不是 locked 拉高的同一拍,是因为释放本身还要经过各时钟域的复位同步器。
八、时钟质量:抖动、占空比与建立时间预算
为什么强调「真正的时钟」必须来自 PLL/晶振加全局时钟资源,而不能用普通翻转信号凑合?核心指标是时钟质量。**抖动(jitter)**指实际沿相对理想时刻的短期偏差,分为周期抖动、周期间抖动和相位抖动;晶振本身有一点抖动,经过 PLL 后通常可滤除高频部分,但倍频越高、VCO 余量越小,输出抖动预算越紧。时序分析里工具会给每个时钟分配不确定度(clock uncertainty),它包含抖动和偏斜余量,是从周期中直接扣掉的时间。时钟越脏,留给逻辑延迟的时间越少,高频率下尤其致命。
占空比是高电平占周期比例,多数时序电路期望接近 50%,因为 DDR、双沿采样、某些 SERDES 同时使用上升和下降沿;逻辑分频若计数比较不对称,可能输出偏窄波形,下降沿时序无法满足。相位关系在同源时钟间是确定的,工具能分析带相位的时钟路径;但逻辑翻转时钟和主时钟没有受控相位关系,只能当异步,实际却连在同一逻辑上,形成「名义同步、实际危险」的结构。clk_wiz 输出在 GUI 里可设置相位和占空比,合法配置下硬件保证实现,并把这些参数写入自动生成的时钟约束。
读懂时序报告中的时钟摘要(clock summary)是时钟规划的验收手段:每个时钟应有确定的来源、周期、波形和不确定度;generated clock 的父时钟指向晶振/PLL;不应有未约束时钟或意外的时钟。若看到某个逻辑信号被识别成时钟(工具自动推断的 generated clock 来自 LUT/FF),通常是写出了伪时钟,应改成使能方案。时钟相关警告(buffer 被优化、未使用的时钟脚、时钟区域跨度)要逐一解释,不能简单忽略。
九、动态重配置(DRP)与进阶用法
多数入门项目只需要固定频率,但了解 MMCM 的进阶能力有助于规划未来设计。动态重配置端口(DRP,Dynamic Reconfiguration Port)是一组同步寄存器接口(地址、数据、使能、读写),通过它可以在运行时修改分频系数和相位设置:例如同一收发通道按协议切换速率、自适应采样时钟、扫频测量。使用 DRP 时要把 MMCM 配置序列写成状态机:解锁/停时钟(按手册)、写入参数、等待重新锁定、再释放下游复位;切换期间所有依赖该时钟的逻辑都必须保持复位或暂停事务,不能边换频边运行。
另外几种常见结构:PLL 级联用于一个 MMCM 无法同时满足的组合(第一级合成高频基准,第二级产生特殊相位移);BUFGCE 时钟使能用于在不改变 PLL 的情况下门控某路时钟以省电,但门控必须来自专用资源或满足无毛刺设计,随手用与门关时钟会产生截断脉冲;**局部时钟资源(BUFR/BUFIO)**服务 I/O 串行器和高速源同步采集,不走全片时钟树;多时钟区域设计中可让不同物理区域的模块使用本区域缓冲,减少长距离时钟布线。对入门者来说,这些名词先建立印象,真正用到高速 ADC/DDR/显示接口时再按数据手册实现;普通控制逻辑永远回到两条简单规则:时钟来自晶振/PLL,慢速节拍用时钟使能。
十、自查清单与练习
- 晶振输入管脚是时钟 capable 脚,XDC 有且仅有一个 create_clock 作用于它,频率与板卡一致;
- 所有时钟域都能在时钟摘要里追溯到晶振或已知外部源,generated clock 自动由 clk_wiz 产生,无逻辑信号被当时钟;
- 每路请求频率在 GUI 中可实现,实际频率误差满足外设规范,VCO 处于合法范围,必要资源(MMCM/PLL、BUFG)充足;
- locked 已接入复位链:locked 为低期间下游各域保持复位,锁定后经各域复位同步器释放;
- 多时钟域信号都经过同步器或异步 FIFO,异步时钟组在约束中正确切分;
- 时钟输出没有悬空或无负载浪费,能合并的时钟已通过使能方案合并;
- 仿真覆盖锁定等待、复位键重启、(若使用)动态重配置切换;
- 实现后检查时钟摘要、时钟区域和不确定性,时序报告无未约束路径。
练习路径:先用 clk_wiz 把板载 50MHz 变为 100MHz 和 25MHz,各驱动一个计数器和 LED 闪烁,用 ILA 或分频到可见频率确认时钟活着;接着故意不等 locked 启动状态机,多次复位/重新上电观察偶发错误(这是理解启动时序最直观的实验);再加入两个时钟域和异步 FIFO,形成「慢域写入、快域读出」的数据通路;最后尝试在 GUI 给一路输出设置 90/180 度相位,观察波形中沿的位置变化,并尝试用 MMCM 的 DRP 在两组频率间切换。完成后你会建立一条完整心智链:晶振给出参考,PLL/MMCM 合成多个精确时钟,专用时钟树保证低偏斜分发,locked 和复位同步器保证系统从确定状态启动——时钟基础设施可靠,上面所有同步逻辑才有意义。
十一、几种典型系统的时钟架构
把原理落成常见工程模板,以后遇到类似系统可直接套用。
单时钟系统:晶振经 clk_wiz 产生一路主时钟(也可不经 PLL 直接用晶振,但建议经 BUFG),所有逻辑、UART、数码管扫描都在该时钟下,慢速动作全部用时钟使能;locked 与外部复位组合后经一个复位同步器释放。这是 LED、按键、基础通信实验的推荐结构,简单且几乎没有 CDC 风险。
双相关时钟系统:一路 100MHz 跑处理逻辑,一路 25MHz 或 50MHz 驱动 VGA/外设等需要特定频率的接口,二者来自同一 MMCM,频率相关但不同。跨域数据不能直接连:少量控制位用两级同步,数据流用异步 FIFO(BRAM 双口),并在 XDC 中仍把两路时钟视为需要 CDC 的独立时钟(工具默认同源相时可分析,但相位/频率复杂时一般按异步处理更安全)。
多晶振/外部输入时钟系统:板卡有主晶振、网络 RGMII 时钟、音频 MCLK、高速串行恢复时钟等,这些时钟来自芯片外、彼此异步,各自经过 IBUF/BUFG 或专用接口 IP;系统中存在多个真正异步时钟组,必须用 set_clock_groups 声明互异,并为每条跨域路径落实同步器或异步 FIFO。网络、视频、USB 类设计属于这一类。
带时钟失效保护的系统:参考时钟可能消失(热插拔、线缆断开),用 clk_wiz 的时钟停止/丢失状态(或时钟检测逻辑)产生复位,把依赖时钟的接口安全停在已知状态;时钟恢复后重新走锁定和复位序列。这个模式在热插拔接口和冗余时钟系统中常见。
架构设计时先在纸上画出时钟树:每个时钟从哪里来、经哪个 MMCM/PLL、进哪个 BUFG、供给哪些模块、跨域点在哪里、复位如何为每个域生成。时钟树图和复位链图应当成为设计文档的第一页,评审时先看这两张图,很多「偶发 bug」在画图阶段就能避免(多时钟系统深入见进阶 多时钟设计)。
四种架构的取舍汇总成一张对照表,选型时按行入座:
| 系统类型 | 时钟来源 | CDC 负担 | 典型场景 |
|---|---|---|---|
| 单时钟系统 | 一路 clk_wiz 输出 | 几乎无 | LED、按键、基础通信实验 |
| 双相关时钟 | 同一 MMCM 多路输出 | 同步器 + 异步 FIFO | 逻辑 + VGA/特定外设 |
| 多晶振异步系统 | 多个外部时钟源 | set_clock_groups + FIFO | 网络、视频、USB |
| 带失效保护系统 | 可丢失的外部参考 | 时钟丢失检测复位 | 热插拔、冗余时钟 |
CDC 负担一列是决策核心:每多一个真正异步的时钟源,就多一整套约束和验证工作,所以能用同一 MMCM 分出来的频率,就不要引入第二颗晶振。
十二、典型故障案例集
收集几个时钟相关的高代表性症状,调试时可对号入座:
- 上电后偶尔不工作,重新烧写或按复位又正常:最经典的 locked 未等待。检查 locked 是否真的进了复位逻辑;有些代码虽然连了 locked,却只复位了数据通路,状态机和指针仍提前运行;
- JTAG 能看到器件但用户时钟相关 LED 不闪:可能 clk_wiz 输入频率配置与实际晶振不符、IP 一直不锁定;用 ILA 直接抓输入时钟和 locked,确认硬件时钟到达;
- 低频功能正常、高频(如 125MHz 以太网)随机错:时钟抖动过大或时序未收敛。查时钟摘要的不确定度、PLL 输出模式和关键路径,不要只在业务代码里找原因;
- 双口 FIFO 偶尔读出重复或跳变数据:读写被当成同域但实际来自不同时钟,或者复位只做了一侧;用独立双时钟 FIFO,两侧各自复位,跨域只通过 FIFO 接口;
- 改了 IP 输出频率但行为没变:没有重新 Generate 或 OOC 结果过期,顶层仍连旧网表;检查 IP 状态并重建;
- 实现提示 BUFG/CMT 资源不足或时钟区域问题:时钟路数过多或负载分布过散;合并可合并的时钟、使用时钟使能,或让工具复制时钟缓冲、约束相关逻辑位置;
- 仿真永远停在等待 locked:仿真模型需要复位和足够时间,或 reset 极性接反;阅读 IP 仿真说明,先跑官方 example testbench;
- 温度变化后出错率变化:仍可能是时钟/时序边界问题,而不是模拟漂移玄学;检查不确定性预算、供电和时钟源质量,但先保证 STA 全收敛。
处理这些案例的共同心法是:把「时钟是否存在且稳定」与「逻辑功能是否正确」分开验证。先用最简单的计数器/LED 证明每一路时钟都在以正确频率跑、locked 为高、复位能正确释放,再逐层加业务;不要在一个时钟基础尚未证实时调试复杂算法。时钟树是整个 FPGA 设计的地基,地基每一处都确定可靠,上层流水、接口、算法的验证结论才有意义。
十三、抖动、漂移与锁定:时钟质量的几个定量概念
PLL/MMCM 不只是"能分出某个频率",更决定了系统时钟的质量,初学者应建立几个可量化的指标直觉。第一是锁定(lock)。上电或改变配置后,PLL 的反馈环需要一段时间(几十到几百微秒)把输出频率和相位调整到目标值,这段时间输出时钟是不稳定、不可用于采样的;器件提供 LOCKED 信号,在输出稳定后拉高。规范用法是:把 LOCKED 纳入系统复位逻辑——LOCKED 未有效前保持整芯片复位,LOCKED 有效且电源稳定后再(经同步释放)解除复位,否则逻辑可能在混乱时钟上跑出错误初始状态。动态重配置改频率后 LOCKED 会先拉低再重新拉高,同样要等待。第二是周期抖动(period jitter / cycle-to-cycle jitter),指实际时钟边沿相对理想位置的随机偏差,以皮秒/纳秒计。抖动会直接吃掉时序裕量:STA 里工具会把时钟不确定性(uncertainty,含抖动估计)从可用周期里扣除,所以同样逻辑,时钟越抖能达到的 fmax 越低。PLL 内部的相位频率检测和环路滤波恰恰能"净化"来自板上晶振或另一路时钟的抖动,这就是常说的抖动滤波(jitter filter)作用——经 PLL 输出的时钟往往比直接输入更干净(取决于环路带宽配置)。
第三是频率漂移与精度,即平均频率随温度、电压、老化缓慢偏离标称值,主要取决于参考晶振(普通晶振 ±50ppm,温补 TCXO/恒温 OCXO 精度高得多)。PLL 是倍频/分频器,它忠实地把参考频率按比例放大,参考的 ppm 误差也会按倍数传递,因此在对绝对频率精度敏感的场合(通信波特率、实时计时、射频采样),要先选够精度的参考源,PLL 无法凭空修正参考本身的偏差。第四是相位对齐与相位移动,MMCM 这类精细时钟管理模块除了倍/分频,还能对输出做可编程相移(精细到 VCO 周期的若干分之一),这在源同步接口(按相位移动让采样窗口落在数据眼中央)、收发器和需要精确相位关系的多相机/多路采样系统里非常关键。理解"先等 LOCKED、抖动进 uncertainty、ppm 随倍频传递、相移用于采样对齐"这四点,你就能在系统级正确使用时钟管理模块,也能看懂时序报告里时钟不确定性那一项是怎么来的。
十四、多时钟系统的时钟规划:在架构阶段就想好
一个复杂设计往往有多个时钟来源和多个时钟域:板上晶振的基础时钟、PLL 倍出的高频系统时钟、给外设的不同频率时钟、从收发器恢复出的时钟、外部 ADC 送来的数据时钟等。新手容易"用到哪加到哪",最后时钟域数量失控、CDC 隐患丛生;成熟做法是在架构阶段就做一张时钟规划表并贯穿设计全程。这张表至少列出:系统里有哪些时钟、各自频率与来源(哪个引脚、哪个 PLL 输出、是否可动态切换)、占空比和相位要求、驱动哪些模块/接口、哪些时钟之间需要通信(即存在哪些跨时钟域边界)、以及用什么做 CDC(异步 FIFO、握手、双触发器同步)。把时钟域数量控制在必要的最小值,能显著降低静态时序分析和验证的复杂度——每多一对需要交互的异步时钟,就多一整套 CDC 约束和验证负担。
时钟规划还要落实到物理资源和约束上:外部时钟必须从时钟 capable 引脚进、经全局/区域缓冲(BUFG/BUFR/BUFIO)上专用时钟网络;PLL 的输入、输出和反馈路径有专用布线,例化向导默认处理,但你要知道为什么不能用普通逻辑把时钟绕一圈再送回来;同一接口的相关时钟(如 TMDS、源同步 DDR)应来自同一时钟管理块以保持确定的相位关系。在约束侧,要用 create_clock 定义主时钟、用 create_generated_clock 让工具知道 PLL 输出时钟及其与源的关系(Vivado 对 Clocking Wizard 通常自动派生,但要在报告里核对 Clock Summary,确认没有漏约束/多余时钟),并对真正异步的时钟域之间声明 set_clock_groups -asynchronous 或逐路径 false path,让 STA 不去检查本就不存在固定相位关系的路径,同时配合 CDC 设计保证功能正确。最后在实现后检查时钟报告:实际频率、各时钟的 BUFG/PLL 占用、uncertainty、有没有未约束路径。把"列清时钟域、最小化跨域、走专用资源、写全时钟约束、核对时钟报告"作为固定流程,时钟子系统就从最容易出诡异问题的地方,变成设计里最确定、最可签核的部分——这也直接衔接中级阶段的多时钟设计与 CDC 专题。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 不等 locked 就跑 | 开机偶发错乱 | locked=1 再释放复位 |
| 请求频率不可实现 | 工具标红/误差大 | 看实际频率提示 |
| 用逻辑分频出高频时钟 | 偏斜/抖动大 | 一律 clk_wiz |
| 输入晶振没约束 | STA 无基准 | create_clock 晶振 |
| 跨 clock region 多路 | 布线/资源问题 | 注意 CMT 布局 |
| 需要移相却选 PLL | 调不了相位 | 用 MMCM 开相移 |
相关与延伸
入门:计数器与分频(时钟使能)、时钟与复位、IP 核怎么调。 深入:进阶 约束实战 generated clock、LVDS 源同步(相位对齐)、时钟网络约束。
一句话总结
板上一颗晶振要变出多路不同频率/相位的时钟,用 FPGA 内的 PLL/MMCM(Clocking Wizard/clk_wiz IP):它能倍频、分频、移相、调占空比,输出多路时钟经 BUFG 走全局时钟树、抖动偏斜小、频率精确——和计数器分频只能降频且走普通布线有本质区别。配置时设好输入晶振频率、添加多路输出(各填请求频率/相位,工具自动算系数并约束 generated clock)、务必保留 locked 信号;上电后 PLL 需要时间锁定,锁定前输出不稳,必须等 locked=1 再释放下游复位(多时钟域各自做复位同步)。普通出几路固定频率 PLL/MMCM 皆可,需要精细移相(源同步采数据对齐眼图)或运行中动态改频率相位时用 MMCM 的相移/DRP 功能。
上一篇:32 IP 核怎么调(IP Catalog/例化/OOC) | 下一篇:34 ILA 第一次用(在线逻辑分析仪/触发) | FPGA 系列目录