做网口项目的人应该都遇到过这种怪事:FPGA程序烧进去了,PHY芯片的Link灯也亮了,但设备就是ping不通。翻开原理图一条条查,SGMII这对差分线在芯片之间明明只有几厘米,看上去也平平无奇,可问题偏偏就藏在这“几厘米”里。
SGMII,全称Serial Gigabit Media Independent Interface,串行千兆媒体独立接口,是FPGA和PHY芯片之间最常见的高速链路之一。它在FPGA板卡上承担着MAC和PHY之间的数据搬运工作,速率固定跑在1.25Gbps,使用8B/10B编码,信号形态是一对发送差分线加一对接收差分线。很多工程师只把它当成普通差分对来布线,结果实际调试的时候,Link能建立、自动协商能完成,数据却一直错包重传,最后折腾好几天,才发现问题出在AC耦合电容摆错位置、或者参考时钟没同源这种看似不起眼的细节上。
这篇就顺着信号走的路径,从FPGA引脚一路讲到RJ45网口,把每个环节的原理、设计要点、调试方法一次说清楚。适合正在做FPGA板卡网口设计的人,也适合刚接触SGMII但没系统梳理过这条链路的人。下面我按实际项目里的调试思路来拆解。
1. 整体设计与链路拆解
1.1 SGMII到底是个什么接口
SGMII是Cisco主导定义的一种串行接口,用于连接以太网MAC(在FPGA里通常是一个IP核)和外部PHY芯片。它用一对差分线发送、一对差分线接收,工作速率固定为1.25Gbps,这个速率不会因为以太网工作在10M、100M还是1000M而改变。低速模式下,PHY会通过重复发送相同数据帧来匹配较低的线速,这个机制叫“速率适配”。
你可能要问,为什么不用更经典的GMII接口?GMII需要8位数据线加时钟,收发加起来二十多根信号,加上控制信号几十根,在FPGA引脚资源紧张的时候非常不划算。SGMII只需要4根高速线(TX_P/TX_N/RX_P/RX_N)加上MDC/MDIO管理总线,引脚数量大幅减少。而且GMII时钟要跑到125MHz,源同步时序约束在PCB上很敏感,SGMII的时钟是嵌在串行数据流里的,由收发器内部的CDR恢复,时序上省心很多。
对比一下目前常见的几种MAC-PHY接口:
| 接口类型 | 数据位宽 | 时钟频率 | 引脚数量 | 适用场景 |
|---|---|---|---|---|
| GMII | 8bit | 125MHz | 24以上 | 早期设计,引脚充足但不是推荐 |
| RGMII | 4bit DDR | 125MHz | 12左右 | 低成本,对时序约束敏感 |
| SGMII | 串行1.25Gbps | 嵌在数据中 | 4+管理 | 引脚少,速率高,适合FPGA |
从表格能明显看出,在FPGA板卡上SGMII几乎是平衡速度和引脚资源的最优解。这也是为什么现在的交换芯片、FPGA开发板、嵌入式ARM平台普遍采用SGMII作为MAC和PHY之间的标准接口。
1.2 整条链路的地图
先说结论:SGMII信号从FPGA到网口,要经过六个环节。
FPGA内部以太网IP核的MAC部分产生数据,进入SGMII IP核的PCS层完成8B/10B编码,然后经过SerDes发送器把并行数据转成1.25Gbps的高速串行差分信号,从FPGA的专用引脚输出。信号离开FPGA引脚后,先经过一小段PCB走线,再穿过AC耦合电容,然后到达PHY芯片的SGMII接口。PHY芯片内部完成串并转换、10B/8B解码,再把数据交给PMA层调制成模拟信号,通过MDI接口驱动网络变压器,最后由RJ45插座和网线连接对端设备。
值得强调的是,这条链路上FPGA设计工程师、原理图工程师、PCB工程师各管一段,最容易出现“各扫门前雪”的情况。FPGA工程师认为PHY寄存器配置是硬件的事,硬件工程师认为差分走线是PCB的事,PCB工程师只保证阻抗和等长,结果整体联调时谁都说不清问题出在哪。所以做这个项目,最好从头到尾把链路地图刻在脑子里。
1.3 为什么SGMII链路容易翻车
SGMII速率1.25Gbps,在整个高速接口里并不算特别快,但它的风险恰恰在于“看起来不难”。很多团队对待SGMII就像对待普通LVDS一样,布局布线不够讲究,实际测试时就暴露了问题。
SGMII的可靠性取决于四件事:PCB差分阻抗是否接近100欧姆、AC耦合电容的位置和取值是否合理、参考时钟是否干净同源、PHY寄存器配置是否正确。这四个因素任何一个出问题,都可能导致Link不稳定、误码率高甚至完全不通。而SGMII的信号又不像是模拟视频信号那样可以直观看到画面模糊,它的故障表现往往很“软”——ping偶尔丢包、百兆正常千兆不通、长时间运行后断链,这类问题排查起来特别耗时。
2. FPGA与PHY之间的SGMII接口设计
2.1 引脚分配与关键信号
FPGA和PHY之间的SGMII接口,核心信号并不复杂。
| 信号名称 | 方向 | 作用 | 设计要点 |
|---|---|---|---|
| SGMII_TX_P/N | FPGA -> PHY | 发送差分对 | 100欧姆差分阻抗,等长控制 |
| SGMII_RX_P/N | PHY -> FPGA | 接收差分对 | 100欧姆差分阻抗,等长控制 |
| MDC | FPGA -> PHY | 管理时钟 | 频率建议不超过12.5MHz |
| MDIO | FPGA <-> PHY | 管理数据 | 需要上拉电阻,典型4.7k |
| PHY_125M_CLK | PHY -> FPGA | SGMII参考时钟 | 必须与PHY同源,多用于FPGA侧IP核 |
| PHY_RESET_N | FPGA -> PHY | 复位控制 | 上电时序需满足PHY手册要求 |
引脚分配时,优先选择FPGA器件上专用的高速串行引脚组(在Xilinx器件中通常标记为MGTP/MGTY,在Intel器件中标记为Native Transceiver引脚),这些引脚内部直接连接到收发器硬核,不要随便接到普通IO上,不然就白白浪费了SerDes能力。
2.2 阻抗、等长与PCB叠层
SGMII标准的差分阻抗要求是100欧姆。这个100欧姆是由PCB层叠和线宽线距共同决定的。以常见的4层板、板厚1.6毫米、FR4材质为例,表层微带线如果要做到100欧姆差分阻抗,线宽大约在5到6mil、线距大约在8到10mil,但具体数值必须用阻抗计算工具结合实际叠层参数去算,不能照抄别人板子上的数字。
我在项目里习惯用Polar Si8000或者Saturn PCB Design Toolkit做阻抗预估,然后让板厂用他们的叠层数据复算确认。设计阶段就把阻抗要求写进PCB工艺文件里,要求板厂对SGMII差分对做阻抗测试并出报告,这一点千万别省,省了后面调试时候的返工成本更大。
等长方面,SGMII差分对内P/N等长要控制在5mil以内,两个方向的差分对之间总长差控制在50mil以内比较稳妥。1.25Gbps的信号,对应的波长大约在120毫米左右,理论上等长要求没那么极端,但留出裕量总没坏处。我见过一个项目,SGMII对内做了严格等长,但忽略了对间等长,接收端时钟恢复模块工作不稳定,随机丢包,最后重新改板才解决。
2.3 AC耦合电容与回流路径
SGMII链路必须串联AC耦合电容,这是SGMII规范明确规定的。电容的作用是隔离PHY和FPGA两端的直流电平差异。SGMII接口的共模电平和FPGA收发器输出的共模电平并不完全一致,直接直流耦合可能导致共模不匹配,轻则信号畸形,重则烧毁PHY的输入级。
电容取值常见0.1uF,封装0402或0603都可以,推荐0402以减小焊盘寄生电容。最关键的一点是:AC耦合电容要靠近发送端放置,也就是FPGA发出信号时电容尽量靠近FPGA一侧,PHY发出信号时电容尽量靠近PHY一侧。原因是发送端的高速信号经过电容后,会产生一个轻微的阻抗突变,把这个突变放在链路靠近驱动器的地方,对信号质量影响最小。另外,两条差分线上的耦合电容位置要保持对称,不要一个靠前一个靠后。
回流路径方面,SGMII差分对下方必须保证完整的参考地平面,不要在信号路径上跨过电源分割槽。如果需要换层,在换层过孔旁边补一个接地过孔,给返回电流提供最短路径。这个原则几乎所有高速信号都适用,但SGMII板卡上经常因为BGA扇出布线空间紧张,工程师顺手让差分对跨了个分割,结果就成了误码源。
2.4 参考时钟的同源设计
SGMII的时钟方案是调试中最容易被忽略的环节。很多PHY芯片有CLK125输出引脚,可以从PHY产生一个125MHz参考时钟送给FPGA,FPGA侧的SGMII IP核用这个时钟作为参考时钟。这种做法的好处是保证整条SGMII链路时钟同源,避免FPGA和PHY各自用自己的晶振,频率偏差导致CDR失锁。
以Marvell 88E1512为例,它的CLK125_KD引脚可以通过strap电阻配置为输出125MHz参考时钟。这个125MHz并不是SGMII的数据时钟本身,而是发送端PCS逻辑的参考时钟,但FPGA和PHY用同一个参考时钟,对整个系统的稳定性有很大帮助。实际项目里,我会检查PHY的参考时钟是否干净,用示波器看时钟沿的抖动情况。如果时钟信号上叠加了明显的电源噪声,SGMII的误码率会明显上升。
3. PHY芯片的配置与SGMII链路建立
3.1 PHY工作模式的strap配置
PHY芯片通常支持多种MAC接口模式,比如RGMII、GMII、SGMII、1000BASE-X等,芯片型号的具体模式由硬件strap引脚在复位释放时采样决定。以常用的88E1512为例,它的CONFIG0到CONFIG5引脚通过上拉或下拉电阻设置工作模式、PHY地址、LED行为等参数。
这里特别容易踩坑。有的工程师画原理图时直接从参考设计复制strap配置,但没有对照自己的实际需求检查。比如参考设计用的是RGMII模式,而你FPGA这边想做SGMII,strap没改,PHY复位之后根本不会在SGMII接口上输出信号,FPGA侧SGMII IP核一直显示信号丢失,排查半天也不知道问题在哪。
建议原理图阶段就把PHY的strap引脚状态整理成表格,逐项确认:接口模式是否为SGMII、PHY地址是多少、是否启用CLK125输出、是否禁用休眠模式等。这些细节在芯片数据手册里都有明确的表格说明,不同型号引脚数量和作用可能不同,务必以对应型号手册为准。
3.2 MDIO总线与寄存器读写
MDIO是管理SGMII和PHY的“控制通道”。MDC是FPGA输出的时钟,MDIO是双向数据线。MDIO需要接上拉电阻,一般4.7k到10k欧姆上拉到PHY的VDDIO。如果多个PHY挂在同一条MDIO总线上,每个PHY必须设置不同的地址,通过PHYAD引脚的高低电平区分。
MDIO读写过程并不复杂,每个访问周期由起始码、操作码、PHY地址、寄存器地址、数据和前导码组成。但实际调试时我不会直接对着时序写代码,而是先确认FPGA的MDIO控制器能读到PHY的ID寄存器。比如88E1512的寄存器0x02和0x03里存放芯片ID,读出来是0x0141和0x0E10之类,如果读到0xFFFF或者全零,先别急着怀疑MDIO控制器,很可能是PHY没上电、复位没释放、或者PHY地址不对。
3.3 复位时序与IP核初始化顺序
PHY的复位时序非常讲究。绝大多数PHY芯片要求所有电源稳定之后,复位信号再保持一段低电平时间(常见10毫秒以上),然后释放复位。释放复位后,内部strap引脚采样、寄存器默认值加载、时钟稳定等还需要时间,一般建议释放复位后再等100毫秒以上,才开始通过MDIO访问PHY。
FPGA侧SGMII IP核的初始化顺序也要注意。以Xilinx的1G/2.5G Ethernet PCS/PMA or SGMII IP核为例,标准操作是先复位整个IP核,然后等待复位完成,再观察SGMII自动协商状态。如果FPGA IP核的复位和PHY的复位释放同时进行,两边可能都在初始化过程中互相等待,表现为链路状态一直起不来。工程上我习惯软件上先释放PHY复位,延时足够时间,再释放FPGA IP核复位,这两个复位的先后顺序写死在程序里,保证每次上电时序一致。
3.4 SGMII自动协商的逻辑
SGMII接口上有一种特殊的自动协商机制,它和网线上那种传统自动协商不是一回事。传统以太网自协商是PHY通过对端PHY在线缆上完成的,协商的是双工模式和速率。而SGMII的自协商是MAC侧(FPGA)和PHY之间的内部协商,作用是把MAC侧希望的速率(1000M、100M还是10M)通过SGMII接口告诉PHY。
很多工程师不理解这一点,看到FPGA的SGMII IP核配置里有个auto-negotiation选项就总是犹豫要不要打开。实际上,如果FPGA要自适应连接对端设备的速度,SGMII的自协商就要开启。PHY会把自己在对端协商到的速率通过SGMII链路反馈给FPGA,FPGA侧IP核解析后调整MAC侧速率。如果SGMII自动协商没完成,PHY是无法正确转达对端速率的,MAC和PHY的速率不一致,数据通信就会失败。
4. 从PHY到RJ45的模拟侧传输
4.1 PHY到网络变压器这一段
SGMII信号在PHY内部经过PCS和PMA处理之后,在PHY的MDI引脚上输出的是模拟信号,已经不是数字逻辑电平了。MDI引脚连接到网络变压器,变压器再连接到RJ45。
网络变压器的作用有三个:一是电气隔离,把PHY芯片和外部网线隔开,防止雷击浪涌和共模干扰损坏PHY;二是阻抗匹配,让PHY的模拟前端和网线的特性阻抗匹配;三是提供共模抑制,变压器本身对差分信号透明,但对共模干扰有衰减作用。
实际选型时,选择1:1变比的网络变压器即可,但要关注隔离耐压等级,一般要求1.5kV以上。很多开发板直接使用带变压器的RJ45连接器,比如HR911105A或者B88269X1这类集成元件,外部只需一个RJ45座就能完成PHY到网线的连接,省去了独立变压器和共模电感的布线空间,非常适合FPGA板卡这种对面积敏感的设计。
4.2 RJ45引脚定义与接线顺序
RJ45是8P8C插座,不同速率下使用的线对不同。
| 引脚 | 100BASE-TX用途 | 1000BASE-T用途 | 568B色序 |
|---|---|---|---|
| 1 | TX+ | 线对B(BI_DA+) | 白橙 |
| 2 | TX- | 线对B(BI_DA-) | 橙 |
| 3 | RX+ | 线对C(BI_DB+) | 白绿 |
| 4 | 未用 | 线对D(BI_DC+) | 蓝 |
| 5 | 未用 | 线对D(BI_DC-) | 白蓝 |
| 6 | RX- | 线对C(BI_DB-) | 绿 |
| 7 | 未用 | 线对A(BI_DD+) | 白棕 |
| 8 | 未用 | 线对A(BI_DD-) | 棕 |
做FPGA板卡网口设计时要注意,1000BASE-T的4对线全部参与收发,同时双向传输,所以MDI引脚的方向不再是简单的TX和RX。PCB布线时,这4对线从PHY出来后到RJ45之间的等长、阻抗要求都比1000BASE-TX要高,不过速率本身也只有125MHz的4D-PAM5信号,只要按100欧姆差分对布好,问题不大。
4.3 共模电感、ESD与地处理
网络变压器和RJ45之间,很多参考设计会加共模电感。共模电感的作用是抑制网线上传来的共模EMI噪声,防止它们通过变压器耦合进PHY芯片。选型时关注100MHz下的共模阻抗,常见几十欧姆到几百欧姆。但我经历过一次教训:某个项目中选了一颗600欧姆@100MHz的共模电感,结果网线稍长一点就频繁断链。原因就是共模电感阻抗过大,对正常工作信号的非理想效应也被放大了,导致信号质量恶化。后来换成100欧姆左右的型号,问题消失。所以共模电感不是越大越好,要结合PHY手册推荐选型。
地处理上,建议把RJ45的屏蔽壳通过一个高压电容(常见1nF到4.7nF,耐压2kV)连接到系统地,让高频噪声有泄放路径,同时直流上仍然隔离。PHY侧的参考地,很多PHY手册会推荐使用“PHY隔离地”,通过磁珠或0欧电阻连接数字地,具体按手册方案来。不要自作主张把所有地都直连,浪涌测试时会很痛苦。
4.4 设计复查清单
画完原理图、布完线,我会拿着一张自己整理的设计复查清单逐项过一遍:
- SGMII差分对阻抗是否控制在100欧姆左右,板厂阻抗报告是否提供
- AC耦合电容是否放在发送端附近,取值是否0.1uF,封装是否0402
- SGMII对内等长是否小于5mil,对间等长是否小于50mil
- 参考时钟是否由PHY输出给FPGA,时钟走线是否远离干扰源
- PHY strap脚是否按需要配置成SGMII模式
- MDIO上拉电阻、PHY地址是否设置正确
- 网络变压器选型是否1:1,隔离耐压是否满足要求
- RJ45连接器是否集成变压器,屏蔽壳接地方案是否明确
- 共模电感阻抗是否在合理范围,是否与PHY手册推荐一致
这张清单帮我挡下了不少后期调试事故。
5. 调试、实测与排查实录
5.1 用回环测试快速定位问题
SGMII链路出问题时,第一件事不是拿示波器到处量,而是做回环测试,把问题范围一点点缩小。
先在FPGA侧做内部回环。Xilinx SGMII IP核里通常有PCS loopback选项,开启后数据从FPGA发送PCS直接回到接收PCS,不经过外部引脚。这个测试能验证FPGA内部的PCS和SerDes工作是否正常。配置好回环后,在FPGA内部发包、收包,看统计计数器,全绿说明FPGA侧没问题。
然后在PHY侧做回环。88E1512这类PHY的寄存器里通常有digital loopback或者SGMII loopback控制位。开启后,PHY会把从FPGA收到的数据直接返回给FPGA,数据不经过模拟前端,也不经过网线。这个测试能验证PHY的SGMII接口和MAC侧链路是否正常。
如果FPGA回环正常、PHY回环也正常,问题基本锁定在PHY的模拟侧和外部网口电路。再用一根已知好的网线直连交换机,逐个环节排查。这种分层排查的思路,比拿示波器瞎点几千个点高效得多。
5.2 用示波器实测SGMII眼图
回环测试能定位功能性问题,但信号质量类问题必须用示波器看眼图。SGMII的速率是1.25Gbps,带宽需求不算特别夸张,但为了看准眼图,示波器带宽至少2GHz以上,探头最好是差分探头。我在项目中用4GHz带宽的示波器测SGMII眼图,效果完全够用。
测点位置选在接收端附近,也就是PHY芯片的SGMII输入引脚处(对应FPGA输出直接到PHY的方向)。正常的SGMII眼图应该是开口清晰、交叉点居中、抖动较小的一个“眼睛”。如果眼睛明显闭合,优先检查AC耦合电容是否放错位置、阻抗是否匹配、回流路径是否被破坏。
眼图上还能看到信号幅度。SGMII差分信号幅度一般在几百毫伏级别,不同PHY略有差异。如果你测到幅度异常低,检查一下是不是端接电阻的问题。有些PHY芯片的SGMII接收端在内部已经集成了端接,外部不需要再加,如果你额外加了一个100欧姆差分电阻就会造成信号衰减。这一点一定要以PHY手册为准。
5.3 常见问题速查表
| 问题现象 | 可能原因 | 定位方法 |
|---|---|---|
| MDIO读不到PHY ID | PHY电源没起来、复位没释放、MDIO上拉缺失 | 量PHY电源、复位、MDIO电平 |
| SGMII Link一直建立不起来 | PHY strap配置错误、SGMII自动协商未开启 | 检查strap状态、FPGA IP核配置 |
| Link灯亮但数据不通 | 参考时钟不同源、MAC和PHY速率协商不一致 | 检查参考时钟来源、SGMII AN状态寄存器 |
| 1000M不通但100M正常 | AC耦合电容位置不对、共模电感阻抗过大 | 检查信号链路上元件,看眼图 |
| 偶发丢包、长时间运行断链 | 回流路径被破坏、电源纹波过大 | 检查PCB平面完整性、量电源纹波 |
| 网线长短不同表现差异大 | 变压器选型或共模电感参数不合适 | 对比PHY手册参考设计 |
这张表未必覆盖所有场景,但大部分SGMII链路问题都可以从这张表入手快速定位。
5.4 几个值得记下的设计经验
最后说几个我在多个项目里反复踩过的坑。
第一,AC耦合电容一定要放在发送端一侧。这句说三遍都不嫌多,因为原理图上一个电容的位置,到PCB上可能就决定了整个链路的信号完整性。曾经有块板卡的SGMII信号质量怎么测都不达标,最后发现AC电容被放在了接近PHY的一端,FPGA发送端的阻抗突变没有被控制好,挪到FPGA引脚附近后眼图立刻改善。
第二,不要在SGMII差分对上串测试点或排针。有的工程师为了调试方便,在差分对上预留了0欧电阻测试点,结果这个焊盘带来的寄生电容和阻抗不连续,直接导致链路余量不足。如果非要预留调试手段,宁可引一小段短Stub用焊盘测试,也比串联在通路中间要强。
第三,PHY输出的125MHz参考时钟不要在PCB上拉到很远的地方。这个时钟虽然是参考时钟,但它的质量直接决定SGMII收发数据是否稳定。如果FPGA离PHY较远,时钟线在BGA区域穿来穿去,等于给噪声制造了一个耦合天线。
第四,网络变压器的中心抽头处理方式必须严格参考PHY手册。有的PHY要求中心抽头接电源,有的要求接电容到地,有的要求直接接地,处理错一个,信号要么完全不通,要么勉强Link但误码率极高。我见过一个项目就是因为变压器中心抽头少接了一个电容,1000M一直不通,补上之后立竿见影。
结尾
做这类高速接口,最大的体会是它从来不是单一学科的战场。SGMII链路从FPGA的IP核配置、PHY的寄存器操作,到PCB的信号完整性,每个环节都是短板效应里的那一块板。一个项目做完,最值得的投资就是把这条链路从头到尾自己完整调一遍,不要只看FPGA侧,也不要只盯着PHY寄存器。
个人经验是,SGMII的调试有条特别管用的顺序:先分层回环排除功能问题,再量时钟、看眼图排除信号质量问题,最后才是对着寄存器表格细查配置。这个顺序能把你从“到处乱试”的状态里拽出来,省下不少熬夜时间。
最后再分享一个小技巧:新板卡回来以后,别急着把PHY的自动协商打开,先在固定千兆全双工的模式下把回环和数据收发调通,再切换到自适应模式。固定模式下链路特征简单,问题容易暴露和定位,等确认整条链路稳定了,再打开自动协商适配各种对端设备。这个方法帮我顺利搞定过好几块FPGA网口板卡,希望对你有用。