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接口看似简单,但细节决定成败。电源、阻抗、时序、协议,哪一环出问题,链路都跑不起来。