这一篇在干嘛?
系列第二篇,也是信息量最大的一篇。覆盖 EF2/EF3/EG4 的 IO 类型(IOBB/IOBE)、三种高速差分电平(LVDS/LVPECL/CML)、IO 在上电各阶段的状态、配置管脚与 JTAG、ESD 与热插拔、多电压输入、StateHoldIO 无缝升级。上一篇讲的基础配置见:硬件接口(一):IO 上下拉与 PCI Clamp,加载相关见:硬件接口(三):FPGA 加载模式全解。
IOBB 与 IOBE:基本型与增强型
安路的 IO 不是千篇一律的。EF2、EF3L15/EF3L45 器件的 IO 分两种类型:IOBB(基本型)和 IOBE(增强型);而 EF3L90、EF3L40 的 IO 全部是 IOBE,EG4(含比赛用的 EG4S20)的 IO 也全部是 IOBE,且 In/Out Delay 范围更大。
两者差在哪?看手册的对比表(已重排为 markdown,原截图见后续小节里的手册表格截图对照):
| 特性 | EF2/EF3 IOBB | EF2/EF3 IOBE |
|---|---|---|
| 单端 I/O | 支持 | 支持 |
| 差分 I/O 输入 | 支持,无匹配电阻 | 支持,有匹配电阻 |
| 差分 I/O 输出 | 仅伪差分 | 真、伪差分都支持 |
| 输出驱动能力 | 不可调 | 可调 |
| Slew Rate(压摆率) | 不可调 | 可调 |
| Pull Type | 支持 | 支持 |
| PCI Clamp | 无 | 有 |
| Hysteresis(迟滞) | 无 | 有 |
| OverDriven | 有 | 无 |
| In Delay (ns) | 0.336–0.671 | 0.322–1.209 |
| Out Delay (ns) | − | 0.069–0.279 |
两个名词解释:**Slew Rate(压摆率)**是输出电压翻转的快慢,压摆率越高边沿越陡、信号质量越”锐”,但电磁干扰也越大,长走线时反而要调低它来抑制过冲;**Hysteresis(迟滞)**是给输入比较器加一个”宽度”,防止缓慢变化的或带噪声的信号在阈值附近反复翻转产生毛刺。
实操要点:IOBB 的输出驱动电流不可调,如果你的输出信号过冲严重,没法靠降低驱动能力解决,FAE 给的土办法是在 FPGA 管脚旁边串一个 33Ω 电阻(阻值可按实测调整)来改善信号质量。分配高速/重要信号时优先挑 IOBE 管脚。
三种常见差分电平
单端电平(LVCMOS 等)到了高速场合就力不从心:参考地容易被干扰、摆幅大、翻转慢。于是有了差分电平:用一对线(P、N)传输一个”差”信号,接收端看的是两者的差值,天然抗共模干扰。FPGA 世界最常见的三种:LVDS、LVPECL、CML。

这张手册插图把三种电平的波形摆在一起:红线/蓝线是 P/N 两路,纵轴是电压。一眼能看出——LVDS 摆幅最小(只有 350mV 左右),LVPECL 共模电压最高、摆幅大,CML 居中。FAE 总结的七维度对比:
- 驱动方式:三者都是电流驱动,适合高速应用(电流驱动对噪声和阻抗变化不敏感)。
- 耦合方式:都支持直流耦合(DC)或交流耦合(AC)。
- 功耗:LVDS 摆幅只有 350mV,功耗最小;CML 与 LVPECL 摆幅较大,CML 略低于 LVPECL。
- 速率:CML 与 LVPECL 翻转快,支持极高速率(>10Gbps);LVDS 一般不超过 2Gbps。
- 端接(Termination,线路末端阻抗匹配):CML 输出可直连;LVDS 需要在输入端接 100Ω 差分电阻;LVPECL 外围电阻网络最复杂。
- 标准化:只有 LVDS 有国际统一标准(TIA/EIA-644),互通性最有保障。
差分信号的主要参数(看波形图就懂):

- Vocm(共模电压)= (Vp + Vn) / 2:P、N 的平均电压,LVDS 是 1.2V。
- Vo_se(单端摆幅)= |Vp − Vn|:单端探头量出来的摆幅数值。
- Vo_diff(差分摆幅)= 2 × |Vp − Vn|:差分探头量出来的摆幅数值,是单端摆幅的两倍(图中 ±350mV)。
- Vicm:输入共模电压的允许范围;Vi_se / Vi_diff:输入信号的摆幅范围。
常见坑:拿单端探头读差分摆幅当差分摆幅
单端摆幅和差分摆幅差一倍(350mV vs 700mV),量测口径没对齐就会误判信号幅度不达标。调差分接口前先想清楚你看的数是哪个口径。
真差分与伪差分
EF2、EF3、EG4 的 IO 输出差分时还分真差分和伪差分两种:
| 接收:支持 | 接收:外部电阻 | 接收:速率 | 发送:支持 | 发送:外部电阻 | 发送:速率 | |
|---|---|---|---|---|---|---|
| 真差分 | Yes | 不需要 | 400MHz | Yes | 不需要 | 400MHz |
| 伪差分 | Yes | 需要 | 400MHz | Yes | 需 3 电阻 | 166MHz |
真差分是两路真正对称的差分驱动;伪差分是内部用两个”背靠背”的单端驱动拼出的一对信号,性能打折(发送只有 166MHz),且需要外部电阻网络来凑波形。

这张手册插图对比了两种发送器:上面的真 LVDS 发送器直接用一对线接 LVDS 接收器,“无需 3R 电阻网络”,只需要接收端(或片内)的 100Ω 端接;下面的伪 LVDS 发送器要外接 Rs、Rp 电阻才摆出像样的差分波形。
端接电阻是差分设计的灵魂。信号到达线路末端如果阻抗不匹配会反射回来,波形上叠出振铃。LVDS 的标准做法是在接收端跨接一个 100Ω 电阻(等于差分线的特征阻抗)吸收能量:

好消息:安路 FPGA 的 IOBE 内部自带 100Ω 匹配电阻(IOBB 没有),单端摆幅 |Vp − Vn| 不大于 500mV 时可以省掉外部电阻;超过 500mV 或用 IOBB 时才需要外部匹配。同时注意几条规则:
- 不同标准的差分电平一般不能 DC 耦合直连(共模电压不同,见上一节的 Vocm)。需要互通时用 AC 耦合:串电容隔直,再重建共模。
- 差分电平对接要通盘考虑:耦合方式、匹配电阻、共模电压、摆幅四件事。

这张手册插图就是标准的 LVDS AC 耦合链路:发送器出来先串 100nF 隔直电容,中间用 10kΩ 电阻网络把接收侧共模偏置到接收器要求的位置,末端 100Ω 差分端接。做跨电平差分互连(比如 LVPECL 驱动 LVDS)时基本照抄这个拓扑。
IO 在各个阶段的状态
FPGA 从上电到跑起用户逻辑,中间要经过加载(配置)阶段。不是每个阶段 IO 状态都受你控制——这一点不知道,调试”上电瞬间外设乱动作”能把人熬秃。手册给出的各阶段状态表:
| 器件 / 配置 | 芯片上电完成、程序加载前 | 加载中 | 加载完成(用户模式) |
|---|---|---|---|
| EF2 & EF3L15/45,普通 IO(HSWAPEN=0) | 三态 | 三态 + 上拉 | 用户配置 |
| EF2 & EF3L15/45,普通 IO(HSWAPEN=1) | 三态 | 三态 | 用户配置 |
| EF3L40/90,普通 IO(HSWAPEN=0) | 三态 + 上拉 | 三态 + 上拉 | 用户配置 |
| EF3L40/90,普通 IO(HSWAPEN=1) | 三态 + 上拉 | 三态 | 用户配置 |
| EG4,普通 IO(HSWAPEN=0) | 三态 | 三态 + 上拉 | 用户配置 |
| EG4,普通 IO(HSWAPEN=1) | 三态 | 三态 | 用户配置 |
HSWAPEN(High-Z Swap Enable)是专门管”加载过程中 IO 要不要内部上拉”的管脚:=0 时加载中 IO 呈三态 + 弱上拉;=1 时加载中保持纯三态。但注意两点:它只控制加载过程中,上电完成到加载开始前那一段(EF3L40/90 上拉已打开)它管不到;除了普通 IO 还有少部分配置功能 IO,状态要查《硬件设计指南》。
竞争器件对照:Xilinx(竞品)XO2/XO3 从上电到加载完成 IO 是三态 + 下拉,和安路(三态/上拉)不一致——做兼容设计时别想当然。
如果系统要求 IO 在整个阶段维持确定电平(比如使能电机驱动、复位外部芯片,绝不能出现高电平脉冲),靠 HSWAPEN 是不够的,FAE 的建议是:外部加上拉或下拉电阻兜底,让物理电路决定初始电平,不赌芯片内部状态。
再看配置功能管脚在配置成功前后的状态(EF2 系列表格):
| Pin | 配置成功前(HSWAPEN=0) | 配置成功前(HSWAPEN=1) | 配置成功后 |
|---|---|---|---|
| PROGRAMN / INITN / DONE | 上拉到 VCCIO | 上拉到 VCCIO | 软件 ProgPin/InitPin/DonePin 设置 |
| SCLK | 上拉到 VCCIO | 上拉到 VCCIO | 软件 SpiPin 设置 |
| CSN | 下拉到 GND | 下拉到 GND | User I/O |
| TMS/TCK/TDO/TDI/JTAGEN | 上拉到 VCCIO | 上拉到 VCCIO | 软件 JtagPin 设置 |
| D[7:2] | 上拉到 VCCIO | 上拉到 VCCIO | User I/O |
| D[1]、D[0]/DIN | 上拉到 VCCIO | 上拉到 VCCIO | 软件 SpiPin 设置 |
| CSON/DOUT | 上拉到 VCCIO | 上拉到 VCCIO | 软件 SpiPin 设置 |
| Others(其它普通 IO) | 上拉到 VCCIO | High-Z(高阻) | User I/O |
EG4 配置阶段 IO 不可控问题
这是 EG4(包括 EG4S20)一个需要专门知道的历史遗留问题。
现象:EG4 有一些 IO 在配置阶段输出不受控(可能输出强 0、强 1),而不是安安稳稳地三态。
根源:普通 IO 的输出使能由全局输出使能信号 GOE 控制——配置阶段 GOE = 0,输出被”闸住”,管脚安全地三态。但 EG4 有少数 IO 的输出控制不受 GOE 控制:

左图(图 1-1 正确 IO 输出示意):多路器选择 ts(三态控制)来源——用户逻辑或常数 1’b1/1’b0,之后还要过一道 goe(全局输出使能)闸门,配置阶段 goe=0,输出被阻止。

右图(图 1-2 N9 类似 IO 输出示意):少了一道 goe 闸门,ts 的控制逻辑直接来自 fabric(与用户设计相关),配置阶段电路搭建过程中就有可能产生实际输出。
受影响的管脚:EG4X20BG256 有 18 个(M15、M16、L12、K15、P16、L13、K1、R15、L14、T13、L16、L1、T6、P11、L10、M10、N9、P9);EG4A20BG256 有 16 个(L7、M6、P1、P2、C14、G5、A5、A13、C6、F7、A7、A3、B4、A4、D6、D5)。
解决办法(TD 4.6.5.23347 及之后版本已修复该问题的处理流程):
- 在 IO constraints 里把可能出问题的管脚 PackReg 设置为 LIMITED;
- 再把 auto_clear_en 设置为 1(即 disable)。
用旧版 TD 编译、且这些管脚接了”上电不允许乱动”的外设时,务必检查这项设置。
常见坑:电机/继电器使能脚接在这些 IO 上却没处理
配置阶段 IO 一旦输出强 1,接在它上面的电机使能、继电器驱动就可能在上电瞬间误触发。轻则设备”上电抽一下”,重则烧外围器件。用 EG4S20 的参赛作品请对照上面管脚清单和 TD 版本要求处理。
全局时钟 GCLK 管脚
EF2、EF3、EG4 系列内部有 16 条全局时钟网络(GCLK,Global Clock)。时钟是芯片里对延迟、抖动最敏感的信号,所以器件给时钟留了专用通道:

这张手册架构图展示全局时钟资源的组织:四条边(T/R/B/L)的 GCLK IO 经 DCE(缓冲)进入两个 center mux 16×36:1(从 36 个来源里选 16 个),扇出到全芯片的全局时钟线,并连到 PLL。也就是说全局时钟线是稀缺资源,“谁能上”由多路器决定。
管脚名带 GCLK 的 IO 有专用路径直通全局时钟网络,所以:系统主时钟、数据接口的随路时钟,请务必接到 GCLK 管脚,好处有三:
- 专用时钟路径,延时短且固定,不会因为布局布线变化而漂移;
- 时钟进入 FPGA 内部后抖动更小;
- 时钟占空比有保证。
稀缺资源的配对规则(手册特别强调):GCLK IO 是分组编号的,同组不能两个同时用——EG4X 的 GCLKIO 同一侧 0/4、1/5、2/6、3/7 各配一对,每对只能用其中一个;EF2/EF3 的 GCLKIO(B 面)同理,0/4、1/5 不要同时使用。
备注:如果工程里的时钟超过 16 条,不是所有 GCLK IO 都保证能进全局时钟网络(多路器选不下);另外 GCLK IO 只对”输入时钟”有意义,输出时钟用普通 IO 即可。
PROGRAMN 与 JTAG 管脚
加载控制三兄弟 PROGRAMN、INITN、DONE 需要外部上拉;这几个管脚可以复用为 GPIO,但复用可能导致加载问题:
- 如果复用为 GPIO,不建议作为输入(输入会干扰加载时序判断),可以作为输出使用,同时保持外部上拉。
JTAG 管脚的上下拉是 FAE 反复强调的板级设计规矩:TDI、TDO、TMS、JTAG_EN 通过 10K 电阻上拉,TCK 用 10K 下拉。目的是:不接下载线时这些信号也有确定电平,浮空容易引入干扰,可能导致 JTAG 状态机乱跳、芯片莫名其妙复位或加载异常。

这张手册截图(EF2L45LG144B)是官方参考板的实际接法:PROGRAMN 接 10K 上拉和复位按键(按下拉低重新加载),DONE 串 LED + 470R 限流做加载成功指示,INITN 上拉 10K,JTAG 四线(TDO/TCK/TMS/TDI)预留到板边。

这张是 JTAG 插座的正规画法:2×5 排针,各信号经 10K 电阻上拉(TCK 特殊,下拉),保证不插下载器时电平确定。
JTAG 管脚复用 GPIO 的规则:TDI/TDO/TMS/TCK/JTAGEN 可复用为 GPIO,但当它们配置为 GPIO 时,JTAGEN 必须配置为专用 IO——JTAGEN = 1 时可将 TDI/TDO/TMS/TCK 强制切回 JTAG 功能,这是你”救砖”的最后一根稻草,千万别把 JTAGEN 也挪用了。
ESD 静电防护与热插拔
ESD(Electro-Static Discharge,静电放电)防护:
- 静电会在管脚上产生正向、反向的瞬时过冲,IO 内部 ESD 电路的作用是钳位分流,把静电能量泄掉以保护后级电路。
- 但要认清现实:PLD(可编程逻辑器件)的 ESD 能力普遍不强。手册参考值:人体模型(HBM)±1500V、机器模型(CMM/MM)±500V——放在工业环境里很单薄。对外接口若要增强 ESD 防护,需要外部增加 ESD 保护器件(TVS 等),或用 ESD 能力强的 Buffer 芯片隔离。
- ESD 保护结构自带寄生电容,会影响信号边沿速度——对外接口上选 ESD 器件时要看它的结电容,高速信号口用低容值型号。
热插拔(Hot-plug,带电插拔):系统不断电的情况下插拔板卡,FPGA 的 IO 必须满足三条硬要求:
- 器件加电以前管脚就可以被驱动,且不损坏器件;
- 加电前及上电加载过程中 IO 漏电流小——热插拔参数为每 IO 直流电流 < 1mA(手册热插拔规格表:I_1OPIN(DC) 最大 1mA,I_1OPIN(AC) 最大 8mA,AC 条件是信号上升时间 ≥10us)——不会拉低别人的信号,破坏系统正常运行;
- 外部输入信号不能通过器件内部通道对 VCCIO/VCCINT 电源产生激励(就是上一篇讲的”倒灌”问题的热插拔版)。
好消息是:FPGA 本身功能通常不受系统加电顺序影响,片上热插拔特性可以缓解多电压系统的上/下电顺序问题。但注意两条:不是所有 IO 都支持热插拔,查 Datasheet 热插拔章节;相关 IO 的 PCI Clamp、Pull Up 要关闭,防止掉电过程外部信号串到 VCCIO(与上一篇的结论一脉相承)。
多电压输入
有时你要在 3.3V 或 2.5V 的 Bank 里接收 1.0V / 1.8V 的小信号(比如某些 ADC、DDR 类接口的输出)。EF2、EF3 支持这种”多电压输入”,原理是参考电平(Vref):

这张手册插图展示原理:VCCIO 是 3.3V 的 Bank 里,用 2.8KΩ + 0.5KΩ 电阻分压出 0.5V,接到 Bank 的 Vref 管脚;之后这个 Bank 的输入比较器就以 0.5V 为判决门槛,可以正确识别 1.0V 的高电平信号。
使用规则(手册原文展开):
- 高电平为 1.0V 时参考电平取 0.5V;高电平为 1.8V 时参考电平取 0.9V(即高电平的一半)。
- 任何一个 Bank 都可以设置参考电平,且只对本 Bank 有效;一个 Bank 可以同时设置两个参考电平。
- Vref 不可超过 Bank 电压的一半;激励信号应 ≥ Vref 的两倍——保证信号摆幅跨过门槛有足够余量。
- 软件配置示例(TD 约束):
set_pin_assignment { ref_voltage } { LOCATION = V1; IOSTANDARD = VREF2_DRIVER; }、set_pin_assignment { test_signal } { LOCATION = V2; IOSTANDARD = LVCMOS18V33; VREF = VREF2; }——把信号管脚的 IO 标准声明成带 V33 后缀的多电压标准并绑定 VREF 即可。
注意:多电压支持仅针对输入! 输出要用别的电压怎么办?FAE 给的变通:用高阻输出 + 外部上拉到目标电压(开漏思路),靠外阻把电平”顶”上去。
StateHoldIO:无缝升级
普通升级场景有个固有问题:升级并立刻刷新时,IO 会经历一段三态过程,输出电平丢失。如果 FPGA 在控制着正在运行的执行机构(阀门、电机、通信链路),这段”断联”可能引发事故。StateHoldIO 的目标就是:从写入新位流到新逻辑运行的整个过程中,IO 保持原先的输出状态不变,实现无缝升级。

这张流程图给出四个步骤的时间线:①后台升级 Flash 且 FPGA 正常运行;②锁定输出电平;③写 SRAM、运行新位流;④释放 IO 回用户逻辑。实现方式有三种:
- JTAG 后台模式把位流写进 Flash:此过程 FPGA 保持运行,IO 完全不变(最稳,只写 Flash 不动 SRAM)。
- JTAG 直接把位流写进 SRAM:生成 SVF 时必须在界面勾选 “State hold IO”——SVF 里会包含 RSDR 指令,先把所有输出 IO 的电平锁住,再写 SRAM。

这张是 TD 下载工具的截图:Mode 选 SVF for SRAM,右侧 Option 勾选 State hold IO——漏勾的话 IO 电平会在写 SRAM 时瞬断。
3. 接着运行步骤 2 同时生成的 *_bypass.svf 文件:把输出 IO 释放给新的内部逻辑控制。
限制与备注:StateHoldIO 目前只能通过 JTAG 接口实现;早期 TD 版本不支持,需更新(DL1.5 可支持);客户做嵌入式 JTAG 升级代码时需要使用 AJE 文件格式(AJE 是什么,见硬件接口(三)最后一节)。
其它注意事项
最后把手册里零散但重要的清单收拢(每条都值得在画板前默念一遍):
- 兼容设计:和竞品(如 Lattice/Xilinx 小器件)做兼容设计时,Bank 和 IO 分配可能不完全一致,要看《兼容设计指南》和管脚比对文件,不能只改丝印。
- 外部下拉阻值 1KΩ:理由与完整推导见硬件接口(一),10KΩ 扛不住内部上拉。
- IO 端口不能直接接地或 VCCIO:如有此类固定电平连接,中间必须串电阻——芯片内部上下拉、钳位结构与硬接的电源/地打架会产生持续电流。
- 部分管脚不支持热插拔,以 Datasheet 热插拔章节为准。
- IO 要满足 SSO(Simultaneous Switching Output,同步开关输出噪声)要求:同一 Bank 大量 IO 同时同向翻转时地弹/电源噪声会激增,详见《FPGA SSO 限制规则说明》。
- 差分 IO 接单端时钟时,差分另一端的负向过冲不能低于 −0.3V。
- IO 高电平早于 VCCIO 到来,会导致内部上拉打开(与用户配置无关),两个典型翻车场景:① ADC 输入通道——内部上拉污染采样电压,解法是外部接 1K 下拉;② 数字输入信号被误拉高——同样用 1K 下拉压制,不能用 10K。
本篇通关标准:
- 能对比说出 IOBB 与 IOBE 至少四处差异(驱动可调性、差分匹配电阻、PCI Clamp、迟滞等),并知道 EG4 全系为 IOBE。
- 能解释 LVDS 为什么功耗最小、为什么输入端要 100Ω 端接、真差分与伪差分在发送速率和外部电阻上的区别。
- 能画出 EG4 上电→加载→用户模式三阶段 IO 状态(含 HSWAPEN 两种取值),说出 EG4 配置期 IO 不可控问题的管脚清单与 TD 解决办法,以及 GCLK 管脚配对使用规则。
LVDS、LVPECL、CML 三者中,为什么说 LVDS 功耗最小、却到不了极高速率?
LVDS 摆幅只有 350mV,驱动电流小所以功耗最小;但小摆幅、低共模的结构翻转速度有限,一般支持到 2Gbps 以内。CML 与 LVPECL 摆幅大、翻转快,可支持 10Gbps 以上极高速率,代价是功耗更高、LVPECL 外围电阻网络也更复杂。另外只有 LVDS 有国际统一标准。
HSWAPEN 接高和接低,加载过程中普通 IO 分别是什么状态?它能解决"上电后到加载前"的电平保持吗?
HSWAPEN=0:加载中 IO 为三态 + 内部上拉;HSWAPEN=1:加载中为纯三态。注意它只控制”加载过程中”——EF3L40/90 在上电完成后、加载开始前上拉已经打开,HSWAPEN 管不到这一段。若 IO 全程需要确定电平,必须外部加上/下拉电阻兜底。
EG4S20 上电瞬间可能输出乱电平的问题,涉及哪些管脚,怎么在软件里规避?
根源是部分 IO 的输出使能不受 GOE 控制(如 EG4X20BG256 的 M15/M16/L12/K15/P16/L13/K1/R15/L14/T13/L16/L1/T6/P11/L10/M10/N9/P9 共 18 个)。规避:使用 TD 4.6.5.23347 之后版本,在 IO constraints 中将这些管脚 PackReg 设为 LIMITED,并将 auto_clear_en 设为 1(disable)。
JTAG 的 TCK 为什么是下拉而不是和其它 JTAG 信号一样上拉?
TCK 是 JTAG 状态机的移位时钟,空闲时需要确定的低电平以避免浮空干扰导致状态机误跳变;TDI/TDO/TMS 上拉是让测试逻辑处于已知的非活动状态。总之核心诉求一致:不接下载线时 JTAG 总线不能浮空。
要在 3.3V Bank 里接收 1.8V 信号,Vref 应该设多少?输出 1.8V 信号也能这样干吗?
输入可以:参考电平取高电平的一半即 0.9V(外部电阻分压产生,且不得超过 Bank 电压一半、激励信号要 ≥ Vref 的两倍),在 TD 约束里用 LVCMOS18V33 类多电压标准并绑定 VREF。输出不行——多电压仅支持输入;输出需用高阻 + 外部上拉到 1.8V 的开漏方式实现。