这一篇在干嘛?

这是「硬件接口」系列第一篇,素材来自安路官方 FAE 培训《硬件接口相关》,聚焦两个最易忽视又最易”翻车”的 IO 配置:**Pull Type(上下拉类型)**和 PCI Clamp(钳位)。读完你会明白:FPGA 内部的”上拉电阻”其实不是电阻、外部下拉为什么选 1KΩ 而不是 10KΩ、5V 信号怎么打坏 3.3V IO。同系列:硬件接口(二)硬件接口(三)硬件接口(四)

补课:BANK 与 VCCIO

Pull Type 的四种配置

内部”上拉电阻”到底多大?

外部下拉选 1K 还是 10K?

PCI Clamp:IO 的过冲保镖

PCI Clamp 使用要点

补课: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,以及可编程上拉/下拉、可选的 PCI Clamp 和 Bus Hold

这张手册截图展示 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)保持住,防止总线悬空乱跳电平。

几个重要备注(原资料原话,展开解释):

  1. 位流生效后,Pull Type 只能工作在其中一个配置,不能动态调整。 也就是说这些选项是写死在位流里的硬件配置,不像你 Verilog 里的寄存器可以运行时改。想改?重新生成位流、重新加载。
  2. PCI Clamp 的 ON/OFF 同样不能在运行中动态切换,也是位流级配置。
  3. Pull Type 和 PCI Clamp 是两个独立选项,可以分别配置,同时生效。
  4. 不是所有 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。求内部上拉的等效电阻。

内部上拉电流源(35~250uA)与外部 10KΩ 下拉电阻的分压电路:PAD 实测 1.2V

这张手册插图画的正是这个场景:左侧上方是内部上拉电流源(从 3.3V 向 PAD 注入 35~250uA),PAD 外接 10KΩ 下拉到地,PAD 电压停在 1.2V。我们一步步算:

  1. 电流源两端的压差:电流源上端接 3.3V,下端是 PAD 的 1.2V,所以电流源上”承受”的电压是 3.3V − 1.2V = 2.1V
  2. 流过外部电阻(也就是整个回路)的电流:PAD 电压 1.2V 全部落在 10KΩ 上: 1.2V ÷ 10KΩ = 120uA(正好落在 35~250uA 的合法范围内,说明假设自洽)
  3. 内部上拉的等效电阻:串联电路电流处处相等,所以上拉”电阻”里也流过 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.30.81.9VCCIO+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 器件经串联电阻 R 驱动 ELF2(EF2)器件,PCI Clamp 导通泄放过冲电流

这张手册插图(原图题”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 给出四条建议:

  1. PCI 接口应用必须使能:真要接 PCI 总线(或类 PCI 的 5V 容忍接口),对应 IO 的 Clamp 设为 ON。
  2. FPGA 单独掉电时,若这些 IO 仍有输入信号,Clamp 要关闭。原因:掉电中 VCCIO 在下降,IO 上的 3.3V 信号会让 Clamp 二极管导通,倒灌进 VCCIO 电源轨,导致 VCCIO 掉不到 0V,整机下电时序被搅乱。
  3. Clamp 长期导通电流必须小于 10mA:Clamp 二极管是 ESD 保护级别的结构,不是功率器件,持续灌大电流会过热损坏。
  4. 反过来记住:上电早期 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 单独掉电”两个场景下分别该怎么配。