
第一次在引脚约束文件里看到Bank 34、Bank 35这种编号时多数人只当它是分组标签直到把一颗 3.3V 的 CMOS 传感器接到 HP bank 上工具弹出报错才意识到这三个字母背后是硅片上完全不同的电路结构。Xilinx FPGA 里的 HR、HD、HP bank 不是文档里随手起的名字而是三种供电范围、驱动能力、终端匹配方式都不同的 I/O 区域。选错 bank轻则约束报错改一改重则上板后信号眼图睁不开、DDR 误码、甚至把 I/O 缓冲器打坏。这篇内容面向刚接触 FPGA 引脚规划的人也面向做过几个项目但一直靠“工具不报错就行”混过来的朋友把 HR、HD、HP 三类 bank 的差异拆到能指导实际分配的程度。1. bank 不是软件分组是硅片上的一个矩形很多人把 bank 理解成“引脚的文件夹”觉得只要约束文件写对哪个引脚都能干活。真实情况是一个 I/O bank 在 die 上是一块独立的矩形区域里面排布着几十个 I/O 缓冲器、若干对差分驱动器、时钟布线资源以及一条独立的 VCCO 供电轨。这条供电轨决定了这个矩形里所有 I/O 缓冲器的输出摆幅上限也决定了哪些电平标准能在这个 bank 里合法存在。1.1 一个 bank 内部共享了哪些东西以 7 系列为例一个 bank 通常是 50 个 I/O内部再按 byte group 切分成若干小组。共享关系是硬性的VCCO 整 bank 共用VREF 参考电压按 bank 或按组生效DCI 的阻抗校准按 byte group 进行差分对的两根引脚必须落在同一个 bank 内。这就解释了一个常见现象——你把一组 LVDS 的 P 端放在 Bank 34、N 端放在 Bank 35工具会直接拒绝因为跨 bank 的差分走线在芯片内部根本没有对应的接收器。时钟资源也是按 bank 绑定的。每个 bank 里有若干对时钟专用引脚能直接连到 BUFIO、BUFR 或 MMCM 的时钟输入。普通 I/O 引脚想当时钟用得绕到全局时钟网络抖动和偏斜都会变差。这一点在分配高速接口时比电压更容易被忽略电压选错了工具会拦时钟引脚选错了工具往往放行问题留到上板才暴露。1.2 同一 bank 的 VCCO 为什么必须统一VCCO 是 I/O 缓冲器输出级的电源。CMOS 推挽输出高电平时PMOS 把 VCCO 拉到引脚上低电平时NMOS 把引脚拉到地。如果同一个 bank 里一半引脚要 3.3V 摆幅、另一半要 1.8V 摆幅输出级就不知道该用哪个电压供电所以厂商干脆规定一个 bank 只能有一个 VCCO。这条规则的直接后果是引脚分配的第一步不是看功能而是按电压分组。把所有 3.3V 器件归一堆1.8V 器件归一堆1.5V 的 DDR 归一堆然后再看每组需要多少个引脚、对应哪些 bank。先画原理图再想 bank 的人往往会在 layout 阶段被迫改板。1.3 bank 编号和封装布局的关系bank 编号不是按顺序排列的引脚序号而是和封装内的物理位置对应。同一个 bank 的引脚在封装上通常相邻走线到连接器时比较顺跨 bank 的信号要穿过芯片边缘的布线通道长度和串扰都更难控制。做高速板时我习惯先把关键接口DDR、高速差分对应的 bank 在封装图上圈出来再围绕它们安排低速外设而不是反过来。提示bank 编号在不同器件、不同封装里会变别把上一个项目的分配表直接抄过来。换器件后第一件事是打开 package 文件重新确认每个 bank 的 VCCO 范围和可用引脚数。2. HR、HD、HP 的定位差异不只是性能高低三个前缀的全称分别是 High Range、High Density、High Performance。名字听起来像高中低三档实际对应的是三种设计取舍HR 追求电压覆盖范围HD 追求单位面积里的 I/O 数量HP 追求高速信号完整性和终端匹配能力。它们服务的接口类型几乎没有重叠。2.1 HR bank从 1.2V 到 3.3V 的通用接口区HR bank 的 VCCO 范围通常覆盖 1.2V 到 3.3V能支持 LVCMOS33、LVCMOS25、LVCMOS18、LVTTL、PCI 等一大票单端标准也能跑 LVDS_25 这类差分标准。它适合接什么按键、LED、UART、SPI Flash、低速并行总线、3.3V 的传感器和显示屏接口这些都能胜任。代价是它没有 DCI数字控制阻抗能力。DCI 的作用是在芯片内部做终端匹配省掉板上的一排排电阻。HR bank 不支持 DCI意味着接需要 50 欧姆终端的总线时终端电阻得老老实实放在 PCB 上。另外7 系列的 HR bank 不支持内部 VREF 生成VREF 必须从外部引脚送进来。这两点决定了 HR bank 不适合做高速存储接口——不是不能跑是跑了之后板级复杂度会上升时序余量也会被压缩。2.2 HD bank小器件里为省面积做的妥协HD bank 主要出现在低成本、小封装的系列里比如 Spartan 系列。它的 VCCO 范围同样宽能到 3.3V单端标准支持得比较全但驱动能力比 HR 和 HP 弱翻转速率上限也低。它也没有 DCI差分速率有限时钟资源相对紧张。HD 的“Density”体现在 I/O 密度上同样面积的 die 里塞进更多 I/O代价是每个 I/O 的驱动管尺寸缩小。用它点 LED、读拨码开关、接低速 SPI 完全没问题但拿它跑 100 兆以上的并行总线边沿会变缓时序收敛会变难。我在一个用 Spartan 系列做多路舵机控制的项目里把 8 路 PWM 放在 HD bank输出波形没问题但把同一组引脚改成 50MHz 的并行摄像头接口后采样窗口明显变窄最后不得不换到 HR bank 上。2.3 HP bank1.8V 封顶的高速通道HP bank 的 VCCO 上限一般是 1.8V典型值是 1.2V、1.5V、1.8V。这个限制把 3.3V 器件直接挡在门外换来的是一整套为高速信号准备的能力DCI 终端匹配、内部 VREF 生成、更高的差分翻转速率、更强的驱动和更精细的摆率控制。DDR3、DDR4、LPDDR、高速 LVDS、SSTL、HSTL 这些接口基本都落在 HP bank 上。以 DDR3 为例1.5V 的 SSTL15 标准需要 VREF 和终端匹配HP bank 可以内部生成 VREF并通过 DCI 在片内做 50 欧姆匹配板上只需在 VRN、VRP 引脚各接一个参考电阻。如果换成 HR bankVREF 要外部给终端电阻要板上去一个 16 位 DDR 接口的电阻数量能到几十颗layout 空间和成本都上去了。2.4 三者差异的一张对照表维度HR bankHD bankHP bank全称High RangeHigh DensityHigh PerformanceVCCO 范围约 1.2V 到 3.3V约 1.2V 到 3.3V约 1.2V 到 1.8V3.3V 单端支持支持不支持DCI 终端匹配不支持不支持支持内部 VREF不支持需外部输入不支持支持差分速率中等较低高典型用途通用外设、低速总线LED、按键、低成本控制DDR、高速差分、存储接口常见系列7 系列、UltraScale 部分Spartan 系列、UltraScale HD7 系列、UltraScale HP这张表里的数值是量级参考具体范围一定要以所用器件的数据手册和 SelectIO 资源手册为准。不同系列、不同速度等级会有出入但三者的能力边界是稳定的。3. 电压、电平标准与 bank 的匹配规则约束文件里写IOSTANDARD只是告诉工具“我想用哪种电平”工具还要检查这个标准对应的 VCCO 是否和 bank 的实际供电一致。这个检查分两层一层是工具层面的 DRC一层是物理层面的耐压。前者会拦下大部分错误后者才是烧片子的原因。3.1 VCCO 和 IOSTANDARD 的对应关系每一种 IOSTANDARD 都隐含一个推荐的 VCCO 值。LVCMOS33 对应 3.3VLVCMOS25 对应 2.5VLVCMOS18 对应 1.8VSSTL15 对应 1.5VSSTL135 对应 1.35VSSTL12 对应 1.2V。工具会根据你写的标准去核对 bank 的 VCCO 约束不匹配就报错。实际项目里更常见的坑是“降额使用”有人觉得 3.3V 器件接到 2.5V 的 bank 上也能识别高电平于是把 LVCMOS33 的输入接到 VCCO 为 2.5V 的 bank。输入阈值可能勉强够但输出高电平只有 2.5V对方器件如果按 3.3V 的 VIH 判断就会处于不确定区。这种问题在实验室常温下可能正常批量后随温度漂移开始偶发排查成本极高。IOSTANDARD推荐 VCCO典型应用LVCMOS333.3V通用外设、Flash、显示屏LVCMOS252.5V中速总线、部分传感器LVCMOS181.8V低功耗外设、部分射频前端LVDS_252.5V中速差分、视频接口SSTL151.5VDDR3SSTL1351.35VDDR3LSSTL121.2VLPDDR4 类接口HSTL151.5V高速存储、部分通信接口3.2 VREFHR bank 必须外部给HP bank 可以内部生成VREF 是 SSTL、HSTL 这类标准用来判断高低电平的参考电压通常是 VCCO 的一半。HR bank 没有内部 VREF 生成电路必须在 bank 里挑一个专用引脚从外部送入精确的参考电压。这个引脚一旦占用就不能再当普通 I/O 用外部还得加滤波和分压电路。HP bank 可以在内部生成 VREF通过约束指定set_property INTERNAL_VREF 0.75 [get_iobanks 34]这行约束的意思是 Bank 34 的内部参考电压设为 0.75V对应 1.5V 的 SSTL15。用内部 VREF 的好处是省引脚、省外部电路代价是精度受芯片内部基准影响且 VREF 引脚不能再接其他信号。做 DDR 接口时我一般优先用内部 VREF除非时序报告显示参考电压噪声是瓶颈才考虑改外部。3.3 DCI省电阻的代价是校准和专用引脚DCI 是 HP bank 的看家本领。它通过 bank 内的 VRN、VRP 两个引脚接参考电阻芯片内部据此校准 I/O 的驱动阻抗和终端阻抗让 50 欧姆匹配做在片内。使用 DCI 的电平标准通常带_DCI后缀set_property IOSTANDARD SSTL15_T_DCI [get_ports {ddr_dq[*]}]这里有两个容易踩的点。第一VRN 和 VRP 的参考电阻阻值、接法要严格按手册来典型是 240 欧姆VRN 接 VCCO、VRP 接地具体以器件手册为准接错不会立刻报错但校准结果会偏眼图慢慢闭合。第二DCI 是按 byte group 生效的同一个 byte group 里如果混用了带 DCI 和不带 DCI 的标准工具可能允许但校准会互相干扰。我的做法是一个 byte group 内只用一种终端策略。注意不使用 DCI 的 HP bankVRN、VRP 引脚也要按手册处理不能悬空。很多板子在这两个脚上留了焊盘却没装电阻调试时忘了最后表现为某个 byte lane 的时序莫名其妙地差。4. 引脚分配实战先分组再选 bank讲完原理落到实际分配流程。我的习惯是三步按电压分组、按速度定 bank 类型、按物理位置排引脚。这个顺序不能反反了就要反复推翻重来。4.1 第一步把所有外设按 VCCO 归类打开原理图把每个接口的供电电压列出来。3.3V 一组UART、SPI Flash、LED、按键、显示屏背光控制。2.5V 一组部分视频差分、某些传感器。1.8V 一组低功耗外设、部分射频控制线。1.5V 或 1.35V 一组DDR3。归完之后数引脚数再乘 1.2 的余量看每组需要几个 bank。以一颗中等规模的 Kintex 器件为例HR bank 通常分布在芯片两侧HP bank 集中在某些区域。3.3V 那组只能去 HR bankDDR 那组只能去 HP bank中间如果有 1.8V 的普通外设可以放 HR bankVCCO 设 1.8V也可以放 HP bank看哪个方向的引脚更顺。4.2 第二步时钟和高速差分优先占位时钟专用引脚、高速差分对、DDR 的 DQS 组这些资源位置固定必须先占。DDR 的字节组要和 DQS 对对齐DQS 对又要落在支持 DCI 的 byte group 里一层层约束下来DDR 占用的 bank 基本没有调整空间。先把这块钉死剩下的引脚再分配给低速外设。时钟引脚还要看它属于哪个时钟区域。7 系列里 SRCC 只能驱动所在时钟区域MRCC 可以跨区域。如果一个 bank 里的时钟引脚是 SRCC而你需要用它驱动另一侧的逻辑就得换引脚或者加 BUFG。这类限制在约束文件里不会主动提示只能靠提前查手册。4.3 一个模拟项目的 bank 分配复盘假设有一个图像采集加控制的模拟项目主器件选一颗带 HR 和 HP bank 的中等规模 FPGA外设包括DDR3 16 位、两路 3.3V UART、一路 SPI Flash、一组 3.3V 的 LED 和按键、一路 2.5V LVDS 视频输入、一路 1.8V 的传感器并行接口。外设电压接口类型分配 bank理由DDR3 16 位1.5VSSTL15_T_DCIHP bank需要 DCI 和内部 VREFLVDS 视频输入2.5VLVDS_25HP bank 或 HR bank速率决定优先 HP传感器并行接口1.8VLVCMOS18HR bank速率不高省 HP 资源UART、SPI、LED3.3VLVCMOS33HR bankHP bank 不支持 3.3V这个分配里LVDS 视频输入如果速率在几百兆以内放 HR bank 也能跑但 HR bank 的差分速率上限低余量小。稳妥做法是放 HP bank把 VCCO 设成 2.5V。注意 HP bank 的 VCCO 上限是 1.8V2.5V 的 LVDS_25 实际上要放 HR bank 或者使用专门的差分标准这一点在不同系列里规则不同必须查手册确认别想当然。4.4 跨 bank 走线的隐性成本同一个接口的信号尽量放同一个 bank这不是强迫症。跨 bank 的信号在芯片内部要经过更长的布线延迟不一致做并行总线时会让建立保持时间更难收敛。差分对跨 bank 直接不合法单端总线跨 bank 虽然合法但时序分析时要单独约束。还有一个细节bank 的 VCCO 上电顺序。如果两个 bank 分别供 3.3V 和 1.5V而它们之间有信号连接就要考虑上电过程中是否会出现某个 bank 未上电、另一个 bank 已经输出高电平的情况。这种“背供电”可能通过 I/O 的 ESD 二极管灌电流长期运行会损伤器件。板级设计时跨电压域的信号要么加电平转换要么保证上电顺序要么在 FPGA 内部做三态控制。5. 上板才暴露的典型问题与排查路径工具能拦住的错误都不算难难的是那些约束通过、综合通过、上板才出问题的场景。下面这几类是我这些年反复遇到、也反复帮别人排查过的。5.1 IOSTANDARD 和 VCCO 冲突报错与漏报最直接的情况是约束里写了 LVCMOS33bank 的 VCCO 却接 1.8V工具在实现阶段报 DRC 错误。这种好办改电压或者改标准。麻烦的是漏报某些工具版本对“输入引脚用高于 VCCO 的标准”检查不严或者你用了set_property覆盖了默认检查。上板后表现为输入电平判断错误或者输入级保护二极管长期导通芯片发热。排查方法很土但有效把每个 bank 的 VCCO 实际测量值、约束文件里的 IOSTANDARD 列表、原理图上的供电网络三者做一张对照表逐行核对。我见过一个案例原理图上 bank 供电标的是 3.3V实际 BOM 里贴成了 1.8V 的 LDO软件约束全对硬件供错查了两天才发现是物料替换没同步。5.2 DCI 配置错误导致眼图闭合DCI 用错的表现很隐蔽功能正常误码率随温度升高。常见原因有三个。参考电阻阻值不对比如该用 240 欧姆贴了 100 欧姆VRN、VRP 接反同一个 byte group 里混用了 DCI 和非 DCI 标准。排查时先量电阻再看约束最后用示波器看信号眼图。如果眼图在常温下勉强张开、高温下闭合基本可以锁定是终端匹配问题。还有一个小概率情况DCI 校准需要参考时钟如果 bank 所在的时钟区域没有时钟输入校准可能不执行。这种问题在只用了部分 bank 的板子上出现过补一个时钟或者换用非 DCI 标准后解决。5.3 未使用 bank 的 VCCO 悬空没用到的 bankVCCO 要不要供电答案是必须供。VCCO 悬空时I/O 缓冲器的供电脚处于浮空状态可能通过内部电路耦合出不确定电平导致输入缓冲器振荡、功耗上升甚至影响相邻 bank。手册里一般写得很清楚但原理图设计时容易漏。我的做法是所有 bank 的 VCCO 都按手册要求供电未使用的 I/O 引脚在约束里设为三态或者内部下拉不让它们浮空。如果板子空间紧张至少把 VCCO 接到对应电压并加去耦电容。5.4 上电顺序与热插拔FPGA 的 VCCINT 和 VCCO 之间一般没有强制上电顺序但推荐核心电压先建立。真正需要注意的是外部器件先上电、FPGA 后上电的场景外部器件输出的高电平会通过 FPGA 的 I/O 保护二极管灌入未上电的 bank电流可能超过限值。解决方式有三种加电平转换或隔离、保证 FPGA 先上电、在 FPGA 内部把相关引脚配置为高阻并加外部串联电阻。热插拔场景更复杂连接器插拔瞬间的电平抖动可能被 FPGA 当成有效输入。如果接口允许加 RC 滤波或者用带使能控制的缓冲器比在 FPGA 内部做软件消抖可靠得多。5.5 约束文件的检查清单每次投板前我会把下面几项过一遍能挡掉大部分低级错误每个 bank 的 VCCO 约束是否和原理图供电一致每个 IOSTANDARD 是否和 VCCO 匹配尤其是 3.3V 器件有没有误放到 HP bank差分对的 P/N 是否在同一 bank、是否落在合法的差分引脚对上使用 DCI 的 bankVRN、VRP 电阻是否按手册装配使用内部 VREF 的 bankINTERNAL_VREF约束是否和 IOSTANDARD 匹配时钟引脚是否落在 CC 引脚上是否属于需要的时钟区域未使用 bank 的 VCCO 是否供电未使用引脚是否设为三态或下拉跨电压域信号是否有上电顺序或隔离措施。# 一段典型的 bank 相关约束示例 set_property IOSTANDARD LVCMOS33 [get_ports {uart_txd}] set_property IOSTANDARD LVCMOS18 [get_ports {sensor_data[*]}] set_property IOSTANDARD SSTL15_T_DCI [get_ports {ddr3_dq[*]}] set_property INTERNAL_VREF 0.75 [get_iobanks 34] set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design]最后两行经常被忽略。CFGBVS决定配置引脚的电压范围CONFIG_VOLTAGE告诉工具配置接口的实际电压这两个属性和 bank 的 VCCO 是联动的。如果配置引脚所在的 bank 供 3.3V而CFGBVS设成了 GND工具可能不报错但配置阶段会出问题。这类属性建议在约束文件开头就写清楚别等到实现阶段再补。我个人在实际操作中的体会是bank 分配这件事前期多花半天画一张电压分组表后期能省掉好几轮改板和调试。尤其是混用 HR 和 HP bank 的器件先把不能动的DDR、高速差分、时钟钉死剩下的低速外设像填空一样往里塞比从头到尾凭感觉分配要稳得多。还有一条经验——换器件型号时哪怕只是同一系列换了个规模也要重新核对 bank 编号和 VCCO 范围封装变了bank 的物理位置和可用引脚都会变旧约束直接搬过来迟早会在某个不起眼的引脚上翻车。