这一篇在干嘛?
补课:BANK 与 VCCIO
先补两个概念,原培训资料默认你已了解:
- BANK(组):FPGA 的几百个 IO 分成若干组,每组叫一个 Bank。同一 Bank 的所有 IO 共用一组电源引脚,电气特性绑在一起。
- VCCIO(IO 供电电压):每个 Bank 有一路 VCCIO,决定了该 Bank 的 IO 高电平是多少,也决定了能兼容哪些电平标准(LVCMOS33、LVCMOS25 等)。“这个 IO 是什么电平”是按 Bank 说的——画原理图分配管脚时,第一步就想清楚每个外设接在哪个 Bank、那个 Bank 的 VCCIO 是多少。
再来看一个 IO 的内部结构。安路(Anlogic)EF2/EF3/EG4 系列的 IO 大致长这样:

这张手册截图展示 IO 单元框图:中间是三态输出驱动器(Driver)和输入缓冲器(iBuf),右侧连着管脚(PAD);上下是可编程上拉/下拉(Programmable Pull-up/down),即本篇主角之一 Pull Type;带二极管符号的支路是可选 PCI Clamp(Optional PCI Clamp),另一位主角。下面挨个讲。
Pull Type 的四种配置
Pull Type 指的是 IO 内部自带的”弱”上下拉,在 TD 软件的 IO 约束里配置,通常有四个选项:
| 配置 | 中文 | 含义 |
|---|---|---|
| Pull Up | 弱上拉 | IO 内部通过弱电流把管脚”拉”向 VCCIO |
| Pull Down | 弱下拉 | 把管脚”拉”向地 |
| None | 无上下拉 | 管脚悬空,电平完全由外部决定 |
| Keeper | 总线保持(Bus Hold) | 记住管脚上最后一次的电平,并用弱电流维持住 |
前三个好理解。Keeper(Bus Hold,弱电流自保持)像一个”电平记忆器”:外部驱动释放总线后,它用微安级的弱电流把管脚上最后一次的电平(0 或 1)保持住,防止总线悬空乱跳电平。
几个重要备注(原资料原话,展开解释):
- 位流生效后,Pull Type 只能工作在其中一个配置,不能动态调整。 也就是说这些选项是写死在位流里的硬件配置,不像你 Verilog 里的寄存器可以运行时改。想改?重新生成位流、重新加载。
- PCI Clamp 的 ON/OFF 同样不能在运行中动态切换,也是位流级配置。
- Pull Type 和 PCI Clamp 是两个独立选项,可以分别配置,同时生效。
- 不是所有 IO 都具备这些选项。 比如 IOBB 类型的 IO 就没有 PCI Clamp(下一篇细讲 IOBB/IOBE),具体要查 Datasheet 和《IO 使用指南》。
常见坑:把上下拉当"运行时可调"用
有同学在代码里想”运行时打开上拉”,改约束发现不生效——Pull Type 是位流配置项,位流一加载就定死。需要动态改变输入电平的场合,应在电路设计阶段把外部电阻做好,或用逻辑内部处理。
内部”上拉电阻”到底多大?
这是本篇最硬核、也最有价值的一节。FAE 培训里给出的关键事实:
IO 内部的上下拉不是真实电阻,而是用电流源来模拟的。 电流范围 35uA ~ 250uA,典型值 100uA。
为什么用电流源不用电阻?芯片里做精确的几十 KΩ 电阻很占面积、偏差也大,电流源更容易做且一致性好。但代价是:它没有恒定阻值——管脚电压不同,“看起来”的等效电阻就不同。
那”等效电阻”怎么算?用欧姆定律 R = V/I 换算。FAE 给了真实案例:
条件:VCCIO = 3.3V,使能内部上拉,外部接 10KΩ 下拉电阻,实测管脚电压 1.2V。求内部上拉的等效电阻。

这张手册插图画的正是这个场景:左侧上方是内部上拉电流源(从 3.3V 向 PAD 注入 35~250uA),PAD 外接 10KΩ 下拉到地,PAD 电压停在 1.2V。我们一步步算:
- 电流源两端的压差:电流源上端接 3.3V,下端是 PAD 的 1.2V,所以电流源上”承受”的电压是 3.3V − 1.2V = 2.1V
- 流过外部电阻(也就是整个回路)的电流:PAD 电压 1.2V 全部落在 10KΩ 上: 1.2V ÷ 10KΩ = 120uA(正好落在 35~250uA 的合法范围内,说明假设自洽)
- 内部上拉的等效电阻:串联电路电流处处相等,所以上拉”电阻”里也流过 120uA: 2.1V ÷ 120uA = 17.5KΩ(资料里写 17.2KΩ,是四舍五入位数的差异,量级一致)
结论:在这颗器件、这个电压点,内部上拉”相当于”一个约 17KΩ 的电阻。 这就是”弱上拉”的”弱”字量化后的样子,和 STM32 内部 30~50KΩ 上拉同量级——但注意它会随工作点漂移,不是精密电阻。
外部上拉、内部下拉的计算方法类似,把电流源位置对调即可。经验:电路里有强驱动(正常推挽输出)时,一般不用考虑上下拉分压——强驱动的输出阻抗远小于上下拉,电平由驱动方说了算。
外部下拉选 1K 还是 10K?
问题来了:既然内部上拉的”电阻”会在 35uA~250uA 电流范围内漂,那外部分压电阻选多大才可靠?
判断标准只有一条:分压出来的电平必须落在确定的逻辑域里——要么低于 VIL(输入低电平上限),要么高于 VIH(输入高电平下限)。以 LVCMOS33 为例,看手册的直流特性表:
| 标准 | VIL 最小 (V) | VIL 最大 (V) | VIH 最小 (V) | VIH 最大 (V) |
|---|---|---|---|---|
| LVTTL33 / LVCMOS33 | −0.3 | 0.8 | 1.9 | VCCIO+0.3 |
即:低于 0.8V 才是”可靠的高质量低电平”。
方案 A:外部下拉 10KΩ —— 不可靠
用最坏情况法算 PAD 电压的范围(电平 = 电流 × 电阻):
- 最大:250uA × 10KΩ = 2.5V —— 已经超过 VIH(1.9V),是高电平!
- 最小:35uA × 10KΩ = 0.35V
也就是说,同一个设计,换一颗芯片、换个温度,PAD 上可能是 0.35V(好,低电平),也可能是 2.5V(完蛋,读成高电平)。最大值 2.5V 远超 VIL = 0.8V,不可靠。
方案 B:外部下拉 1KΩ —— 可靠
- 最大:250uA × 1KΩ = 0.25V
- 最小:35uA × 1KΩ = 0.035V
最坏情况下 0.25V 也远低于 0.8V,无论芯片个体差异多大,PAD 永远是扎扎实实的低电平。可靠。
这正是 FAE 培训反复强调、原资料”其它注意事项”里也再次点名的一条:外部下拉电阻建议选 1KΩ,不要用 10KΩ。典型翻车场景:IO 的高电平信号比 VCCIO 来得早,导致 EF2/EF3/EG4 内部上拉被意外打开(与你配置了什么无关!),此时如果外面挂的是 ADC 输入通道或数字输入,10K 下拉扛不住内部上拉,采样结果全乱;换 1K 下拉才能压得住。
常见坑:外部上下拉选阻值只看"典型值"
只按典型电流 100uA 算分压是新人最容易犯的错。电流源实际范围是 35~250uA,必须用最坏情况(250uA)验算:最大分压必须 < VIL(或最小分压 > VIH),否则批量生产一定有板子”抽风”。
PCI Clamp:IO 的过冲保镖
先补背景知识:什么是过冲(Overshoot)和下冲(Undershoot)?
信号在线上传输不是理想方波。由于驱动器切换速度、走线电感/电容、阻抗不匹配等原因,信号跳变时会”冲过头”:上升沿冲得比高电平还高,叫过冲(Overshoot);下降沿掉得比低电平还低(甚至到负电压),叫下冲(Undershoot)。轻微过冲无害,严重过冲会超过 IO 内部结构的耐压,击穿 MOS 管的栅氧层——这是”烧片子”的常见路径之一。
PCI 总线标准(Peripheral Connect Interface)要求 IC 的 IO 管脚能承受 −3.5V 的下冲和 +7.1V 的过冲(PCI 信号特征阻抗 60~100Ω,负载电容 ≤10pF)。为此 IO 里设计了钳位(Clamp)结构——PCI Clamp:
PCI Clamp 的本质是一对指向 VCCIO / GND 的钳位二极管:PAD 电压超过 VCCIO + 一个二极管压降时,上面的二极管导通,把多余电荷泄放到 VCCIO;PAD 低于地时下面的支路导通。用”泄流”把 PAD 电压钳制在安全范围,防止损坏芯片。
对于普通 3.3V 系统你或许觉得无所谓,但它的真正价值在于一个经典场景:5V 器件驱动 3.3V FPGA。

这张手册插图(原图题”5V 输入驱动 ELF2 器件”)展示的就是这个场景:左侧 5V 器件输出高电平约 5V,远超右侧 EF2 器件 VCCIO=3.3V IO 的承受范围;中间串联电阻 R 限流,当 PAD 被 5V 抬高超过钳位门限时,PCI Clamp 导通,把电流泄向 VCCIO,保护后级的输入缓冲器(iBuf)。没有 Clamp,5V 会直接打坏 3.3V IO。
但要敲黑板的是:这层保护不是随时在岗的——
- 芯片断电期间以及加载成功之前,PCI Clamp 是关闭的。
- 在线重新加载时,也会有 Clamp 先关闭、再打开的过程。
- 内部 Clamp 只有在芯片加载成功之后才打开。也就是说,加载成功前管脚上不能出现 5V 信号;如果系统要求上电前就有 5V 输入,必须在外部加二极管钳位,不能指望片内 Clamp。
PCI Clamp 使用要点
把上面的机制落成设计规则,FAE 给出四条建议:
- PCI 接口应用必须使能:真要接 PCI 总线(或类 PCI 的 5V 容忍接口),对应 IO 的 Clamp 设为 ON。
- FPGA 单独掉电时,若这些 IO 仍有输入信号,Clamp 要关闭。原因:掉电中 VCCIO 在下降,IO 上的 3.3V 信号会让 Clamp 二极管导通,倒灌进 VCCIO 电源轨,导致 VCCIO 掉不到 0V,整机下电时序被搅乱。
- Clamp 长期导通电流必须小于 10mA:Clamp 二极管是 ESD 保护级别的结构,不是功率器件,持续灌大电流会过热损坏。
- 反过来记住:上电早期 IO 有 5V 输入时片内 Clamp 不在工作,只能靠外部二极管 + 限流电阻。
把 Pull Type 和 PCI Clamp 的配置逻辑合在一起记:它们都是位流级配置、加载后不可动态改变、不是每个 IO 都有。在 TD 软件的 IO 约束里逐管脚设置,生成位流前就定好。
常见坑:掉电时 VCCIO 降不下去,查了半天电源
“断电后 VCCIO 有残余电压、系统不能彻底关机”,十有八九不是电源芯片的问题,而是 IO 上的外部信号通过 PCI Clamp(或内部上拉)向 VCCIO 倒灌。排查方法:看哪些 IO 在 FPGA 断电后仍在输入信号,把这些 IO 的 PCI Clamp 和 Pull Up 关掉,或外部加限流。
本篇通关标准:
- 能不查资料说出 Pull Type 四种配置(Pull Up / Pull Down / None / Keeper)各自的作用,并解释为什么位流生效后不能动态调整。
- 能独立复算 17.2KΩ 等效上拉电阻的推导(3.3V − 1.2V = 2.1V;1.2V/10K = 120uA;2.1V/120uA ≈ 17KΩ),并知道这是电流源不是真电阻。
- 能用最坏情况法(250uA × 阻值)判断外部下拉电阻是否可靠,说清 1KΩ 可靠、10KΩ 不可靠的原因,以及 PCI Clamp 在”5V 驱动 3.3V”和”FPGA 单独掉电”两个场景下分别该怎么配。
内部上拉为什么不用真实电阻,而用电流源模拟?
因为芯片工艺里做出精确、一致的几十 KΩ 电阻成本高、偏差大,电流源更容易实现且一致性好。代价是它没有固定阻值:等效电阻 = 电流源承受的压差 ÷ 实际电流,会随工作点在几十 KΩ 量级漂移(案例中算得约 17.2KΩ),所以做关键分压设计时必须按 35uA~250uA 的最坏范围验算。
外部下拉 10KΩ 在典型情况下(100uA)分压正好 1V,也没超 VIL=0.8V 多少,为什么不能用?
因为 100uA 只是典型值,电流源实际范围是 35uA~250uA。最坏情况下 250uA × 10KΩ = 2.5V,不仅超过 VIL(0.8V),甚至超过 VIH(1.9V),低电平会被直接读成高电平。批量生产中芯片个体差异必然存在,“典型值合格、最坏值翻车”的设计一定会出批次性问题。
系统要求 FPGA 上电前 5V 信号就存在,能靠片内 PCI Clamp 保护吗?
不能。PCI Clamp 在芯片断电和加载成功之前是关闭的,加载成功后才打开。上电前存在的 5V 输入必须靠外部电路钳位:串联限流电阻 + 外部二极管把 PAD 电压钳到安全范围。另外注意 Clamp 长期导通电流必须小于 10mA。
FPGA 断电后 VCCIO 总是降不到 0V,最可能的原因是什么?怎么解决?
最可能是 FPGA 断电期间某些 IO 上仍有高电平输入,信号通过开启的 PCI Clamp 二极管倒灌进 VCCIO 轨,把电源”顶”住了。解决:把这些 IO 的 PCI Clamp 配置为 OFF(必要时 Pull Up 也关闭),切断倒灌路径;若信号不能断,外部加隔离电阻或缓冲。
Keeper(Bus Hold)和普通上拉有什么区别?
上拉永远把管脚往高电平拉;Keeper 是记住管脚上最后一个电平并用弱电流维持——最后是 0 就保持 0,是 1 就保持 1。适合总线释放后防止悬空乱跳的场合,而不适合给”默认必须为低”的信号定初始电平(那种场合应该用下拉或外部电阻)。