1、SFP接口概述:封装定义、引脚功能、电气特性与协议标准

各位同学,咱们今天聊聊SFP光模块接口。说实话,这个接口在FPGA项目里太常见了——从数据中心到通信基站,从视频传输到仪器仪表,几乎无处不在。我最早接触SFP是在一个10G光传输项目上,当时被那些密密麻麻的引脚搞得一头雾水。后来踩了不少坑,才慢慢摸清门道。

好,咱们正式开始。

1.1 SFP封装定义

SFP,全称Small Form-factor Pluggable,小封装可插拔模块。它比早期的GBIC模块小了一半多,所以叫“小封装”。

物理尺寸上,SFP模块大约8.5mm宽、13.4mm高、56.5mm深。你想想看,这么小的体积里集成了光收发、电接口、控制逻辑,确实挺紧凑的。

封装形式是20引脚的电接口,采用边缘连接器方式插入笼子。笼子通常带EMI屏蔽罩,这个细节我后面会讲。

关键点:SFP封装兼容SFP+(10G)、SFP28(25G)甚至部分SFP56(50G)的物理接口。也就是说,同一个笼子可以插不同速率的光模块——前提是你的FPGA SerDes能支持。

1.2 引脚功能说明

SFP模块有20个引脚,编号从1到20。我习惯把它们分成三组:电源、数据、控制。

先看引脚定义表:

引脚号 名称 功能 方向
1 VeeT 发射器地 电源
2 Tx_Fault 发射器故障指示 输出
3 Tx_Disable 发射器禁用控制 输入
4 MOD_DEF2 I2C数据线(SDA) 双向
5 MOD_DEF1 I2C时钟线(SCL) 输入
6 MOD_DEF0 模块存在检测(接地) 输出
7 Rate_Select 速率选择(可选) 输入
8 LOS 信号丢失告警 输出
9 VeeR 接收器地 电源
10 VeeR 接收器地 电源
11 VeeR 接收器地 电源
12 RD- 接收数据差分负 输出
13 RD+ 接收数据差分正 输出
14 VeeR 接收器地 电源
15 VccR 接收器电源(3.3V) 电源
16 VccT 发射器电源(3.3V) 电源
17 VeeT 发射器地 电源
18 TD+ 发射数据差分正 输入
19 TD- 发射数据差分负 输入
20 VeeT 发射器地 电源

这里有几个引脚我要特别强调一下:

  • Tx_Disable(引脚3):高电平或悬空时关闭发射器。我建议FPGA上电后先拉高这个引脚,等初始化完成再拉低。为什么?防止上电瞬间光模块乱发信号。
  • LOS(引脚8):接收信号丢失指示。低电平表示信号正常,高电平表示无光或信号太弱。注意,这个信号有滞后特性,不是瞬间跳变的。
  • MOD_DEF0/1/2(引脚4/5/6):这是I2C接口,用来读取模块的EEPROM信息。EEPROM里存了厂商、型号、序列号、速率能力等数据。我习惯在初始化时先读一下,确认模块类型。

个人经验:MOD_DEF0是接地引脚,用来检测模块是否插入。FPGA可以通过检测这个引脚的电平来判断模块是否存在。但要注意,有些笼子的设计会把这个信号上拉,所以实际使用时需要确认硬件原理图。

1.3 电气特性

电气特性这块,说白了就是电压、电流、时序这些硬指标。搞错了,模块不工作甚至烧毁。

电源要求:

  • VccR和VccT都是3.3V ±5%
  • 典型功耗:1G模块约0.8W,10G模块约1.5W,25G模块约2.5W
  • 上电时序:建议先给FPGA供电,再给光模块供电。我遇到过因为上电顺序不对导致模块锁死的案例。

高速信号接口:

  • TD+/TD-和RD+/RD-都是CML电平(电流模式逻辑)
  • 差分阻抗:100Ω ±10%
  • 共模电压:约2V(以地为参考)
  • 摆幅:典型400-800mVpp

注意:FPGA的SerDes接口通常也是CML电平,但共模电压可能不匹配。比如Xilinx的GTH收发器共模电压是1.2V左右,而SFP模块是2V。这时候需要AC耦合电容来隔离直流分量。我见过有人直接直连,结果模块工作不稳定,丢包严重。

控制信号电平:

  • Tx_Disable、Rate_Select:LVTTL电平,3.3V兼容
  • Tx_Fault、LOS:LVTTL输出,需上拉至3.3V
  • I2C接口:标准I2C电平,速率通常100kHz或400kHz

1.4 协议标准

SFP接口遵循的标准主要是SFF-8472和INF-8074i。这两个文档,说实话,内容很多,但咱们只需要关注几个核心点。

SFF-8472:定义了数字诊断监控接口(DDM)。通过I2C读取模块内部的监测数据,包括:

  • 温度(精度±3°C)
  • 供电电压(精度±3%)
  • 偏置电流(精度±10%)
  • 发射光功率(精度±3dB)
  • 接收光功率(精度±3dB)

这些数据在A0h地址的EEPROM里,从96字节开始。我写过一个FPGA的I2C控制器专门读这些参数,用来做链路质量监控。

INF-8074i:定义了SFP的机械尺寸和电气接口。说白了就是告诉你怎么插、怎么焊、怎么走线。

避坑指南:我曾经在一个项目里忽略了SFP模块的速率协商机制。有些模块支持自动协商,有些需要手动配置。如果你用的是10G模块插在1G的FPGA接口上,大概率不工作。解决办法是:要么选固定速率的模块,要么在FPGA里实现自动协商逻辑。

嗯,关于SFP接口的基本概念,今天就先聊到这儿。下一节咱们会深入讲FPGA怎么和SFP模块通信,包括SerDes配置、时钟方案、以及实际调试中常见的波形问题。到时候我会拿一个实际项目的代码来演示。

记住一句话:SFP接口看似简单,但细节决定成败。电源、阻抗、时序、协议,哪一环出问题,链路都跑不起来。