这一篇在干嘛?

UG1110《SALPHOENIX2A Series FPGA Libraries Guide for HDL Designs》收录了 46 个原语,本篇负责其中与时钟相关的约 18 个。核心回答三个问题:为什么高扇出信号必须插时钟缓冲?怎么用原语做无毛刺的时钟门控、分频与切换?PLL/DPLL 的几十个参数到底在配什么?同系列另一篇见 📘 原语库(二):IO、DSP 与存储族原语,目录页在 20 · 原语库:PH2A(UG1110)

原语的两大门派:LOGIC 封装 vs PHY 物理

全局时钟缓冲三兄弟:BUFG / BUFG_CE / BUFG_CE_1

带分频与屏蔽的时钟缓冲:BUFG_CE_DIV 与 BUFG_HXT

无毛刺时钟切换:BUFG_MUX 系列与 BUFG_CTRL

物理层时钟原语:SBUF / CBUF / DBUF / DBUF_HXT

片上振荡器与 HP Bank 时钟:OSCDIV / HP_IODIV / HP_BYTECLK_RX

PLL:8 路输出的频率发动机

DPLL:为高速接口去偏斜而生

原语的两大门派:LOGIC 封装 vs PHY 物理

UG1110 里的 46 个原语名字有两种前缀:PH2_LOGIC_*PH2_PHY_*。这不是随便起的——LOGIC 原语是物理单元的”易用封装”,手册里反复出现一句话:“PH2_LOGIC_XXX 是在 PH2_PHY_YYY 基础上(直接)封装一层的逻辑原语”。比如 PH2_LOGIC_BUFG 封装自 PH2_PHY_SBUFPH2_LOGIC_BUFG_MUX 封装自 PH2_PHY_CBUF

封装层做了什么?把多比特控制端口拆成单 bit 端口(BUFG_CTRL 相对 CBUF)、把极性参数变得对用户友好、把默认值调成最常见的配置。所以选型口诀:能例化 LOGIC 原语就优先用 LOGIC,只有 LOGIC 层没暴露的功能(比如 CBUF 的真值表级精细控制)才下沉到 PHY 原语

另一个贯穿全书的规律:几乎所有时钟原语都有 CLKINV/USRCLKINV(输入极性)、RST_MODE/RSTMODE(同步/异步复位)、CEINV(使能极性)这类参数。它们的取值就两个字符串:"SIG" 表示保持原信号,"INV" 表示取反。

常见坑:手册里大部分原语的"使用方式"表格写着 IP Generator = 否,意味着这些单元在 TD 的 IP 生成器里没有对应界面,只能手写例化。但也有例外——PLL、DPLL、DSP、ERAM 都支持 IP Generator,竞赛里强烈建议优先走 IP 界面,别跟几十个参数硬刚。

全局时钟缓冲三兄弟:BUFG / BUFG_CE / BUFG_CE_1

PH2_LOGIC_BUFG 是最简单的全局时钟缓冲:一个输入 clkin、一个输出 clkout,无参数。它的价值在于 FPGA 内部的高扇出网络必须靠它来驱动——时钟、同步复位、时钟使能这类信号要扇出到成百上千个触发器,直接用普通布线会又慢又偏斜。BUFG 输出”延迟和抖动小”,专门接 HRTK/HDTK/VDTK 时钟干道。

PH2_LOGIC_BUFG u_PH2_LOGIC_BUFG (
    .clkin(clkin),
    .clkout(clkout)
);

PH2_LOGIC_BUFG_CE 在此之上加了一个时钟使能 ce(默认高有效),并且支持无毛刺的时钟门控——这是它和”用与门做门控”的本质区别。与门门控在时钟高电平期间切使能会产生毛刺截波,而 BUFG_CE 内部做了同步处理,输出永远是完整的时钟周期。它有三个参数:

参数可选值默认值描述
CLKINV”SIG”, “INV""SIG”时钟输入极性,“INV” 将 clkin 翻转
CEINV”SIG”, “INV""SIG”时钟使能输入极性
RSTMODE”SYNC”, “ASYNC""ASYNC”GSR 复位模式
PH2_LOGIC_BUFG_CE #(
    .CLKINV ("SIG"),
    .CEINV  ("SIG"),
    .RSTMODE("ASYNC")
) u_PH2_LOGIC_BUFG_CE (
    .clkin (clkin),
    .ce    (ce),
    .clkout(clkout)
);

PH2_LOGIC_BUFG_CE_1 功能与 BUFG_CE 相同(一进一使能一出),但封装自 PH2_PHY_CBUF 而非 PH2_PHY_SBUF,且没有任何参数——控制粒度更粗、用起来更省事。三者的选择:纯放大扇出用 BUFG;要动态开关时钟用 BUFG_CE;不在乎极性微调、只求简单用 BUFG_CE_1。

带分频与屏蔽的时钟缓冲:BUFG_CE_DIV 与 BUFG_HXT

PH2_LOGIC_BUFG_CE_DIV 封装自 PH2_PHY_DBUF,是”门控 + 分频”二合一:一个时钟输入、使能 ce、复位 rst 和时钟输出,支持 1~8 整数分频。当你需要一个低频低速时钟(比如给外设的 12.5MHz 扫描脉冲),又不想为它单独开一个 PLL 通道时,用它最划算。

参数可选值默认值描述
DIV1, 2, 3, 4, 5, 6, 7, 81时钟分频系数
CLKINV”SIG”, “INV""SIG”时钟输入极性
CEINV”SIG”, “INV""SIG”时钟使能极性
RST_MODE”SYNC”, “ASYNC""SYNC”GSR 复位模式
CLKOUT_MODE”BYPASS”, “DIV2T08”, “CLKDIV1""CLKDIV1”时钟输出模式
PH2_LOGIC_BUFG_CE_DIV #(
    .DIV        (2'd4),
    .CLKINV     ("SIG"),
    .CEINV      ("SIG"),
    .RST_MODE   ("SYNC"),
    .CLKOUT_MODE("CLKDIV1")
) u_PH2_LOGIC_BUFG_CE_DIV (
    .clkin (clkin),
    .ce    (ce),
    .rst   (rst),
    .clkout(clkout)
);

PH2_LOGIC_BUFG_CE_DIV 符号图:clkin/ce/rst 三个输入和一个 clkout

PH2_LOGIC_BUFG_HXT 同样封装自 PH2_PHY_DBUF_HXT,参数表与 BUFG_CE_DIV 几乎一致,但多了两个屏蔽端口

端口方向位宽描述
ce_maskinput1时钟使能屏蔽,默认高有效:为 1 时外部 ce 无效
rst_maskinput1复位屏蔽,默认高有效:为 1 时外部 rst 无效

它面向的场景是 HXT(高速收发器)时钟进入通用时钟网络:TX/RX 恢复出来的时钟要分频后使用,而屏蔽端口允许上层模块”夺走”控制权。手册特别注明:动态切换 DIV 和 ce_mask/rst_mask 时必须处于复位状态,rst 支持异步复位同步释放(同步释放需要 2 个输入时钟的延迟)。

常见坑:BUFG_CE_DIV 和 BUFG_HXT 的 CLKOUT_MODE 有三种输出模式,默认值不一样(前者 "CLKDIV1",物理层 DBUF 默认 "GND")。如果综合出来时钟输出恒为 0,先查 CLKOUT_MODE 是不是配成了 "GND"。

无毛刺时钟切换:BUFG_MUX 系列与 BUFG_CTRL

系统里经常有两路时钟(比如外部晶振和 PLL 输出)要热切换,直接用二选一多路器会在切换瞬间产生截波毛刺,下游计数器全体崩坏。PH2A 为此准备了一组”无毛刺切换”原语,全都封装自 PH2_PHY_CBUF

PH2_LOGIC_BUFG_MUXPH2_LOGIC_BUFG_MUX_1 端口完全一致:clkin0/clkin1 两路输入、sel 一位选择(1’b1 输出 clkin1,1’b0 输出 clkin0)、一个 clkout,均无参数。区别只在时序行为:MUX 是下降沿触发,MUX_1 是上升沿触发——这是为了让切换动作分别对齐两种相位习惯的下游电路。

PH2_LOGIC_BUFG_MUX u_PH2_LOGIC_BUFG_MUX (
    .clkin0(clkin0),
    .clkin1(clkin1),
    .sel   (sel),
    .clkout(clkout)
);

PH2_LOGIC_BUFG_CTRL 符号图:sel0/sel1/ce0/ce1/drct0/drct1/clkin0/clkin1 输入,clkout 输出

PH2_LOGIC_BUFG_CTRL 是这个家族里控制最全的:把 CBUF 的多比特端口拆成单 bit,加入 drct0/drct1 无毛刺切换使能(drct=1’b0 时执行无毛刺切换),参数有 INIT_OUT(无选择时输出保持值)、PRESELECT(预选 “CLK0”/“CLK1”)以及 sel/ce 的极性参数(注意默认值是 “INV”)。

PH2_LOGIC_BUFG_CTRL #(
    .INIT_OUT  (1'b0),
    .PRESELECT ("CLK0"),
    .SELINV0   ("INV"),
    .SELINV1   ("INV"),
    .CEINV0    ("INV"),
    .CEINV1    ("INV")
) u_PH2_LOGIC_BUFG_CTRL (
    .sel0  (sel0),
    .sel1  (sel1),
    .ce0   (ce0),
    .ce1   (ce1),
    .drct0 (drct0),
    .drct1 (drct1),
    .clkin0(clkin0),
    .clkin1(clkin1),
    .clkout(clkout)
);

常见坑(手册原文注释):

  1. 如果输入的两路时钟里其中一路为高电平,整个 GCLK 模块无法正常工作,需要强迫一路输入为低。
  2. 不建议 sel0/sel1 和 ce0/ce1 同时使能,可能导致 GCLK 模块无法正常工作。 PH2_LOGIC_BUFG_MUX_CTRL 则是 BUFG_MUX 的”带使能版”,端口与 MUX 一致但行为更接近 CTRL。选型总结:固定二选一用 MUX/MUX_1,需要门控与 drct 精细控制用 CTRL。

物理层时钟原语:SBUF / CBUF / DBUF / DBUF_HXT

前面所有 LOGIC 原语的”地基”是这四个 PHY 原语。竞赛里 90% 的情况用不到它们,但读懂它们才能理解封装层省略了什么。

PH2_PHY_SBUF 符号图:clkin、ce 输入和 clkout 输出

PH2_PHY_SBUF(Single Buffer)是全局时钟缓冲本体,支持无毛刺时钟门控,输出直接驱动 HRTK/HDTK/VDTK 时钟干道。参数五个:CE_BYPASS(默认 “ENABLE”,旁路使能)、GSR(默认 “DISABLE”)、USRCLKINVCEINVRSTMODE(默认 “ASYNC”)。

PH2_PHY_CBUF 两路时钟选择缓冲符号

PH2_PHY_CBUF(Center Buffer)是两路时钟的选择缓冲器,端口是多比特风格:clkin[1:0]ce_n[1:0](默认低有效)、sel_n[1:0](默认低有效)、drct_n[1:0](drct=2’b00 时无毛刺切换)、单端输出 clkout。参数 PRESELECTHOLD(无选择时输出保持,默认 “YES”)、SEL_TRIGGER(捕获沿 “POS”/“NEG”)、GSR 及各极性。它还给出了完整的真值表:

sel_n[0]ce_n[0]sel_n[1]ce_n[1]clkout
00x1clkout 输出 clkin[0]
001xclkout 输出 clkin[0]
x100clkout 输出 clkin[1]
1x00clkout 输出 clkin[1]
0000clkout 保持输出前一状态

表中未列出的状态,clkout 输出取决于 SEL_TRIGGER 的设定:设置 “POS” 输出高电平,设置 “NEG” 输出低电平。

PH2_PHY_DBUF 全局时钟分频缓冲符号

PH2_PHY_DBUF(Division Buffer)是分频缓冲本体,支持 1~8 分频,参数比封装层多出 GSRCE_BYPASS,且 CLKOUT_MODE 多一个 “GND” 选项(默认就是 “GND”,意味着不显式配置时输出接地——这正是前面说的坑)。PH2_PHY_DBUF_HXT 与之类似但时钟来自 HXT PHY,并带 ce_mask/rst_mask 屏蔽端口。

片上振荡器与 HP Bank 时钟:OSCDIV / HP_IODIV / HP_BYTECLK_RX

PH2_PHY_OSCDIV 也许是整个原语库里”性价比”最高的一个:PH2A 片内自带一个 OSC 振荡器,不需要任何外部引脚就能产生时钟。上电后逻辑还没加载、外部晶振还没起振时的看门狗喂狗、多启动切换逻辑、慢速状态机,都可以拿它当”救命时钟”。

端口方向位宽描述
rstinput1OSCDIV 复位,高电平有效
divinput7分频系数 0~127:0 为 1 分频,127 为 128 分频
stdbyinput1stdby=1’b1 时钟暂停输出,1’b0 正常输出
osc_clkoutput1OSCDIV 模块时钟输出
PH2_PHY_OSCDIV u_PH2_PHY_OSCDIV (
    .rst    (rst),
    .div    (div),
    .stdby  (stdby),
    .osc_clk(osc_clk)
);

PH2_PHY_OSCDIV 符号图:rst/div/stdby 输入,osc_clk 输出

注意 div输入端口而不是参数——意味着分频系数可以运行时动态修改,这是它比 BUFG_CE_DIV 的 DIV 参数更灵活的地方。代价是 OSC 的绝对频率精度很差,只能用于不在乎精度的场合,绝不能拿它做通信协议的波特率时钟。

另外两个 HP Bank 时钟原语面向高速源同步接口:PH2_PHY_HP_IODIV 对 BYTE_CLK/GCLK IO 输入时钟分频,参数 DIV(07)与 BYPASS(默认 “ENABLE”,旁路时输出直连输入、分频系数无效);PH2_PHY_HP_BYTECLK_RX 用于同步采样场景下输入随路时钟与 IOL 的连接和延时调整,端口含 sclk(DPLL 时钟)、rsb_clkrdqs_in 数据、dl_update/dl_type/dl_code/dl_gate 延时控制,输出 rdqs_t/rdqs_c 上下沿采样时钟、dl_done 延时完成标志和可级联的 rdqs_out。参数有 RDQS_LOC(选择输入 IO 位于 Byte 的位置 T0T3)、RDQS_MD(只能选 IO BANK 的 N0 或 N6 管脚)、RDQS_SRC(数据来源:当前 Bank/级联/DPLL/RSB)、CASCADE 以及 SDL96/SDL32_T/SDL32_C 三组延迟级数。做 DDR 类接口采样时它们才登场。

PLL:8 路输出的频率发动机

PH2_PHY_PLL 是 PH2A 的主锁相环,能做频率合成(倍频/分频)、占空比调整、相位调整和动态相位移动。它的端口多达二十余个,核心几组:

端口方向位宽描述
refclkinput2参考时钟输入,两路可选
refclk_selinput11’b1 选 refclk[0],1’b0 选 refclk[1]
fbclkinput1反馈时钟输入
clkc_rstinput2输出时钟复位,[0] 控制 clkout_c[0:3],[1] 控制 clkout_c[4:7]
pllpdinput1PLL 电源开关,高电平关断
pllresetinput1PLL 复位,高有效
psclk / psclksel / psstep / psdowninput1/3/1/1动态相移:时钟 / 通道选择 / 触发(上升沿)/ 方向
clkc_eninput8输出时钟使能
ssc_resetinput1展频使能复位,开启 SSC 功能时固定接 1
cps_stepinput1动态粗调信号,下降沿脉冲触发
clkcoutput8PLL 时钟输出
clkcboutput8与 clkc 反相的输出
lockoutput1内部锁定信号,高有效
int_lockoutput1内部反馈模式初始化锁定标志
psdoneoutput1动态相位移位完成

PH2_PHY_PLL 符号图:refclk/refclk_sel/fbclk/clkc_rst/pllpd/pllreset/psclk 等输入,clkc[7:0]/clkcb[7:0]/lock/int_lock/psdone 输出

参数体系围绕”VCO”展开:REFCLK_DIV(1-128,输入分频)把参考时钟降频,VCO 倍频到高频,再经每路通道的分频器输出。FBKCLK/FBKCLK_INT 选择反馈路径(外部 CLKC_EXT 或内部 CLKC_INT);CLKC0_FPHASE ~ CLKC7_FPHASE(0-7)设置每路输出的细调相位;PREDIV_MUXC0 ~ PREDIV_MUXC7 选择每路进分频器的时钟源头(VCO/CLK*_INT/REFCLK 等)。FIN0/FIN1 只是软件标记输入频率,不影响硬件。

竞赛实战建议:PLL 支持 IP Generator,直接用 TD 的 PLL IP 界面配置频率和相位,让它替你算 REFCLK_DIV/分频系数;只有需要动态相移(psclk/psstep/psdown 那一套握手)时才需要关心原语端口。 手册还提醒:切断输入时钟时 PLL 的 VCO 无法完全关闭,会存在最低震荡频率,通道输出频率由每通道分频系数和具体芯片决定。

DPLL:为高速接口去偏斜而生

PH2_PHY_DPLL(De-Skew PLL)与主 PLL 定位完全不同:它是高带宽、低抖动的去偏斜锁相环,输入输出范围宽、抖动性能好、电源噪声抗干扰强,专为”时钟从引脚进、再原样对齐回来”的去偏斜应用设计——典型场景就是 HP Bank 的源同步接口:外部随路时钟经 DPLL 整形后供给 ISERDES/OSERDES 的 pclk/sclk。

端口方向位宽描述
refclkinput1参考时钟输入
fbclkinput1反馈时钟输入
init_start_ninput1CLK ALIGNER 与 BCG 模块触发信号,需低脉冲(宽度至少 250ns)
pllpdinput1DPLL 掉电,高有效
align_fbclkinput2对齐反馈时钟:经走线、SBUF 延迟后的 clkc 反馈输入
clkcoutput2DPLL 时钟输出
callockoutput1校准时钟锁定标志
lockoutput1DPLL 时钟锁定标志
pclkoutput2并行时钟输出,供 HP Bank IO SERDES
sclkoutput2串行时钟输出,供 HP Bank IO SERDES

参数方面:REFCLK_DIV/FBCLK_DIV 只有 1/2/4 三档;POST_DIV(0-7)对应 1/2/4/8/16/32/64/128 分频;VCO_SEL 选 1X 或 1/2X VCO;DPLL_LOC 选 “DPLL0”/“DPLL1”(片内有两颗);DPLL_FEED_TYPE 选内/外反馈(内反馈只能用 clkc[0],外反馈 clkc[0]/clkc[1] 均可);SCLK0_MODE/SCLK1_MODE 设置 sclk 与 pclk 的频率比 X1/X2/X4;HPIOBYTE_DISABLE 可按 Byte 关闭 pclk/sclk 输出;ALIGNER0_EN/ALIGNER1_EN 打开时钟对齐。

PH2_PHY_DPLL #(
    .REFCLK_DIV      (1),
    .FBCLK_DIV       (1),
    .POST_DIV        (0),
    .VCO_SEL         (0),
    .DPLL_LOC        ("DPLL0"),
    .FIN             ("100"),
    .DSKWCAL_EN      ("ENABLE"),
    .DPLL_FEED_TYPE  ("INTERNAL"),
    .HPIOBYTE_DISABLE(2'b00),
    .SCLK0_MODE      ("X1"),
    .SCLK1_MODE      ("X1"),
    .ALIGNER0_EN     ("DISABLE"),
    .ALIGNER1_EN     ("DISABLE")
) u_PH2_PHY_DPLL (
    .refclk      (refclk),
    .fbclk       (fbclk),
    .init_start_n(init_start_n),
    .pllpd       (pllpd),
    .align_fbclk (align_fbclk),
    .clkc        (clkc),
    .callock     (callock),
    .lock        (lock),
    .pclk        (pclk),
    .sclk        (sclk)
);

常见坑:手册强调用户应持续关注 DPLL 的 lock 信号是否为高,并且建议等输入信号稳定后再对 DPLL 复位,以保证输出时钟频率和相位稳定。init_start_n 的低脉冲宽度必须 ≥250ns,否则 CLK ALIGNER/BCG 不会正确启动。

通关标准:

  1. 能解释 BUFG、BUFG_CE、BUFG_CE_1 的差异,并根据”是否需要门控/是否需要极性参数”选型。
  2. 能写出 BUFG_CE_DIV 的例化代码,把 50MHz 时钟分到 10MHz 且不产生毛刺截波。
  3. 能说出 PLL 的 clkc/clkcb/lock/int_lock/psdone 各端口作用,以及动态相移四件套(psclk/psclksel/psstep/psdown)的握手过程。

=2'b00 且 ce_n[1:0]=2'b00 时 clkout 输出什么?

按真值表,此时两个通道同时有效,clkout 保持输出前一状态(HOLD 行为)。若处于真值表未列出的其他状态,输出取决于 SEL_TRIGGER 参数:“POS” 输出高电平,“NEG” 输出低电平。