这一篇在干嘛?
承接 📘 原语库(一):时钟与 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 校验
IO 缓冲基础:IBUF / OBUF / IBUFDIFF / IOTRIBUF
这四个是 IO 族里最”薄”的原语,平时综合器会自动推断插入,但做引脚级精细控制或 Schematic 级设计时需要手动例化。
| 原语 | 功能 | 端口要点 |
|---|---|---|
| PH2_LOGIC_IBUF | 从输入引脚驱动到逻辑阵列的 IO 缓冲器 | i 输入、o 输出,各 1bit |
| PH2_LOGIC_OBUF | 从逻辑阵列驱动到输出引脚的 IO 缓冲器 | i 输入、o 输出,各 1bit |
| PH2_LOGIC_IBUFDIFF | 差分输入转两路单端输出到 ISERDES | i 输入、o(电平同 lvds_p 端)、ob(电平同 lvds_n 端) |
| PH2_LOGIC_IOTRIBUF | 三态 IO 控制模块 | i 数据、t 三态控制、o 回读输出、io 双向引脚 |
IOTRIBUF 的行为要背下来:t=1'b0 时 o 输出 i 信号、io 对外输出 i;t=1'b1 时 o 输出高阻态(用于回读引脚实际电平)、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 是 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。
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| sclk | input | 1 | 1/2 数据速率的时钟输入 |
| pclk | input | 1 | 时钟输入,频率为 sclk 的 1/2 |
| d | input | 1 | 串行数据输入 |
| q0~q3 | output | 各1 | 并行输出的第 0~3 bit |
| rst | input | 1 | 复位信号,高有效 |

时序关系要捋清楚:引脚数据率 = 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_ODDRx2 是 4: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 输入端口上的动态延迟调节模块:
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| i | input | 1 | 动态调节信号输入 |
| in_dly_en | input | 1 | 动态调节使能,高有效 |
| in_dly | input | 7 | 动态延迟设置,可设置范围 0~95 |
| o | output | 1 | 延迟调节输出 |
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 用户手册》。95),可以用来对齐多路输出信号间的 skews。PH2_LOGIC_DYNAMIC_HD_ODELAY 是输出侧的对称版本(端口 out_dly_en/out_dly,同样 0
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 输出](../../images/td/原语库-ph2a/p2a-11.jpg)
PH2_LOGIC_HP_ISERDES 把外部串行数据转成多路并行数据,比 IDDRx2 更专业:
| 端口 | 方向 | 位宽 | 描述 |
|---|---|---|---|
| sclk / pclk | input | 1/1 | 串行时钟 / 并行时钟输入 |
| rst_n | input | 1 | 复位信号,低电平复位 |
| idata | input | 1 | 串行数据输入 |
| dl_en_n | input | 1 | 数据延迟输入使能 |
| dl_type | input | 2 | 延迟类型:2’b10 选 SDL64,2’b11 选 SDL32 |
| dl_code | input | 7 | 延迟值:dl_type=2’b10 时 dl_code[5:0] 有效;2’b11 时 [6:2] 有效 |
| odata | output | 8 | 并行数据输出 |
| odata_vld | output | 1 | 并行输出有效信号 |
参数 MODE1 选 “DDR14”(1:4)或 “DDR18”(1:8,默认),DLY_MODE 打开/关闭数据延迟。带 odata_vld 有效指示意味着可以异步对接下游 FIFO,不用自己数节拍。

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] 输入](../../images/td/原语库-ph2a/p2a-13.jpg)
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](运算模式总控)。

几个控制字的代表性含义(完整表格见原书):
| 控制字 | 作用 | 示例 |
|---|---|---|
| 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 对应片内 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” | 冲突时的读写次序 |
| ECC | ECC_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 对应片内 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 的高级场景。
通关标准:
- 能画出 HD_IDDRx2 的时钟树(数据率 = 2×sclk = 4×pclk),并说出 x2L 版本省掉了什么。
- 能写出 MBOOT 的触发条件(en_n_i 拉低 + code_i=8’hA5)并解释静态/动态地址的区别。
- 能说出 ERAM20K 与 ERAM144K 的三点差异(容量/端口位宽/时钟结构)并据此选型。
自测:IOTRIBUF 的 t 端口为 1'b1 时,o 和 io 各输出什么?
t=1’b1 表示三态:io 引脚呈高阻态(释放总线),o 输出高阻态值供内部回读引脚实际电平。t=1’b0 时 io 对外输出 i 信号,o 同样输出 i。注意 t 是高有效的高阻控制,与某些平台的低有效约定相反。
自测:HD Bank 的 IDDRx2 与 IDDRx2L 如何选择?
IDDRx2 需要外部同时提供 sclk(1/2 数据率)和 pclk(sclk 的 1/2)两路同源时钟,pclk 相相由 PLL 精确控制,适合与片内其他逻辑严格同相的场景;IDDRx2L 直接使用内部 sclk 的 2 分频作为 pclk,节省一个时钟资源,端口更简,但 pclk 相位固定。对齐要求高选 x2,省资源选 x2L。
自测:HP_OSERDES 的 dl_type 取值 2'b00 和 2'b01 分别对应什么延迟链?与 HP_ISERDES 的映射一样吗?
HP_OSERDES:2’b00 选 SDL96(dl_code[6:0] 有效),2’b01 选 SDL32(dl_code[6:2] 有效)。HP_ISERDES 则是 2’b10 选 SDL64、2’b11 选 SDL32。两者映射不同,抄写延迟控制代码时必须区分输入/输出侧。
自测:DSPSIOU 的级联端口为什么不能经过寄存器或 ChipWatcher?
级联端口(cxai/cxbi/cxabi/cyi/cpi/cci)是相邻 DSP 之间的专用硬布线通道,保证级联延迟最小且确定。若中间插入寄存器或可观测逻辑,就走通用布线了,时序模型失效、级联流水被打断,因此手册要求直连、不加寄存器、不用 ChipWatcher 抓取。
自测:需要 1 个 2048×32bit 的异步双口 RAM,用 ERAM20K 还是 ERAM144K?位宽怎么配?
用 ERAM20K:总量 20Kbit,2048×32bit 需 64Kbit,单颗放不下,需两颗或改用 ERAM144K(144Kbit 单颗可容纳)。ERAM144K 的 DATA 宽度 72bit 天然支持 72bit 位宽配置,且支持双口;但注意其 A/B 端口共用单一时钟,若要求两个端口异步时钟域,应选每端口独立时钟的 ERAM20K 方案(拆两颗级联)。