作者:FPGA入门到精通
7 系列的 IDELAYE2 代码不能直接搬到 UltraScale 上,这是因为7 系列的 I/O 逻辑是 ILOGIC / OLOGIC 加 ISERDESE2 / OSERDESE2 拼出来的,UltraScale 把这套整个拆掉,改成以 nibble 为粒度的 BITSLICE 结构。
延迟线从 32 抽头扩到 512 抽头,分辨率从「能算出的确定值」变成「随 PVT 漂移的区间值」,而 ISERDESE3 干脆把 Bitslip 拿掉了。
这篇按 UG571(v1.15)和 UG974 的原语定义,把这几处差异拆开讲,顺带给出迁移时要核对的清单。
一、从 ILOGIC/OLOGIC 到 BITSLICE
每个 nibble 里有一对 RX_BITSLICE 和 TX_BITSLICE,配一个 BITSLICE_CONTROL 统一控制。
串并转换、并串转换、寄存、输入输出延迟,全在 BITSLICE 内部完成,输入路径上还带一个小 FIFO。
直接用 BITSLICE 的用法叫 Native Mode。要走这条路,先用 IP 库里的 High-Speed SelectIO Wizard 验证配置,不建议手搓。
层级是这样叠的:
HP/HR Bank(52 IO pin,48 可配单端 / 24 差分对)
└── 4 × Byte Group
└── 2 × Nibble Group
├── Upper Nibble:7 个 single-ended IOB(或 3 差分 + 1 单端)
└── Lower Nibble:6 个 single-ended IOB(或 3 差分)
每 nibble:1 × BITSLICE_CONTROL + 6~7 × RXTX_BITSLICE
二、Bank 还是三类,但 HD 是坑
Bank 类型 | 电压上限 | 定位 | 高级特性 |
|---|---|---|---|
HP | 1.8V | 高速接口、存储器 | 支持 I/O SERDES、IDELAY、ODELAY、DCI;Zynq/Kintex/Virtex UltraScale+ 额外增强 MIPI D-PHY |
HR | 3.3V | 通用宽电压 I/O | 支持 I/O SERDES、IDELAY |
HD | 低速率 | 低速接口 | 无 I/O SERDES、无 I/O Delay;仅单端 + LVDS(外部端接)+ SSTL/HSTL,速率上限约 250 Mb/s |
Zynq UltraScale+ MPSoC、Kria SOM 上常见 HD 和 HP 混排。
选管脚时如果没先确认 Bank 类型,想用 IDELAYE3 却落在 HD Bank 上,编译直接不过,报错信息还不太指出根因。
三、原语对照:改名的、删功能的
不想走 native mode,可以像 7 系列那样直接例化组件原语:
UltraScale 原语 | 功能 | 对应 7 系列 | 关键差异 |
|---|---|---|---|
IDDRE1 | 输入 DDR 触发器 | IDDR | 更名 + 端口简化 |
ODDRE1 | 输出 DDR 触发器 | ODDR | 更名 + 端口简化 |
ISERDESE3 | 输入解串 | ISERDESE2 | 取消 Bitslip;DDR 1:8 / 1:4,SDR 1:4 / 1:2 |
OSERDESE3 | 输出串化 | OSERDESE2 | DDR 8:1 / 4:1,SDR 4:1 / 2:1 |
IDELAYE3 | 输入精细延迟(512 抽头) | IDELAYE2(32 抽头) | 抽头数 ×16,支持 COUNT/TIME 双模式 |
ODELAYE3 | 输出精细延迟(512 抽头) | ODELAYE2 | 同上 |
IDELAYCTRL | 延迟线校准参考 | IDELAYCTRL | 概念沿用,频率范围放宽 |
改名的两个还好办,把 ISERDESE2 换成 ISERDESE3 的时候才会卡住:找不到 Bitslip 端口了。
7 系列靠它做字对齐,UltraScale 上要么自己在 fabric 里写移位对齐状态机,要么改用 native mode 的 BITSLICE 方案。DDR 和源同步接口迁移,翻车最多的就是这一处。
四、延迟线:512 抽头与两种模式
1、抽头与分辨率
项目 | 7 系列 IDELAYE2 | UltraScale IDELAYE3 | UltraScale+ IDELAYE3 |
|---|---|---|---|
抽头数 | 32 | 512 | 512 |
单抽头分辨率 | 固定值(200MHz 参考时钟下约 78ps) | 2.5 ~ 15ps(随 PVT 波动) | 2.1 ~ 12ps(随 PVT 波动) |
TIME 模式最大延迟 | — | 约 1.25ns(511 tap) | 约 1.1ns(511 tap) |
固有延迟 | 需在预算中扣除 | 约 160ps(实测值) | 同左 |
这里有条容易忽略的分界:
7 系列的抽头分辨率是可算出的确定值,按 IDELAYCTRL 参考时钟频率一算就有;
UltraScale 的 512 个抽头逐个都不校准,分辨率是个范围,随工艺、电压、温度漂。
所以 COUNT 模式下拿抽头数乘分辨率去反推时间,算出来的数只能当参考。
2、COUNT 还是 TIME
维度 | COUNT 模式 | TIME 模式 |
|---|---|---|
是否需要 IDELAYCTRL | 不需要(延迟线未校准) | 必须使用 |
DELAY_VALUE 单位 | 抽头数(0 ~ 511) | 皮秒 |
PVT 补偿 | 无 | 有 |
EN_VTC 电平 | 必须为 Low | 必须为 High |
典型用途 | 扫描数据流找跳变、纯计数场景 | 需要精确时间对齐的接口(DDR PHY 等) |
选错的后果不对称:COUNT 模式在实验室能跑,温度一变就偏;TIME 模式如果忘了 EN_VTC,等于白用一套补偿电路。
3、关键属性
属性 | 取值 | 说明 |
|---|---|---|
DELAY_FORMAT | TIME / COUNT | 决定 DELAY_VALUE 单位 |
DELAY_TYPE | FIXED / VARIABLE / VAR_LOAD | FIXED 固定;VARIABLE 用 CE/INC 手动增减抽头;VAR_LOAD 用 CE/INC 或 CNTVALUEIN/LOAD 加载 |
UPDATE_MODE | ASYNC / SYNC / MANUAL | ASYNC 与数据无关随时更新,逻辑最简;SYNC 随 DATAIN/IDATAIN 边沿;MANUAL 需两次 LOAD |
REFCLK_FREQUENCY | 见下表 | 必须与 IDELAYCTRL / BITSLICE_CONTROL 实际参考时钟一致 |
CASCADE | NONE / MASTER / SLAVE | 单原语 1.1~1.25ns 不够时级联 |
SIM_DEVICE | ULTRASCALE / ULTRASCALE_PLUS / _ES1 / _ES2 | 仿真器件版本 |
参考时钟允许范围:
组件 | UltraScale | UltraScale+ |
|---|---|---|
IDELAYCTRL | 200.0 – 800.0 MHz | 300.0 – 800.0 MHz |
BITSLICE_CONTROL | 200.0 – 2400.0 MHz | 300.0 – 2666.7 MHz |
REFCLK_FREQUENCY 写错是另一种静默失败:延迟值照算,只是和实际时钟对不上,误差随抽头数线性放大。
4、IDELAYCTRL 与 EN_VTC 的时序
端口三个:
REFCLK 要走全局时钟缓冲,可由 MMCME3 / PLLE3 供给;
RST 高有效,异步置位、同步于 REFCLK 释放;
RDY 表示本区域延迟线校准完成。
配置完成后必须复位一次 IDELAYCTRL,且此时 REFCLK 已经稳定,否则延迟值不可信。RDY 被拉低,就得重新复位。
同一区域内所有 IDELAYE3 / ODELAYE3 共享这一个 IDELAYCTRL。
TIME 模式的参考写法:
IDELAYE3 #(
.DELAY_FORMAT ("TIME"), // ps 为单位
.DELAY_TYPE ("VAR_LOAD"), // 支持动态加载
.DELAY_VALUE (0),
.REFCLK_FREQUENCY(312.5), // 与 IDELAYCTRL 实际参考时钟一致
.UPDATE_MODE ("ASYNC"),
.SIM_DEVICE ("ULTRASCALE_PLUS")
) IDELAYE3_inst (
.CLK (clk),
.CNTVALUEIN (cntvaluein),
.DATAIN (data_i),
.IDATAIN (data_ibuf),
.LOAD (load),
.CE (ce),
.INC (inc),
.EN_VTC (en_vtc), // TIME 模式必须为高
.CNTVALUEOUT(cntvalueout),
.DATAOUT (data_o)
);
五、时钟不能走 IDELAY
IDELAYE3 不能直接布线到全局时钟缓冲。
要挪时钟相位,用 MMCM/PLL 的 fine-phase shift,不能把 IDELAY 串在时钟路径上。
这条是 UG571 写死的硬约束,也是新手最常撞的一堵墙。
六、迁移检查表
# | 迁移项 | 7 系列 | UltraScale / UltraScale+ | 动作 |
|---|---|---|---|---|
1 | I/O 逻辑结构 | ILOGIC/OLOGIC + ISERDESE2/OSERDESE2 | RXTX_BITSLICE + BITSLICE_CONTROL | 走 native mode 需重新配置 |
2 | Bitslip | ISERDESE2 自带 | ISERDESE3 无 | 自实现移位对齐,或改用 BITSLICE |
3 | 延迟线抽头 | 32 | 512 | 时序预算与扫描算法重算 |
4 | 延迟分辨率 | 固定(约 78ps@200MHz) | 区间值(US 2.5~15ps / US+ 2.1~12ps) | COUNT 模式不能当定时器 |
5 | 延迟模式 | 仅抽头计数 | COUNT / TIME 双模式 | 需要精确对齐时切 TIME + EN_VTC |
6 | IDELAYCTRL 参考时钟 | 200MHz ±10% 严格匹配 | 放宽至 200–800MHz / 300–800MHz | 时钟规划放宽 |
7 | ODELAY | 仅 HP Bank 有 | ODELAYE3 可用 | 输出延迟设计空间变大 |
8 | Bank 类型 | HP / HR | HP / HR / HD | 选脚先确认 Bank 类型 |
七、六个常见坑
1.把 IDELAYE3 串在时钟路径上 —— 布线不到全局时钟缓冲,直接失败。改用 MMCM/PLL 相移。
2.在 HD Bank 上例化 ISERDESE3 / IDELAYE3 —— 那里没有这些资源,编译报错。
3.TIME 模式忘了 EN_VTC 或 IDELAYCTRL —— 延迟不随 PVT 补偿,实验室能跑,上板温度一变就错。
4.COUNT 模式下按 ps 设 DELAY_VALUE —— 该模式分辨率不确定,换算不出时间。
5.配置后没复位 IDELAYCTRL —— RDY 没拉高,延迟线未校准。
6.迁移时找不到 ISERDESE3 的 Bitslip 端口 —— 字对齐逻辑得自己补。