这一篇在干嘛?

这是 PH1P 原语库两连的第 2 篇,覆盖 UG1310 的 IO 族、时钟族(PH1P_PHY_* 里的时钟部分)、DSP 族和几个实用杂项。第 1 篇的逻辑与存储原语在这里。这一篇的主线是”信号从引脚进出芯片的全过程”:先过 IO 缓冲,再经延迟线/串并转换进逻辑,全程被时钟网络和 PLL 驱动。

IO 缓冲:单端与差分

DDR 与串并转换:IDDR、ODDR 和 SERDES

时钟资源原语:GCLK、LCLK、SCLK、HCLK 和 IOCLK

PLL:频率与相位的调整中心

DSP 系列:SIOU 与它的四个子单元

实用杂项:DNA、ECC、MBOOT 和 ADC

IO 缓冲:单端与差分

单端三件套

单端 IO 缓冲最简单,都是 i/o 两个端口的”直通”结构:

原语方向说明
PH1P_LOGIC_IBUF引脚 → 逻辑阵列输入缓冲
PH1P_LOGIC_OBUF逻辑阵列 → 引脚输出缓冲
PH1P_LOGIC_IOBUF双向输入输出控制模块
PH1P_LOGIC_IOTRIBUF双向三态t=0 时 io 输出 i,t=1 时 io 变输入高阻

IOTRIBUF 是做总线复用(如接 SRAM/并口设备)的核心:

PH1P_LOGIC_IOTRIBUF u_PH1P_LOGIC_IOTRIBUF (
    .i(i), .t(t), .o(o), .io(io)
);

差分缓冲

差分信号用 P/N 两根线的电压差传递信息,抗共模干扰能力强,时钟、高速数据、ADC 输入都走差分。

IBUF_DIFF(差分输入):i_p/i_n 进、o 出(单端到内部)。

PH1P_LOGIC_IBUF_DIFF 差分输入缓冲结构图

它还有端接电阻控制——interm_disable 端口与 DIFF_TERM 参数配合:

端接电阻状态interm_disableDIFF_TERM
使能端接电阻0”TRUE”
使能端接电阻0”FALSE”
使能端接电阻1”TRUE”
禁用端接电阻1”FALSE”

PH1P_LOGIC_IOBUF_DIFF 差分双向缓冲结构图

IOBUF_DIFF(差分双向):在差分输入输出基础上加三态控制,t=1io_p/io_n 输出正向/反向的 it=0 时转输入高阻态。OBUF_DIFF 则是纯差分输出三态缓冲。

常见坑:端接电阻双重控制的组合逻辑

注意上表:想让端接电阻禁用,必须 interm_disable=1 DIFF_TERM="FALSE" 同时满足;任何一个”使能”条件存在就会使能端接。差分时钟接不上或波形畸变时,先查这两项配置是否与板上硬件匹配。

DDR 与串并转换:IDDR、ODDR 和 SERDES

基础版:IDDR / ODDR

PH1P_LOGIC_IDDR 双沿采样单元结构图

DDR 接口在一个时钟周期内传两位数据(上升沿一位、下降沿一位),而内部逻辑只用单沿。IDDR 负责”收”——把双沿采样的 d 拆成上升沿数据 q0 和下降沿数据 q1;ODDR 负责”发”——把 d0/d1 合并成双沿输出 q

PH1P_LOGIC_IDDR #(
    .ASYNCRST("ENABLE"),
    .MODE("PIPED")          // 数据对齐模式
) u_PH1P_LOGIC_IDDR (
    .q1(q1), .q0(q0), .clk(clk), .d(d), .rst(rst)
);
 
PH1P_LOGIC_ODDR #(
    .ASYNCRST("ENABLE")
) u_PH1P_LOGIC_ODDR (
    .q(q), .d1(d1), .d0(d0), .clk(clk), .rst(rst)
);

增强版:IDDRx2 / ODDRx2 与 SERDES

数据速率更高时用 x2 版本:IDDRx2 是 1:4 串转并(一个 DDR 周期收 4bit,输出 q0~q3),ODDRx2 是 4:1 并转串。它们用两个时钟协作:sclk 是 1/2 数据速率的串行时钟,pclk 是 sclk 的一半(并行侧时钟)。

要 1:5、1:8 甚至 1:10 的比例,就得用 SERDES

PH1P_LOGIC_HR_ISERDES 串并转换单元结构图

原语方向端口模式参数
PH1P_LOGIC_HR_ISERDES串 → 并idata 1bit 进、odata 10bit 出IDDRMODE: DDRX1/X1_PIPE/X2/X3P5/X4/X5
PH1P_LOGIC_HR_OSERDES并 → 串idata 10bit 进、odata 1bit 出ODDRMODE: DDRX1/X2/X3P5/X4/X5
PH1P_LOGIC_HR_ISERDES #(
    .IDDRMODE("DDRX1")
) u_PH1P_LOGIC_HR_ISERDES (
    .sclk(sclk), .pclk(pclk), .rst(rst),
    .idata(idata), .odata(odata)
);

注意命名里带 HR/HD 前缀的原语是分 Bank 类型的:HR BANK 和 HD BANK 的 IO 特性不同,IDDR/ODELAY 等原语都有对应版本(如 PH1P_LOGIC_HD_IDDR 的 MODE 参数是 SAME_EDGE/SAME_EDGE_PIPE/OPPOSITE_EDGE 三种对齐模式,与 HR 版不同)。用之前先确认引脚落在哪个 Bank。

IDELAY:逐级可调的延迟线

高速源同步接口(数据与时钟一起传输)里,数据到达各引脚的偏斜需要用延迟线”追平”。DYNAMIC_HR_IDELAY/ODELAY 提供 8bit dly 端口动态调整延迟级数,还带 cas_i/cas_o/cas_rtn_i/cas_rtn_o 四个级联端口,可把多个延迟单元串成更长的延迟链:

PH1P_LOGIC_DYNAMIC_HR_IDELAY #(
    .CAS_MODE("NONE"),      // NONE/MASTER/MIDDLE/END
    .DEVICE("PH1P100")      // 必须与实际器件一致
) u_PH1P_LOGIC_DYNAMIC_HR_IDELAY (
    .i(i), .dly(dly), .o(o),
    .cas_i(cas_i), .cas_o(cas_o),
    .cas_rtn_i(cas_rtn_i), .cas_rtn_o(cas_rtn_o)
);

每一级延迟的时间值在《UG1311 PH1P 系列 FPGA IO 用户手册》里。不用级联功能时,四个 cas 端口悬空即可。

时钟资源原语:GCLK、LCLK、SCLK、HCLK 和 IOCLK

PH1P_PHY_GCLK 全局时钟切换器结构图

PH1P 的时钟网络是分层的,不同缓冲器覆盖不同范围——这是理解时钟原语的关键地图:

原语覆盖范围特色功能
PH1P_PHY_GCLK全局两路时钟无毛刺切换
PH1P_PHY_LCLK本地时序区域(每区域 4 个)内置 1~8 及 3.5 分频器
PH1P_PHY_MLCLK多区域(垂直相邻 3 个区域,每区域 4 个)简单缓冲+门控
PH1P_PHY_SCLK / SCLK_V2单个时钟区域(每区域 12 路)门控 + 0~3 级延迟,V2 支持动态延迟
PH1P_PHY_HCLK水平方向左右两个区域(12 路)门控 + 延迟
PH1P_PHY_IOCLKIO 列专用时钟网支撑 IO 串并转换的高速时钟
PH1P_PHY_OSCDIV片内 OSC 振荡器分频输出无外部时钟也能产生时钟

GCLK 最有实用价值的是无毛刺时钟切换clkin[1:0] 两路时钟,seln 低有效选择,drct=2'b00 时配置成无毛刺模式(切换时会丢一个时钟沿以避免毛刺),drct=2'b11 是普通模式(可能出毛刺)。真值表规定了 seln/cen 的组合行为,两路选择信号冲突时输出保持前一状态。

使用 GCLK 有两条硬性限制:其一,如果两路输入时钟有一路是恒定高电平,模块无法工作,必须保证一路为低;其二,不建议 seln[0]/seln[1] 和 cen[0]/cen[1] 同时使能,可能导致模块异常。

LCLK 的 DIV 参数支持 “1/2/3/3P5/4/5/6/7/8” 分频——注意有 3.5 分频这种非整数档位,做特殊时钟时很省事。OSCDIV 输出的 osc_clk 在 PH1P100 上还要再手动接一级 PH1P_PHY_MLCLK 才能驱动其他逻辑。

常见坑:时钟缓冲不是"随便接"

每种缓冲器的数量按区域分配(LCLK 每区域 4 个、SCLK 每区域 12 路),例化时综合器不做”你到底接没接对区域”的语义检查,布局布线阶段才报错。先在《UG1312 PH1P 系列 FPGA 时钟资源用户手册》里看清楚时钟树结构图再决定用哪一级缓冲。

PLL:频率与相位的调整中心

PH1P_PHY_PLL 锁相环结构图

PH1P_PHY_PLL(及 PLL_V2)是整个时钟系统的频率源:输入参考时钟 refclk,输出 clkc[6:0] 七路时钟加 clkcb[6:0] 七路反相时钟,支持频率调整、占空比调整、静态/动态相位移动。

频率由分频链决定:REFCLK_DIV(1128,输入分频)× VCO × 各通道输出分频,输出频率公式为 f_out = f_in / REFCLK_DIV × FBCLK_DIV / C_DIV(FBKCLK 反馈路径可选内部/外部)。每路输出还有 FPHASE(07 细调相位)和 DUTY50(占空比 50% 使能)参数。

动态特性通过一组专用端口实现:

  • 动态相移psclk/psclksel/psstep/psdown —— 用 psclksel 选通道、psstep 上升沿触发、psdown 选加或减,psdone 翻转表示完成;
  • 动态重配置(DRP)drp_clk/drp_sel/drp_rd/drp_wr/drp_addr/drp_wdata/drp_rdata/drp_rdy/drp_err —— 运行时改写 PLL 寄存器;
  • 展频(SSC):SSC_ENABLE=“ENABLE” 后可选 UP/DOWN/CENTER 三种展频模式,降低 EMI 辐射。
PH1P_PHY_PLL #(
    .FBKCLK("CLKC0_EXT"),
    .FIN("100.0000"),
    .REFCLK_DIV(1), .FBCLK_DIV(1),
    .SSC_ENABLE("DISABLE")
) u_PH1P_PHY_PLL (
    .refclk(refclk), .fbclk(fbclk),
    .pllpd(pllpd), .pllreset(pllreset),
    .clkc(clkc), .clkcb(clkcb), .lock(lock),
    .psclk(psclk), .psclksel(psclksel), .psstep(psstep), .psdown(psdown), .psdone(psdone)
    // DRP 端口按需连接
);

PLL 的核心状态信号是 lock:上电或复位后 PLL 重新捕捉,lock 拉高前输出的时钟不可信——所有下游逻辑必须等 lock 有效再释放复位。手册还提醒:切断输入时钟时 VCO 无法完全关闭,会存在最低振荡频率。

另外有一个小而重要的原语 PH1P_PHY_CLOCK_ALIGNER:对齐”参考时钟”和”参考时钟经过全局时钟网络后”两路时钟的相位差(refclk/fbclk 进、clk_out 出、lock 指示锁定),做高速源同步接口的时钟校正时用它。

DSP 系列:SIOU 与它的四个子单元

PH1P_PHY_DSPSIOU DSP 模块结构图

PH1P 的 DSP 是”1 大 4 小”结构:SIOU(信号输入输出与流水线管理单元)是总管家,下辖 AU(27bit 两输入预加器)、MU(27x18 乘法器)、TU(54bit 三输入加减器)、LU(54bit 逻辑运算单元)。平时只需例化 SIOU,它会根据你的配置自动给四个子单元分配数据和控制信号——AU/MU/TU/LU 的原语(DSPADD/DSPMULT/DSPTADD/DSPLOGIC)主要是给 IP Generator 内部用的。

SIOU 的数据通路:xa/xb(各 27bit)进 AU 或 MU,也可拼接成 54bit 进 TU;y(18bit)进 MU;z(54bit)进 TU;结果 p 最大 54bit 输出。运算模式由控制字决定,典型的乘累加配置是:

  • opctrl[0]:AU 做加(0)还是减(1);
  • opctrl[1]:MU 的输入选 xa(0)还是 AU 结果 add_sum(1)——选 add_sum 即实现 (xa+xb)×y 的预加乘;
  • opctrl[2]:MU 运算模式;
  • opctrl[3]/opctrl[10]:最终 p 选乘法结果、逻辑结果还是加法结果;
  • opctrl[7:4]:TU/LU 的运算模式(如 4’b0000 = a+b+c+ci)。

级联是 DSP 阵列的精髓:cxai/cxbi/cyai/cpi/cci 系列端口必须与前一级 DSP 直连(不能接外部信号、不能加寄存器、不能用 ChipWatcher 抓取),后级对应输出端口 cxao/cxbo/cyo/cpo/cco 接下一级。做 FIR 滤波、FFT 蝶形运算时,多个 DSP 通过级联形成流水线。

每个数据通路都有独立的寄存器级数参数(XAREG/XBREG/YREG/ZREG/CXAREG…,可选 0/1/2 级)和对应的时钟使能/复位选择参数(CEXA1、RSTXA1 等),全流水设计频率可以拉得很高。注意 inctrl[2:0](运行时选寄存器级数)优先级高于参数配置,opctrl[1] 优先级高于 inctrl[3]

PH1P_PHY_DSPSIOU #(
    .CLKMUX("SIG"), .CEMUX("SIG"), .RSTMUX("SIG"),
    .XAREG("1"), .XBREG("1"), .YREG("1"), .ZREG("1"),
    .SROMODE("ASYNC")
    // 其余寄存器/CE/RST 选择参数按流水需求配置
) u_PH1P_PHY_DSPSIOU (
    .clk(clk), .ce(ce), .rst(rst),
    .xa(xa), .xb(xb), .y(y), .z(z),
    .muxctrl(muxctrl), .inctrl(inctrl), .cinctrl(cinctrl), .opctrl(opctrl),
    .p(p), .overflow(overflow), .underflow(underflow), .wxor(wxor)
    // 级联端口按需连接
);

常见坑:DSP 别手搓,用 IP Generator

SIOU 的参数有一百多个,手册原话是”建议用户使用 IP 例化实现 DSP”。理解 opctrl/muxctrl 的语义是为了看懂 IP 生成的代码和调试信号,实际工程里在 IP Generator 里配”乘累加/预加乘”模板,比手写例化可靠得多。

实用杂项:DNA、ECC、MBOOT 和 ADC

DNA:每颗芯片的身份证

PH1P_LOGIC_DNA 可读出 64bit 芯片唯一 DNA,用于产品加密、防拷贝、设备序列号。接口是类 SPI 移位寄存器:dna_clk_i 时钟、dna_shift_n_i 低有效移位使能、dna_din_i 输入、dna_do_o 逐 bit 输出。读写时序详见《UG1305 PH1P 配置用户手册》。

ECC:配置存储器的自检

PH1P_LOGIC_ECC 对配置 SRAM 做在线校验:拉低 ecc_enable_n_i 发起,ecc_clk_o(2~11MHz 可配)是模块自带时钟,ecc_done_o 表示校验完成,ecc_info_o[37:0] 打包输出出错信息——帧地址 [37:15]、DWORD 地址 [14:8]、bit 地址 [7:3]、三类错误标志(sbit/dbit/gcrc)。SEC_OPTION 参数决定发现单 bit 错误后的行为(继续/暂停/修复后继续/修复后暂停),推荐用默认的 CORRECT_AND_CONTINUE 自动纠错。

MBOOT:多套位流轮换启动

在 SPI FLASH 里放两套位流:Primary 出问题时跳到备用位流重新配置。PH1P100 用 MBOOT(下降沿触发),PH1P35/50 用 MBOOT_V2(上升沿触发)——别用错版本。触发条件是 multiboot_code_i == 8'hA5,跳转地址可选静态参数(MULTBOOT_STATIC_ADDR)或动态端口输入。

ADC:片上逐次逼近模数转换器

PH1P_PHY_ADC 片内 ADC 结构框图

PH1P_PHY_ADC 是 12bit 逐次逼近 ADC,1 路专用差分通道(adc_vp/vn)+ 8 路辅助通道(adc_vauxp/n_18,adc_io_sel_n 低电平有效选通,最多同时使能一路)。控制流:adc_enable_n 低使能 → adc_soc 高启动转换 → adc_valid 拉高时从 adc_data[11:0] 取数。adc_ovsample_sel 支持 1/16/64/256 组采样取平均(2’b002’b11),用吞吐率换精度。adc_sel_ref[1] 还可选内部 0.95V 电压做自检输入——不接外部信号就能验证 ADC 通路好坏。

PH1P_PHY_ADC #(
    .VREF("1.20"), .FILE_PATH("path/file"), .CHANGE_CLK(1000)
) u_PH1P_PHY_ADC (
    .adc_clk(adc_clk), .adc_rst(adc_rst), .adc_enable_n(adc_enable_n),
    .adc_ovsample_sel(adc_ovsample_sel), .adc_soc(adc_soc),
    .adc_sel_diff(adc_sel_diff), .adc_sel_ref(adc_sel_ref),
    .adc_channel_en(adc_channel_en), .adc_channel_sel(adc_channel_sel),
    .adc_io_sel_n(adc_io_sel_n),
    .adc_data(adc_data), .adc_valid(adc_valid),
    .adc_vp(adc_vp), .adc_vn(adc_vn)
    // adc_vauxp/n_1~8 按板卡实际使用连接
);

通关标准:

① 能画出”引脚 → IBUF → IDELAY → IDDR/SERDES → 逻辑 → ODDR → OBUF → 引脚”的信号旅程图,并说出每一级原语的名字; ② 能按覆盖范围排出 GCLK > MLCLK > LCLK/SCLK/HCLK 的时钟层级,并解释 PLL 的 lock 信号为什么必须参与复位释放; ③ 能说出 DSP 的五大单元组成,解释 cxai/cxao 级联端口的连接规则(直连、不加寄存器)。