Quick Start(快速上手)
打开 Vivado,创建一个新工程,选择目标器件(例如 Xilinx Artix-7)。在 IP Catalog 中搜索并例化“Clocking Wizard”IP。设置输入时钟频率(例如 100 MHz),选择输出时钟数量(2 个),并分别设置频率(例如 50 MHz 和 200 MHz)。在“Output Clocks”选项卡中,为每个输出时钟选择“Use MMCM”或“Use PLL”。生成 IP,并在顶层 RTL 中例化该 IP。编写测试激励,在仿真中观察输出时钟波形:确认 50 MHz 和 200 MHz 时钟的占空比接近 50%,且无毛刺。运行综合(Synthesis),检查资源报告:确认 MMCM 或 PLL 被正确推断。运行实现(Implementation),查看时序报告:确认所有时钟域满足建立/保持时间。
前置条件与环境
| 项目 | 推荐值 | 说明 / 替代方案 |
|---|---|---|
| 器件 / 板卡 | Xilinx Artix-7 (XC7A35T) 或更高 | Kintex-7, Virtex-7, Zynq-7000 |
| EDA 版本 | Vivado 2020.1 及以上 | ISE 14.7(仅支持 7 系列及更早器件) |
| 仿真器 | Vivado Simulator (xsim) 或 ModelSim | VCS, Questa |
| 时钟 / 复位 | 单端 100 MHz 板载时钟,异步复位(低有效) | 差分时钟(需 IBUFDS),同步复位亦可 |
| 接口依赖 | 无特殊接口,仅需时钟输入 | 若使用外部晶振,需确保时钟引脚为专用时钟输入(MRCC/SRCC) |
| 约束文件 | XDC 文件:定义输入时钟周期(create_clock) | — |
目标与验收标准
- 功能点:成功生成两个不同频率的时钟(50 MHz 和 200 MHz),且相位可调(如 0° 或 90°)。
- 性能指标:输出时钟抖动(Jitter)在数据手册范围内(典型值 < 1% UI)。
- 验收检查清单:
实施步骤
步骤 1:创建 Vivado 工程并例化 Clocking Wizard IP
在 Vivado 中新建工程,选择目标器件(如 Artix-7 XC7A35T)。打开 IP Catalog,搜索“Clocking Wizard”并双击例化。在配置界面中,设置输入时钟频率为 100 MHz,输出时钟数量为 2 个。分别设置输出时钟频率为 50 MHz 和 200 MHz。在“Output Clocks”选项卡中,为每个输出时钟选择“Use MMCM”或“Use PLL”。点击“Generate”生成 IP。
步骤 2:在顶层 RTL 中例化 IP
将生成的 IP 例化到顶层模块中。连接输入时钟(clk_in)、复位(reset)和 locked 信号。输出时钟(clk_out1 和 clk_out2)连接到后续逻辑。确保复位信号在输入时钟稳定后释放(可通过 locked 信号控制复位释放逻辑)。
步骤 3:编写测试激励并仿真
编写 testbench,提供 100 MHz 输入时钟,并施加复位。等待 locked 信号变高后,测量输出时钟频率和占空比。确认 50 MHz 和 200 MHz 时钟的占空比接近 50%,且无毛刺。仿真通过后,进行下一步。
步骤 4:综合与实现
运行综合,检查资源报告:确认 MMCM 或 PLL 被正确推断,并记录使用的资源数量。运行实现,查看时序报告:确认所有时钟域满足建立/保持时间。若有时序违规,调整约束或时钟配置。
验证结果
仿真波形显示:locked 信号在约 1 μs 后变高,clk_out1(50 MHz)周期为 20 ns,占空比 50%;clk_out2(200 MHz)周期为 5 ns,占空比 50%。无毛刺或异常跳变。综合报告显示使用了 1 个 MMCM(或 PLL),无其他时钟资源。时序报告显示所有路径建立/保持时间裕量 > 0,满足设计要求。
排障指南
- 问题:locked 信号始终为低
原因:输入时钟不稳定或频率超出范围;复位未释放。解决:检查输入时钟质量,确保复位信号在时钟稳定后释放。 - 问题:输出时钟频率不准确
原因:分频/倍频系数设置错误。解决:重新计算系数,确保满足整数比。 - 问题:仿真中时钟有毛刺
原因:仿真精度不足或激励问题。解决:设置仿真精度为 1 ps,并检查时钟连接。 - 问题:时序违规
原因:时钟约束不足或路径过长。解决:在 XDC 中正确约束输入时钟,并优化逻辑。
扩展:PLL 与 MMCM 的差异与选型建议
核心差异:
- MMCM(Mixed-Mode Clock Manager)相比 PLL 增加了相位插值(Phase Interpolator)和动态相位调整(Dynamic Phase Shift)功能,支持更精细的相位控制(步进约 1/56 个 VCO 周期)。
- PLL(Phase-Locked Loop)结构更简单,资源占用更少,适用于基本频率合成和相位锁定。
- 抖动性能:MMCM 通常具有更低的输出抖动,但功耗略高。
- 可用性:在 7 系列及更早器件中,MMCM 数量有限(通常 1-2 个),PLL 数量较多(4-6 个)。
选型建议:
- 若仅需基本频率合成(无相位调整需求),优先使用 PLL 以节省资源。
- 若需动态相位调整、低抖动或精细相位控制,使用 MMCM。
- 在高速接口(如 DDR、SerDes)中,建议使用 MMCM 以获得更好的时钟质量。
参考
- Xilinx UG472: Clocking Wizard v6.0 LogiCORE IP Product Guide
- Xilinx UG953: Vivado Design Suite 7 Series FPGA and Zynq-7000 SoC Libraries Guide
- Xilinx DS181: Artix-7 FPGAs Data Sheet: DC and AC Switching Characteristics
附录:常见 XDC 约束示例
以下为输入时钟约束示例:
create_clock -period 10.000 -name clk_in [get_ports clk_in]若需约束输出时钟,可在综合后使用 report_clocks 命令查看自动生成的时钟名称,并添加相应约束。



