这一篇在干嘛?

承接 📘 原语库(一):时钟与 PLL 族原语,本篇把 UG1110 剩下的三大块讲完:IO 族(从最简单的 IBUF 到 HP Bank 的 SERDES,共 18 个原语按四组讲)、专用功能族(多重启动 MBOOT、芯片指纹 DNA、配置存储 ECC 校验)、运算与存储族(DSP 的五个子单元和两种 ERAM)。目录页在 20 · 原语库:PH2A(UG1110)。读完你应当能独立判断”这个需求要不要例化原语、例化哪个”。

IO 缓冲基础:IBUF / OBUF / IBUFDIFF / IOTRIBUF

HD Bank DDR 采样:HD_IDDR 与 HD_ODDR

HD Bank 串并转换:IDDRx2 与 ODDRx2 家族

HD Bank 动态延迟:DYNAMIC_HD_IDELAY / ODELAY

HP Bank 高性能 IO:IDDR / ODDR / ISERDES / OSERDES

专用功能:MBOOT 多重启动、DNA 芯片指纹、ECC 校验

DSP 家族:五个子单元与 DSPSIOU 的控制字

ERAM:20K 与 144K 两种片上存储

IO 缓冲基础:IBUF / OBUF / IBUFDIFF / IOTRIBUF

这四个是 IO 族里最”薄”的原语,平时综合器会自动推断插入,但做引脚级精细控制或 Schematic 级设计时需要手动例化。

原语功能端口要点
PH2_LOGIC_IBUF从输入引脚驱动到逻辑阵列的 IO 缓冲器i 输入、o 输出,各 1bit
PH2_LOGIC_OBUF从逻辑阵列驱动到输出引脚的 IO 缓冲器i 输入、o 输出,各 1bit
PH2_LOGIC_IBUFDIFF差分输入转两路单端输出到 ISERDESi 输入、o(电平同 lvds_p 端)、ob(电平同 lvds_n 端)
PH2_LOGIC_IOTRIBUF三态 IO 控制模块i 数据、t 三态控制、o 回读输出、io 双向引脚

IOTRIBUF 的行为要背下来:t=1'b0o 输出 i 信号、io 对外输出 it=1'b1o 输出高阻态(用于回读引脚实际电平)、io 呈高阻。注意 t高有效的高阻,和许多平台的低有效约定相反。

PH2_LOGIC_IOTRIBUF u_PH2_LOGIC_IOTRIBUF (
    .i (i),
    .t (t),
    .o (o),
    .io(io)
);

IBUFDIFF 的两路输出 o/ob 分别跟随差分对的 p/n 端电平,专为把 LVDS 差分数据送进 ISERDES 做准备——如果你只是要一个普通的单端信号,不需要它。

HD Bank DDR 采样:HD_IDDR 与 HD_ODDR

PH2A 的 IO 分 HD Bank(High Density,高密度)与 HP Bank(High Performance,高性能)两族,DDR 类原语成对出现。先看 HD Bank。

PH2_LOGIC_HD_IDDR 符号图:clk/d/rst 输入,q0/q1 输出

PH2_LOGIC_HD_IDDR 是 HD Bank IO 上的”双沿采样转单沿”单元:引脚上跑的是 DDR 数据(时钟上下沿都有数据),内部逻辑只吃单沿时钟。IDDR 内部是数据对齐的双速率 D 触发器,把输入 DDR 数据转成 2 位数据同步到内部时钟网络——q0 是上升沿数据、q1 是下降沿数据。

参数可选值默认值描述
ASYNCRST”ENABLE”, “DISABLE""ENABLE”异步复位使能,控制 rst 是否生效
MODE1”SAME_EDGE”, “SAME_EDGE_PIPE”, “OPPOSITE_EDGE""OPPOSITE_EDGE”数据对齐模式
PH2_LOGIC_HD_IDDR #(
    .ASYNCRST("ENABLE"),
    .MODE    ("OPPOSITE_EDGE")
) u_PH2_LOGIC_HD_IDDR (
    .q1 (q1),
    .q0 (q0),
    .clk(clk),
    .d  (d),
    .rst(rst)
);

三种对齐模式的差别在 q0/q1 相对时钟沿的输出时机(具体时序图见《UG1111 PH2A 系列 FPGA IO 用户手册》):OPPOSITE_EDGE 两路各自在对应沿输出;SAME_EDGE 把两路对齐到同一个沿;SAME_EDGE_PIPE 再加一级流水。初学者建议从 OPPOSITE_EDGE 起步,需要单沿统一处理时再换 SAME_EDGE 系。

PH2_LOGIC_HD_ODDR 反向操作:内部单沿数据 d0(上升沿值)/d1(下降沿值)合成为 1 位 DDR 数据 q 输出到引脚,实现数据双倍率输出。参数只有 ASYNCRST 一个。典型用途:往 DDR 存储器、LVDS 屏发数据,或用 ODDR 把内部单沿时钟”镜像”成 DDR 时钟送出引脚。

HD Bank 串并转换:IDDRx2 与 ODDRx2 家族

当接口速率更高、单沿采样来不及处理时,需要”串转并”降速。PH2_LOGIC_HD_IDDRx2 是 HD Bank IO 上的 1:4 串转并单元:引脚串行数据 d 按 DDR 采样,输出 4 位并行数据 q0~q3

端口方向位宽描述
sclkinput11/2 数据速率的时钟输入
pclkinput1时钟输入,频率为 sclk 的 1/2
dinput1串行数据输入
q0~q3output各1并行输出的第 0~3 bit
rstinput1复位信号,高有效

PH2_LOGIC_HD_IDDRx2 符号图:sclk/pclk/rst/d 输入,q0~q3 输出

时序关系要捋清楚:引脚数据率 = 2×sclk,sclk = 2×pclk,所以 4bit 并行数据的更新率是 pclk。IDDRx2 需要外部同时给 sclk 和 pclk 两路时钟(通常来自 PLL 的两路同源输出);而 PH2_LOGIC_HD_IDDRx2L 是省事版本——直接使用内部 sclk 的 2 分频作为 pclk,节省 1 个 clk 资源,端口里就不再有 pclk。两者参数都只有 ASYNCRST

输出侧对称:PH2_LOGIC_HD_ODDRx24:1 并转串单元,输入 d0~d3,输出 q,手册注明”先输出低 bit 数据”(d0 最先上引脚);PH2_LOGIC_HD_ODDRx2L 同样省掉 pclk 输入。这一家四口覆盖了 HD Bank 上绝大多数中速源同步接口的需求。

常见坑:x2 与 x2L 的选择不只是"少接一根线"——x2L 内部分频后的 pclk 相位是固定的,如果你的并行逻辑时钟必须与芯片内其他模块同源同相,用 x2 并从 PLL 显式引出 pclk 更可控。另外手册例化示例里 ODDRx2L 的实例名写作 u_LOGIC_ODDRx2l(小写 l),例化时原语名务必保持官方大小写。

HD Bank 动态延迟:DYNAMIC_HD_IDELAY / ODELAY

源同步接口的 setup/hold 裕量不足时,第一招不是调频而是调延迟PH2_LOGIC_DYNAMIC_HD_IDELAY 是 HD Bank IO 输入端口上的动态延迟调节模块:

端口方向位宽描述
iinput1动态调节信号输入
in_dly_eninput1动态调节使能,高有效
in_dlyinput7动态延迟设置,可设置范围 0~95
ooutput1延迟调节输出
PH2_LOGIC_DYNAMIC_HD_IDELAY u_PH2_LOGIC_DYNAMIC_HD_IDELAY (
    .i        (i),
    .in_dly_en(in_dly_en),
    .in_dly   (in_dly),
    .o        (o)
);

7bit 的 in_dly 值得注意:范围 095,说明底层有 96 级延迟链(SDL96),每级的具体延迟单位见《UG1111 IO 用户手册》。PH2_LOGIC_DYNAMIC_HD_ODELAY 是输出侧的对称版本(端口 out_dly_en/out_dly,同样 095),可以用来对齐多路输出信号间的 skews。

HP Bank 高性能 IO:IDDR / ODDR / ISERDES / OSERDES

HP Bank 的原语命名与 HD Bank 平行,但能力更强、控制更细,代价是端口更多。

PH2_LOGIC_HP_IDDR 与 HD 版本功能相同(DDR 转两路单沿),但复位体系不同:复位端口叫 sr,参数有三个——RSTMODE(“SYNC_REMOVE” 同步复位 / “ASYNC” 异步,默认 ASYNC)、MODE(SAME_EDGE / SAME_EDGE_PIPE / OPPOSITE_EDGE)、ACTMODE(复位有效电平,“HIGH”/“LOW”,默认 “LOW”,即低电平复位)。

PH2_LOGIC_HP_ODDR 比 HD 版多两个参数:SRMODE(复位有效时 q 端输出 “RESET” 低电平 / “SET” 高电平)和 ACTMODE。把输出复位电平做成可配置,是因为有些协议(如 JESD204B)对上电初始电平有要求。

PH2_LOGIC_HP_ISERDES 符号图:pclk/sclk/rst_n/idata/dl_en_n/dl_type/dl_code 输入,odata[7:0]/odata_vld 输出

PH2_LOGIC_HP_ISERDES 把外部串行数据转成多路并行数据,比 IDDRx2 更专业:

端口方向位宽描述
sclk / pclkinput1/1串行时钟 / 并行时钟输入
rst_ninput1复位信号,低电平复位
idatainput1串行数据输入
dl_en_ninput1数据延迟输入使能
dl_typeinput2延迟类型:2’b10 选 SDL64,2’b11 选 SDL32
dl_codeinput7延迟值:dl_type=2’b10 时 dl_code[5:0] 有效;2’b11 时 [6:2] 有效
odataoutput8并行数据输出
odata_vldoutput1并行输出有效信号

参数 MODE1 选 “DDR14”(1:4)或 “DDR18”(1:8,默认),DLY_MODE 打开/关闭数据延迟。带 odata_vld 有效指示意味着可以异步对接下游 FIFO,不用自己数节拍。

PH2_LOGIC_HP_OSERDES 符号图:8bit 并行输入转 1bit 串行输出

PH2_LOGIC_HP_OSERDES 是输出侧镜像:8bit idata 并行输入转 1bit odata 串行输出,MODE 选 “DDR41”(4:1)或 “DDR81”(8:1,默认),dl_type 的取值与 ISERDES 不同——2’b00 选 SDL96、2’b01 选 SDL32,且 SDL96 时 dl_code[6:0] 全部有效。PH2_LOGIC_DYNAMIC_HP_IDELAY/ODELAY 是 HP 版动态延迟模块,端口风格变为 dl_en_n/dl_type/dl_code,手册明确要求它们必须配合 HP_IDDR/HP_ODDR 使用(模块输出接 IDDR/ODDR 输入)。

常见坑:HD 与 HP 两族的延迟端口约定不一致——HD 族用 in_dly_en/in_dly(高有效使能),HP 族用 dl_en_n/dl_type/dl_code(低有效使能 + 类型/数值分离),SDL 类型映射也不同(HP_ISERDES 的 2'b10 是 SDL64,HP_OSERDES 的 2'b00 是 SDL96)。抄代码时最容易踩这组差异。

专用功能:MBOOT 多重启动、DNA 芯片指纹、ECC 校验

PH2_LOGIC_MBOOT 符号图:multiboot_en_n_i/multiboot_code_i[7:0]/multiboot_addr_i[31:0] 输入

PH2_LOGIC_MBOOT 实现多启动:可以在 SPI FLASH 里放两套或多套位流,上电先加载 Primary 位流,运行中由用户逻辑触发跳转到指定地址重新加载。端口三个:multiboot_en_n_i(控制,低有效)、multiboot_code_i[7:0]必须等于 8’hA5 多重启动才生效,防误触发)、multiboot_addr_i[31:0](重启地址)。参数 MULTBOOT_ADDRSRC_SEL 选 “STATIC”(地址由参数 MULTBOOT_STATIC_ADDR 给出,默认 32’h0200_0000)或 “DYNAMIC”(地址从端口输入)。

PH2_LOGIC_MBOOT #(
    .MULTBOOT_ADDRSRC_SEL("STATIC"),
    .MULTBOOT_STATIC_ADDR(32'h0200_0000)
) u_PH2_LOGIC_MBOOT (
    .multiboot_en_n_i (multiboot_en_n_i),
    .multiboot_code_i (multiboot_code_i),
    .multiboot_addr_i (multiboot_addr_i)
);

PH2_LOGIC_DNA 让你读取 64 位芯片唯一 DNA——每颗芯片出厂固化、全球唯一的身份码。端口是典型的移位寄存器接口:dna_clk_i 时钟、dna_shift_n_i(低有效使能)、dna_din_i 用户数据入、dna_do_o 数据出,逐 bit 移出。典型用法:产品序列号绑定、加密授权(把 DNA 做散列参与解密,实现”一机一密”)。读写时序见《UG1105 PH2A 配置用户手册》。

PH2_LOGIC_ECC 监视配置帧的完整性:不断回读配置数据,每一帧算出一个校验值,能检测单 bit 和双 bit 错误。端口核心是 ecc_info_o[38:0] 输出:[37:15] 配置帧地址、[14:8] 帧内 DWORD 地址(0~90,每帧 91 个 DWORD)、[7:3] DWORD 内 bit 地址、[2] Sbit_Error、[1] Dbit_error、[0] gcrc_error。三个关键参数:ECC_PROTECT(“ENABLE” 时检测到单 bit 错误做二次校验)、SEC_OPTION(四档策略:“CONTINUE” 不管错误继续、“HOLD” 停止等重启、“CORRECT_AND_CONTINUE” 修复后继续、“CORRECT_AND_HOLD” 修复后停止)、ECCERR_REPORT_EN(“ENABLE” 时错误会把 INITN 引脚拉低)。注意握手细节:拉低 ecc_enable_n_i 启动后要等 ecc_stop_o 变低才真正运行;主动停止后必须等 ecc_stop_o 回高才能重新发起。

DSP 家族:五个子单元与 DSPSIOU 的控制字

PH2A 的 DSP 模块被拆成五个原语:PH2_PHY_DSPADD(AU,27bit 两输入预加器)、PH2_PHY_DSPMULT(MU,27×18bit 乘法器,输出 45bit)、PH2_PHY_DSPLOGIC(LU,48bit 三输入逻辑运算单元,含 2bit 宽位异或输出 wxor)、PH2_PHY_DSPTADD(TU,四输入 48bit 加减器,带 ci/co/overflow/underflow)和 PH2_PHY_DSPSIOU(总线与流水线管理单元)。

关键认知是:AU/MU/LU/TU 四个单元都与 SIOU 互联,用户使用 DSP 原语时无需单独配置它们,SIOU 会根据配置自动分配数据和控制信号——手册在四个子单元的”简介”里都重复了这句话,且都标注”建议用户使用 IP 例化实现”。也就是说 DSPADD/DSPMULT/DSPLOGIC/DSPTADD 这四个原语基本是给软件工具用的”内部接口”,你手写乘法 a*b、加法 a+b+c+d 时综合器会自动映射进 DSP。

真正值得读懂的是 PH2_PHY_DSPSIOU 的架构:它包含 AU、MU、TU、LU 和流水线管理五大单元,数据端口有 y[17:0]xa[26:0](可作 AU/MU 输入,还能与 xb 拼接 xa[20:0],xb 作为 TU 输入)、xb[26:0]z[47:0],控制端口是四组控制字:muxctrl[8:0](TU 四个输入各自的数据源选择)、inctrl[6:0](AU/MU 输入与寄存器级数选择)、cinctrl[2:0](TU 进位来源,8 选 1)、opctrl[11:0](运算模式总控)。

PH2_PHY_DSPSIOU 完整符号图:左侧数据/控制/级联输入,右侧结果与级联输出

几个控制字的代表性含义(完整表格见原书):

控制字作用示例
opctrl[0]AU 运算模式0: add_sum=add_a+add_b;1: add_a-add_b
opctrl[2]MU 运算模式0: mult_sum=mult_xmult_x[17:0];1: mult_xmult_y
opctrl[3]输出 p 选择0: p=mult_sum;1: p=tadd_sum 或 logic_p
muxctrl[1:0]tadd_a 数据源2’b10: 取 mult_sum 符号扩展;2’b11: 取 p_reg
cinctrl[2:0]tadd_ci 来源3’b001: 取级联 cci;3’b110: 取 mult_sum[44]

opctrl[8:4] 编码 TU/LU 的运算模式,覆盖 a±b±c±d 的全部 16 种组合,还支持 24bit 高低半段独立加减(如 5’b00001 时 sum[23:0] 与 sum[47:24] 分别按各自符号相加)——做 SIMD 式双 24bit 并行加法就靠这个编码。

参数体系围绕流水线寄存器:XAREG/XBREG/YREG/CXAREG/CXBREG/CYREG(“0”/“1”/“2” 级)、ZREG/MREG/POUWREG/CCOREG 等(“0”/“1” 级),SR0MODE~SR3MODE 对应 rst[3:0] 各组的同步/异步复位,CLKMUX/CEMUX/RSTMUX 控制时钟/使能/复位极性,XA_INPUT/XB_INPUT/Y_INPUT 决定各输入取端口还是级联端口。级联端口(cxai/cxbi/cxabi/cyi/cpi/cci 及对应输出)必须与前一级 DSP 直连,不能接外部信号、不能添加寄存器、不能用 ChipWatcher 抓取——做 FIR 滤波器级联多颗 DSP 时这条是硬约束。

常见坑:想用 p_reg 回灌做累加时,手册明确 POUWREG 必须配为 1(输出经一级寄存);用 cco_reg 做进位回灌同理要求 CCOREG=1。竞赛里实现乘累加(MAC),除非有极致的流水线需求,否则直接用 IP Generator 生成 DSP IP 更稳妥。

ERAM:20K 与 144K 两种片上存储

PH2_PHY_ERAM 符号图:A/B 双端口各 16bit 数据、11bit 地址及级联/ECC 端口

PH2_PHY_ERAM 对应片内 ERAM20K 资源,可实现单口 RAM、双口 RAM、简单双口 RAM,内嵌硬件 FIFO 控制器,支持实时深度指示和 Read Ahead 模式。它的端口极多(A/B 两个对称端口,每个含数据 dia/doa 16bit、地址 addra 11bit(16K 深度)、时钟/使能/字节使能 bea[1:0],以及成对的硬件级联端口 addra_ci/co、doa_ci/co 等),但核心参数可以归成五组:

参数组关键参数说明
容量形态MODE:“FIFO20K”/“RAM”(默认 RAM)选 FIFO 模式时硬件控制器接管读写指针
位宽DATA_WIDTH_A/B:1,2,5,10,20,40(默认 20)位宽换深度,20Kbit 总量不变
输出寄存REGMODE_A/B:“NOREG”/“OUTREG”OUTREG 增加一级输出寄存,时序更优、延迟 +1 拍
写模式WRITEMODE_A/B:“WRITE_DISABLE_READ”/“READ_BEFORE_WRITE”/“WRITE_BEFORE_READ”冲突时的读写次序
ECCECC_ENCODE/ECC_DECODE/ECC_PIPELINE:“DISABLE”/“ENABLE”编解码与流水线使能

此外 RESETMODE_A/B 支持 “ASYNC_RESET”/“SYNC_RESET”/“ASYNC_RESET_SYNC_RELEASE” 三种复位模式(默认 SYNC_RESET),CSA_MASK/CSB_MASK(0-7)用于多颗 ERAM 级联时的地址扩展。字节使能 bea[1:0] 支持 9bit 符号位场景(位宽 5/10/20/40 时带校验位)。

PH2_PHY_ERAM #(
    .READBACK   ("DISABLE"),
    .MODE       ("RAM"),
    .DATA_WIDTH_A(20),
    .DATA_WIDTH_B(20),
    .REGMODE_A  ("NOREG"),
    .REGMODE_B  ("NOREG"),
    .WRITEMODE_A("WRITE_DISABLE_READ"),
    .WRITEMODE_B("WRITE_DISABLE_READ"),
    .RESETMODE_A("SYNC_RESET"),
    .RESETMODE_B("SYNC_RESET")
) u_PH2_PHY_ERAM (
    .dia  (dia),  .addra(addra), .clka(clka),
    .cea  (cea),  .wea  (wea),   .bea (bea),
    .doa  (doa),
    .dib  (dib),  .addrb(addrb), .clkb(clkb),
    .ceb  (ceb),  .web  (web),   .beb (beb),
    .dob  (dob)
);

PH2_PHY_ERAM_144K 符号图:72bit 数据、9bit 字节使能、成对级联端口

PH2_PHY_ERAM_144K 对应片内 144K 大块存储,同样支持单口/双口/简单双口 RAM。与 20K 版本的关键差异:数据端口宽达 72bit(dia/dib[71:0])、字节使能 9bit(bea/beb[8:0])、时钟只有单一 clk(两端口共用)而非每端口独立时钟;级联体系更完整(ci_* / co_* 成对端口覆盖数据、地址、控制、ECC 标志),参数 CASMODE_A/B 用 “NONE”/“FIRST”/“MIDDLE”/“LAST” 显式声明本块在级联链中的位置。ECC 同样按端口独立使能(ECC_ENCODE_A/B、ECC_DECODE_A/B),且带错误注入端口 ecc_injsbiterr/ecc_injdbiterr 供仿真验证。

常见坑:两种 ERAM 都支持 IP Generator,且 ERAM 端口数量是原语库之最(几十个级联端口),手写例化极易漏接。竞赛中直接用 IP Generator 生成所需位宽/深度的 RAM 或 FIFO,把级联(如 2 片拼 32bit 位宽)交给工具处理;原语例化留给确实需要硬件级联超深 FIFO 的高级场景。

通关标准:

  1. 能画出 HD_IDDRx2 的时钟树(数据率 = 2×sclk = 4×pclk),并说出 x2L 版本省掉了什么。
  2. 能写出 MBOOT 的触发条件(en_n_i 拉低 + code_i=8’hA5)并解释静态/动态地址的区别。
  3. 能说出 ERAM20K 与 ERAM144K 的三点差异(容量/端口位宽/时钟结构)并据此选型。