这一篇在干嘛?
UG1110《SALPHOENIX2A Series FPGA Libraries Guide for HDL Designs》收录了 46 个原语,本篇负责其中与时钟相关的约 18 个。核心回答三个问题:为什么高扇出信号必须插时钟缓冲?怎么用原语做无毛刺的时钟门控、分频与切换?PLL/DPLL 的几十个参数到底在配什么?同系列另一篇见 📘 原语库(二):IO、DSP 与存储族原语,目录页在 20 · 原语库:PH2A(UG1110)。
全局时钟缓冲三兄弟: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
原语的两大门派:LOGIC 封装 vs PHY 物理
UG1110 里的 46 个原语名字有两种前缀:PH2_LOGIC_* 和 PH2_PHY_*。这不是随便起的——LOGIC 原语是物理单元的”易用封装”,手册里反复出现一句话:“PH2_LOGIC_XXX 是在 PH2_PHY_YYY 基础上(直接)封装一层的逻辑原语”。比如 PH2_LOGIC_BUFG 封装自 PH2_PHY_SBUF,PH2_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 通道时,用它最划算。
| 参数 | 可选值 | 默认值 | 描述 |
|---|---|---|---|
| DIV | 1, 2, 3, 4, 5, 6, 7, 8 | 1 | 时钟分频系数 |
| 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_HXT 同样封装自 PH2_PHY_DBUF_HXT,参数表与 BUFG_CE_DIV 几乎一致,但多了两个屏蔽端口:
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| ce_mask | input | 1 | 时钟使能屏蔽,默认高有效:为 1 时外部 ce 无效 |
| rst_mask | input | 1 | 复位屏蔽,默认高有效:为 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_MUX 和 PH2_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 是这个家族里控制最全的:把 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)
);常见坑(手册原文注释):
- 如果输入的两路时钟里其中一路为高电平,整个 GCLK 模块无法正常工作,需要强迫一路输入为低。
- 不建议 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(Single Buffer)是全局时钟缓冲本体,支持无毛刺时钟门控,输出直接驱动 HRTK/HDTK/VDTK 时钟干道。参数五个:CE_BYPASS(默认 “ENABLE”,旁路使能)、GSR(默认 “DISABLE”)、USRCLKINV、CEINV、RSTMODE(默认 “ASYNC”)。

PH2_PHY_CBUF(Center Buffer)是两路时钟的选择缓冲器,端口是多比特风格:clkin[1:0]、ce_n[1:0](默认低有效)、sel_n[1:0](默认低有效)、drct_n[1:0](drct=2’b00 时无毛刺切换)、单端输出 clkout。参数 PRESELECT、HOLD(无选择时输出保持,默认 “YES”)、SEL_TRIGGER(捕获沿 “POS”/“NEG”)、GSR 及各极性。它还给出了完整的真值表:
| sel_n[0] | ce_n[0] | sel_n[1] | ce_n[1] | clkout |
|---|---|---|---|---|
| 0 | 0 | x | 1 | clkout 输出 clkin[0] |
| 0 | 0 | 1 | x | clkout 输出 clkin[0] |
| x | 1 | 0 | 0 | clkout 输出 clkin[1] |
| 1 | x | 0 | 0 | clkout 输出 clkin[1] |
| 0 | 0 | 0 | 0 | clkout 保持输出前一状态 |
表中未列出的状态,clkout 输出取决于 SEL_TRIGGER 的设定:设置 “POS” 输出高电平,设置 “NEG” 输出低电平。

PH2_PHY_DBUF(Division Buffer)是分频缓冲本体,支持 1~8 分频,参数比封装层多出 GSR、CE_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 振荡器,不需要任何外部引脚就能产生时钟。上电后逻辑还没加载、外部晶振还没起振时的看门狗喂狗、多启动切换逻辑、慢速状态机,都可以拿它当”救命时钟”。
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| rst | input | 1 | OSCDIV 复位,高电平有效 |
| div | input | 7 | 分频系数 0~127:0 为 1 分频,127 为 128 分频 |
| stdby | input | 1 | stdby=1’b1 时钟暂停输出,1’b0 正常输出 |
| osc_clk | output | 1 | OSCDIV 模块时钟输出 |
PH2_PHY_OSCDIV u_PH2_PHY_OSCDIV (
.rst (rst),
.div (div),
.stdby (stdby),
.osc_clk(osc_clk)
);
注意 div 是输入端口而不是参数——意味着分频系数可以运行时动态修改,这是它比 BUFG_CE_DIV 的 DIV 参数更灵活的地方。代价是 OSC 的绝对频率精度很差,只能用于不在乎精度的场合,绝不能拿它做通信协议的波特率时钟。
另外两个 HP Bank 时钟原语面向高速源同步接口:PH2_PHY_HP_IODIV 对 BYTE_CLK/GCLK IO 输入时钟分频,参数 DIV(07)与 T3)、BYPASS(默认 “ENABLE”,旁路时输出直连输入、分频系数无效);PH2_PHY_HP_BYTECLK_RX 用于同步采样场景下输入随路时钟与 IOL 的连接和延时调整,端口含 sclk(DPLL 时钟)、rsb_clk、rdqs_in 数据、dl_update/dl_type/dl_code/dl_gate 延时控制,输出 rdqs_t/rdqs_c 上下沿采样时钟、dl_done 延时完成标志和可级联的 rdqs_out。参数有 RDQS_LOC(选择输入 IO 位于 Byte 的位置 T0RDQS_MD(只能选 IO BANK 的 N0 或 N6 管脚)、RDQS_SRC(数据来源:当前 Bank/级联/DPLL/RSB)、CASCADE 以及 SDL96/SDL32_T/SDL32_C 三组延迟级数。做 DDR 类接口采样时它们才登场。
PLL:8 路输出的频率发动机
PH2_PHY_PLL 是 PH2A 的主锁相环,能做频率合成(倍频/分频)、占空比调整、相位调整和动态相位移动。它的端口多达二十余个,核心几组:
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| refclk | input | 2 | 参考时钟输入,两路可选 |
| refclk_sel | input | 1 | 1’b1 选 refclk[0],1’b0 选 refclk[1] |
| fbclk | input | 1 | 反馈时钟输入 |
| clkc_rst | input | 2 | 输出时钟复位,[0] 控制 clkout_c[0:3],[1] 控制 clkout_c[4:7] |
| pllpd | input | 1 | PLL 电源开关,高电平关断 |
| pllreset | input | 1 | PLL 复位,高有效 |
| psclk / psclksel / psstep / psdown | input | 1/3/1/1 | 动态相移:时钟 / 通道选择 / 触发(上升沿)/ 方向 |
| clkc_en | input | 8 | 输出时钟使能 |
| ssc_reset | input | 1 | 展频使能复位,开启 SSC 功能时固定接 1 |
| cps_step | input | 1 | 动态粗调信号,下降沿脉冲触发 |
| clkc | output | 8 | PLL 时钟输出 |
| clkcb | output | 8 | 与 clkc 反相的输出 |
| lock | output | 1 | 内部锁定信号,高有效 |
| int_lock | output | 1 | 内部反馈模式初始化锁定标志 |
| psdone | output | 1 | 动态相位移位完成 |
![PH2_PHY_PLL 符号图:refclk/refclk_sel/fbclk/clkc_rst/pllpd/pllreset/psclk 等输入,clkc[7:0]/clkcb[7:0]/lock/int_lock/psdone 输出](../../images/td/原语库-ph2a/p2a-08.jpg)
参数体系围绕”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。
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| refclk | input | 1 | 参考时钟输入 |
| fbclk | input | 1 | 反馈时钟输入 |
| init_start_n | input | 1 | CLK ALIGNER 与 BCG 模块触发信号,需低脉冲(宽度至少 250ns) |
| pllpd | input | 1 | DPLL 掉电,高有效 |
| align_fbclk | input | 2 | 对齐反馈时钟:经走线、SBUF 延迟后的 clkc 反馈输入 |
| clkc | output | 2 | DPLL 时钟输出 |
| callock | output | 1 | 校准时钟锁定标志 |
| lock | output | 1 | DPLL 时钟锁定标志 |
| pclk | output | 2 | 并行时钟输出,供 HP Bank IO SERDES |
| sclk | output | 2 | 串行时钟输出,供 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 不会正确启动。
通关标准:
- 能解释 BUFG、BUFG_CE、BUFG_CE_1 的差异,并根据”是否需要门控/是否需要极性参数”选型。
- 能写出 BUFG_CE_DIV 的例化代码,把 50MHz 时钟分到 10MHz 且不产生毛刺截波。
- 能说出 PLL 的 clkc/clkcb/lock/int_lock/psdone 各端口作用,以及动态相移四件套(psclk/psclksel/psstep/psdown)的握手过程。
自测:为什么不能用普通与门实现时钟门控?
与门门控时,如果 ce 在时钟高电平期间翻转,输出会截掉半个脉冲形成毛刺,下游所有触发器可能误触发。PH2_LOGIC_BUFG_CE 内部做了使能与时钟的同步处理,保证只在完整时钟边界开关,输出无毛刺,且其输出直接驱动 HRTK/HDTK/VDTK 干道,扇出与偏斜都有保障。
自测:BUFG_MUX 和 BUFG_MUX_1 端口一致,区别是什么?
时序行为不同:PH2_LOGIC_BUFG_MUX 是下降沿触发,PH2_LOGIC_BUFG_MUX_1 是上升沿触发。应根据下游电路捕获沿的习惯选择对应版本,避免切换瞬间在半周期边界产生不确定状态。
=2'b00 且 ce_n[1:0]=2'b00 时 clkout 输出什么?
按真值表,此时两个通道同时有效,clkout 保持输出前一状态(HOLD 行为)。若处于真值表未列出的其他状态,输出取决于 SEL_TRIGGER 参数:“POS” 输出高电平,“NEG” 输出低电平。
自测:OSCDIV 的 div 为什么是输入端口而不是参数?这带来什么能力与限制?
div 是 7bit 输入端口,可在运行中动态改写分频系数(1~128 分频),适合动态调节的看门狗/低速唤醒时钟。限制是片内 OSC 频率精度差、受工艺电压温度影响大,不能用于通信协议等需要精确频率的场合。
自测:DPLL 与普通 PLL 的定位差异是什么?
PLL 做频率合成:倍频、分频、占空比与相位调整,8 路输出服务全局时钟网络。DPLL 是高带宽低抖动的去偏斜锁相环,输出固定为 2 路 clkc 加 2 路 pclk/sclk(供 HP Bank SERDES),核心能力是把反馈时钟经外部走线/SBUF 延迟对齐回来,消除输入端相位偏斜,用于源同步接口。