在 Vivado 中,衍生时钟(Derived Clocks)是由主时钟(Master Clock)通过分频、倍频、相位偏移或波形反相等操作生成的时钟信号,通常用于描述由 PLL、MMCM 或分频逻辑产生的时钟。对衍生时钟进行正确约束是确保时序分析准确性的关键,以下是常用的衍生时钟约束方法:
1. 基本概念
- 主时钟(Master Clock)
:直接由外部引脚输入的时钟(如晶振时钟),需先用 create_clock约束。 - 衍生时钟(Derived Clock)
:基于主时钟生成,需通过 create_generated_clock命令约束,其属性(频率、相位、占空比等)依赖于主时钟。
2. 核心约束命令:create_generated_clock
语法基本结构:
tcl create_generated_clock -name <衍生时钟名> \
-source <主时钟源点> \
-divide_by <分频系数> \ # 分频(默认1,不分频)
-multiply_by <倍频系数> \ # 倍频(默认1,不倍频)
-phase <相位偏移(度)> \ # 相位偏移(默认0)
-invert \ # 波形反转(可选)
<衍生时钟的目标点># 如寄存器输出、PLL输出引脚等
关键参数说明:
-name:衍生时钟的唯一标识名称。 -source:主时钟的源头,必须是已约束的主时钟(如输入引脚、PLL 输入等),需用绝对路径(如 [get_ports clk_in]或[get_pins pll_inst/clk_in])。-divide_by/ -multiply_by:分频 / 倍频系数(整数或小数,需确保结果为正数),最终频率 = 主时钟频率 × (multiply_by /divide_by)。-phase:相对于主时钟的相位偏移(单位:度),正数为滞后,负数为超前。 -invert:将时钟波形反转(占空比不变,相位偏移 180 度)。 -
目标点:衍生时钟的输出位置(如寄存器的时钟引脚、PLL 的输出引脚等)。
3. 常见应用场景
场景 1:简单分频(如寄存器分频)
例:主时钟 clk_in 频率为 100MHz,通过寄存器分频(二分频)得到 50MHz 时钟 clk_div2,约束如下:
tcl # 约束主时钟
create_clock -name clk_in -period 10 [get_ports clk_in]
# 约束衍生时钟(二分频)
create_generated_clock -name clk_div2 \
-source [get_ports clk_in] \ # 主时钟源
-divide_by 2 \ # 分频系数2
[get_pins div_reg/Q]# 分频寄存器的输出引脚(衍生时钟源)
场景 2:PLL/MMCM 生成的时钟
PLL/MMCM 是生成衍生时钟的典型器件,其输出时钟需基于输入主时钟约束。假设 PLL 输入为 100MHz,输出为 200MHz(倍频 2x)和 50MHz(分频 2x):
tcl # 约束PLL输入主时钟
create_clock -name clk_in -period 10 [get_ports clk_in]
# 约束PLL输出时钟(200MHz,倍频2x)
create_generated_clock -name clk_pll_200m \
-source [get_pins pll_inst/clk_in1] \ # PLL的输入引脚(主时钟连接点)
-multiply_by 2 \ # 倍频系数2
[get_pins pll_inst/clk_out1]# PLL输出引脚1
# 约束PLL输出时钟(50MHz,分频2x)
create_generated_clock -name clk_pll_50m \
-source [get_pins pll_inst/clk_in1] \
-divide_by 2 \ # 分频系数2
[get_pins pll_inst/clk_out2]# PLL输出引脚2
注意:Vivado 会自动识别 PLL/MMCM 的配置(如 IP 生成时的参数),但仍需显式约束以确保时序分析正确。
场景 3:相位偏移或波形反转
例:主时钟 100MHz,衍生时钟相位滞后 90 度,且波形反转(等效相位偏移 + 270 度):
tcl create_clock -name clk_in -period 10 [get_ports clk_in]
create_generated_clock -name clk_phase_shifted \
-source [get_ports clk_in] \
-phase 90 \ # 滞后90度
-invert \ # 反转波形(额外180度偏移)
[get_pins phase_reg/Q]
最终相位偏移为 90 + 180 = 270 度。
场景 4:多级分频(级联分频)
若衍生时钟由多级分频产生(如先二分频,再三分频),需基于上一级衍生时钟约束:
tcl # 主时钟100MHz
create_clock -name clk_in -period 10 [get_ports clk_in]
# 一级分频(2x,50MHz)
create_generated_clock -name clk_div2 -source [get_ports clk_in]-divide_by 2 [get_pins div2_reg/Q]
# 二级分频(3x,~16.67MHz),基于clk_div2
create_generated_clock -name clk_div6 -source [get_pins div2_reg/Q]-divide_by 3 [get_pins div3_reg/Q]
4. 注意事项
- 源点正确性
: -source必须指向主时钟的传播路径上的点(如主时钟输入引脚、PLL 输入引脚),不可直接指向衍生时钟。 - 避免循环约束
:衍生时钟不能作为自身或主时钟的源点,否则会导致时序分析错误。 - 时钟不确定性(Clock Uncertainty)
:衍生时钟与主时钟之间的时序路径可能需要通过 set_clock_uncertainty额外约束(如 PLL 的抖动)。 - 时钟组(Clock Groups)
:若衍生时钟与其他时钟异步,需用 set_clock_groups标记为异步,避免不必要的时序检查。 - 验证约束
:通过 Vivado 的 Report Clock Networks或Report Timing验证衍生时钟是否被正确识别(频率、相位等属性)。
5. 总结
衍生时钟约束的核心是通过 create_generated_clock 建立与主时钟的关联,明确分频 / 倍频、相位等参数。根据实际逻辑(如寄存器分频、PLL 输出)选择正确的源点和目标点,并通过报告工具验证约束有效性,可确保时序分析的准确性。
🌻亲爱的读者们,今天的分享就到这里啦!如果今天的内容对你有启发
记得点亮右下角的“❤️”或转发给需要的朋友,让温暖传递的更远!
生活或许没有标准答案,但每一次【分享】和【点赞】,都是我们相遇的印记。你最近有哪些感悟或故事?欢迎留言区聊一聊~~~
你的认可,是我们深夜码字的充电桩🔋
明天见!保持好奇,永远鲜活~
🔍关注我们,不错过每一次相遇


扫码领取免费学习资料~~~
往期精彩部分

