大数跨境
0
0

衍生时钟约束方法

衍生时钟约束方法 至芯
2025-10-24
0

在 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. 注意事项

  1. 源点正确性
    -source 必须指向主时钟的传播路径上的点(如主时钟输入引脚、PLL 输入引脚),不可直接指向衍生时钟。
  2. 避免循环约束
    :衍生时钟不能作为自身或主时钟的源点,否则会导致时序分析错误。
  3. 时钟不确定性(Clock Uncertainty)
    :衍生时钟与主时钟之间的时序路径可能需要通过 set_clock_uncertainty 额外约束(如 PLL 的抖动)。
  4. 时钟组(Clock Groups)
    :若衍生时钟与其他时钟异步,需用 set_clock_groups 标记为异步,避免不必要的时序检查。
  5. 验证约束
    :通过 Vivado 的 Report Clock Networks 或 Report Timing 验证衍生时钟是否被正确识别(频率、相位等属性)。

5. 总结

衍生时钟约束的核心是通过 create_generated_clock 建立与主时钟的关联,明确分频 / 倍频、相位等参数。根据实际逻辑(如寄存器分频、PLL 输出)选择正确的源点和目标点,并通过报告工具验证约束有效性,可确保时序分析的准确性。

🌻亲爱的读者们,今天的分享就到这里啦!如果今天的内容对你有启发

记得点亮右下角的“❤️”或转发给需要的朋友,让温暖传递的更远!

生活或许没有标准答案,但每一次【分享】和【点赞】,都是我们相遇的印记。你最近有哪些感悟或故事?欢迎留言区聊一聊~~~

你的认可,是我们深夜码字的充电桩🔋

明天见!保持好奇,永远鲜活~

🔍关注我们,不错过每一次相遇图片图片图片

扫码领取免费学习资料~~~


往期精彩部分

国产 FPGA 厂商发展与核心企业介绍
PCIE总线发展趋势

【声明】内容源于网络
0
0
至芯
至芯科技关于FPGA信息的交流平台
内容 392
粉丝 0
至芯 至芯科技关于FPGA信息的交流平台
总阅读16
粉丝0
内容392