这一篇在干嘛?

系列第二篇,也是信息量最大的一篇。覆盖 EF2/EF3/EG4 的 IO 类型(IOBB/IOBE)、三种高速差分电平(LVDS/LVPECL/CML)、IO 在上电各阶段的状态、配置管脚与 JTAG、ESD 与热插拔、多电压输入、StateHoldIO 无缝升级。上一篇讲的基础配置见:硬件接口(一):IO 上下拉与 PCI Clamp,加载相关见:硬件接口(三):FPGA 加载模式全解

IOBB 与 IOBE:基本型与增强型

三种常见差分电平

真差分与伪差分

IO 在各个阶段的状态

EG4 配置阶段 IO 不可控问题

全局时钟 GCLK 管脚

PROGRAMN 与 JTAG 管脚

ESD 静电防护与热插拔

多电压输入

StateHoldIO:无缝升级

其它注意事项

IOBB 与 IOBE:基本型与增强型

安路的 IO 不是千篇一律的。EF2、EF3L15/EF3L45 器件的 IO 分两种类型:IOBB(基本型)和 IOBE(增强型);而 EF3L90、EF3L40 的 IO 全部是 IOBE,EG4(含比赛用的 EG4S20)的 IO 也全部是 IOBE,且 In/Out Delay 范围更大。

两者差在哪?看手册的对比表(已重排为 markdown,原截图见后续小节里的手册表格截图对照):

特性EF2/EF3 IOBBEF2/EF3 IOBE
单端 I/O支持支持
差分 I/O 输入支持,匹配电阻支持,匹配电阻
差分 I/O 输出仅伪差分真、伪差分都支持
输出驱动能力不可调可调
Slew Rate(压摆率)不可调可调
Pull Type支持支持
PCI Clamp
Hysteresis(迟滞)
OverDriven
In Delay (ns)0.336–0.6710.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

LVDS、LVPECL、CML 三种差分电平的摆幅与共模电压位置对比:LVDS 摆幅最小、LVPECL 共模最高

这张手册插图把三种电平的波形摆在一起:红线/蓝线是 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),互通性最有保障。

差分信号的主要参数(看波形图就懂):

LVDS 波形实测含义:单端摆幅 350mV、共模 1.2V;下方差分探头看到的 ±350mV 差分摆幅

  • 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不需要400MHzYes不需要400MHz
伪差分Yes需要400MHzYes需 3 电阻166MHz

真差分是两路真正对称的差分驱动;伪差分是内部用两个”背靠背”的单端驱动拼出的一对信号,性能打折(发送只有 166MHz),且需要外部电阻网络来凑波形

真差分 LVDS 发送器直连接收器(仅输入端 100Ω),伪差分发送器需要外部 Rs/Rp 电阻网络

这张手册插图对比了两种发送器:上面的真 LVDS 发送器直接用一对线接 LVDS 接收器,“无需 3R 电阻网络”,只需要接收端(或片内)的 100Ω 端接;下面的伪 LVDS 发送器要外接 Rs、Rp 电阻才摆出像样的差分波形。

端接电阻是差分设计的灵魂。信号到达线路末端如果阻抗不匹配会反射回来,波形上叠出振铃。LVDS 的标准做法是在接收端跨接一个 100Ω 电阻(等于差分线的特征阻抗)吸收能量:

LVDS 发送器与接收器之间跨接 100Ω 端接电阻,用于阻抗匹配吸收反射

好消息:安路 FPGA 的 IOBE 内部自带 100Ω 匹配电阻(IOBB 没有),单端摆幅 |Vp − Vn| 不大于 500mV 时可以省掉外部电阻;超过 500mV 或用 IOBB 时才需要外部匹配。同时注意几条规则:

  • 不同标准的差分电平一般不能 DC 耦合直连(共模电压不同,见上一节的 Vocm)。需要互通时用 AC 耦合:串电容隔直,再重建共模。
  • 差分电平对接要通盘考虑:耦合方式、匹配电阻、共模电压、摆幅四件事。

LVDS 的 AC 耦合典型电路:两路各串 100nF 隔直电容,10kΩ×4 重建共模偏置,末端 100Ω 差分端接

这张手册插图就是标准的 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下拉到 GNDUser I/O
TMS/TCK/TDO/TDI/JTAGEN上拉到 VCCIO上拉到 VCCIO软件 JtagPin 设置
D[7:2]上拉到 VCCIO上拉到 VCCIOUser I/O
D[1]、D[0]/DIN上拉到 VCCIO上拉到 VCCIO软件 SpiPin 设置
CSON/DOUT上拉到 VCCIO上拉到 VCCIO软件 SpiPin 设置
Others(其它普通 IO)上拉到 VCCIOHigh-Z(高阻)User I/O

EG4 配置阶段 IO 不可控问题

这是 EG4(包括 EG4S20)一个需要专门知道的历史遗留问题。

现象:EG4 有一些 IO 在配置阶段输出不受控(可能输出强 0、强 1),而不是安安稳稳地三态。

根源:普通 IO 的输出使能由全局输出使能信号 GOE 控制——配置阶段 GOE = 0,输出被”闸住”,管脚安全地三态。但 EG4 有少数 IO 的输出控制不受 GOE 控制

正常 IO 输出结构:ts 由 fabric 控制,输出使能还经过 goe 闸门,配置阶段输出被阻止

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

EG4 不可控 IO 输出结构:多路器缺少 goe 闸门,配置阶段 ts 可能直接放行输出

右图(图 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 及之后版本已修复该问题的处理流程):

  1. 在 IO constraints 里把可能出问题的管脚 PackReg 设置为 LIMITED
  2. 再把 auto_clear_en 设置为 1(即 disable)

用旧版 TD 编译、且这些管脚接了”上电不允许乱动”的外设时,务必检查这项设置。

常见坑:电机/继电器使能脚接在这些 IO 上却没处理

配置阶段 IO 一旦输出强 1,接在它上面的电机使能、继电器驱动就可能在上电瞬间误触发。轻则设备”上电抽一下”,重则烧外围器件。用 EG4S20 的参赛作品请对照上面管脚清单和 TD 版本要求处理。

全局时钟 GCLK 管脚

EF2、EF3、EG4 系列内部有 16 条全局时钟网络(GCLK,Global Clock)。时钟是芯片里对延迟、抖动最敏感的信号,所以器件给时钟留了专用通道:

全局时钟网络架构:四边 GCLK IO 经 DCE 缓冲进入两个 16×36:1 中心多路器,扇出到全局时钟线并连接 PLL

这张手册架构图展示全局时钟资源的组织:四条边(T/R/B/L)的 GCLK IO 经 DCE(缓冲)进入两个 center mux 16×36:1(从 36 个来源里选 16 个),扇出到全芯片的全局时钟线,并连到 PLL。也就是说全局时钟线是稀缺资源,“谁能上”由多路器决定。

管脚名带 GCLK 的 IO 有专用路径直通全局时钟网络,所以:系统主时钟、数据接口的随路时钟,请务必接到 GCLK 管脚,好处有三:

  1. 专用时钟路径,延时短且固定,不会因为布局布线变化而漂移;
  2. 时钟进入 FPGA 内部后抖动更小;
  3. 时钟占空比有保证。

稀缺资源的配对规则(手册特别强调):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 状态机乱跳、芯片莫名其妙复位或加载异常。

EF2L45 最小系统原理图局部:PROGRAMN/DONE/INITN 上拉与复位按键、JTAG 四线走线

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

JTAG 调试插座电路:Header 5×2,TCK 经 10K 下拉,TDI/TMS/TDO 上拉到 VREF

这张是 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 必须满足三条硬要求:

  1. 器件加电以前管脚就可以被驱动,且不损坏器件;
  2. 加电前及上电加载过程中 IO 漏电流小——热插拔参数为每 IO 直流电流 < 1mA(手册热插拔规格表:I_1OPIN(DC) 最大 1mA,I_1OPIN(AC) 最大 8mA,AC 条件是信号上升时间 ≥10us)——不会拉低别人的信号,破坏系统正常运行;
  3. 外部输入信号不能通过器件内部通道对 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)

多电压输入原理:3.3V Bank 内用 2.8K/0.5K 电阻分压出 0.5V 作为 Vref,接收 1.0V 输入信号

这张手册插图展示原理: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 保持原先的输出状态不变,实现无缝升级

StateHoldIO 升级流程时间线:后台升级 Flash 且正常运行 → 锁定输出电平 → 写 SRAM 运行新位流 → 释放 IO

这张流程图给出四个步骤的时间线:①后台升级 Flash 且 FPGA 正常运行;②锁定输出电平;③写 SRAM、运行新位流;④释放 IO 回用户逻辑。实现方式有三种:

  1. JTAG 后台模式把位流写进 Flash:此过程 FPGA 保持运行,IO 完全不变(最稳,只写 Flash 不动 SRAM)。
  2. JTAG 直接把位流写进 SRAM:生成 SVF 时必须在界面勾选 “State hold IO”——SVF 里会包含 RSDR 指令,先把所有输出 IO 的电平锁住,再写 SRAM。

TD 下载工具界面:选择 SVF for SRAM 模式并勾选 State hold IO 选项

这张是 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 管脚配对使用规则。