QSGMII 原理与 FPGA 实现详解 —— 4 路 SGMII 复用一对 5G SerDes
1. 概述
QSGMII(Quad Serial Gigabit Media Independent Interface,四路串行吉比特介质无关接口)是一种把 4 路 SGMII 信号时分复用进 一对 5Gbaud SerDes(1 对 TX + 1 对 RX 差分,即一根全双工通道)的接口标准。
在 FPGA 里,SGMII 每路要占一对 1.25Gbaud 的收发器通道(GT)。4 个千兆网口就需要 4 对 GT;而用 QSGMII 只要 1 对 GT,物理引脚从 8 根减到 2 根,PCB 布线、FPGA 封装成本、收发器资源占用都大幅下降。这正是工业交换机、4 口网卡、智能网卡里"FPGA + 4 口 PHY 芯片"方案的常见接法。
┌────────────────────────────────────────┐
4×GMII ──► FPGA │ MAC0 ──┐ │
│ MAC1 ──┤ QSGMII 复用逻辑 ──► GT ──┐ │
│ MAC2 ──┤ (字节选择器+8B/10B) │ │
│ MAC3 ──┘ ▼ │
│ ┌─────────┐ │ QSGMII
│ │ 1对 GT │──┼──► 4口PHY芯片
│ │ 5 Gbaud │◄─┼── (88E1543等)
│ └─────────┘ │
└────────────────────────────────────────┘
2. 基本原理:字节级时分复用(TDM)
核心一句话:4 路 SGMII 每路线速率 1.25Gbaud,串进一根 5Gbaud 的线,4 个通道按字节轮流占用时间片,4 × 1.25 = 5,线速率正好是单路的 4 倍。
2.1 发射路径:字节选择器(Byte Selector)
SGMII ch0 ── 8bit @125MHz ─┐
SGMII ch1 ── 8bit @125MHz ─┤
SGMII ch2 ── 8bit @125MHz ─┼─► [字节选择器] ─ 8bit @500MHz ─► [8B/10B编码] ─ 10bit@500MHz ─► [8:1 串化] ─► 5Gbps TX
SGMII ch3 ── 8bit @125MHz ─┘ ↑ 按 ch0→ch1→ch2→ch3 固定轮转
- 每个 SGMII 通道在 125 MHz 下输出 8bit 并行 TX 数据(1G 模式)。
- 字节选择器以
4×125 = 500 MHz的速率,按ch0→ch1→ch2→ch3的顺序固定轮转,每次挑出一个字节,合成一路 500 MHz 的 8bit 流。 - 8B/10B 编码跑在 500 MHz(每拍输出 10bit),再经 8:1 串化,得到
500MHz × 10bit = 5Gbaud。
轮转的时序长这样(每 4 拍完成一轮,选中的通道按 00→01→10→11 循环):
2.2 接收路径:字选择器(Word Selector)+ 两级对齐
5Gbps RX ─► [1:10 解串] ─ 10bit@500MHz ─► [① 字对齐(逗号)] ─► [② 通道对齐(同步码型)] ─► [字选择器] ─┬─► ch0 10bit@125MHz ► 8B/10B 解码 → SGMII
├─► ch1
├─► ch2
└─► ch3
接收端难点在对齐,分两级:
- 字对齐(Word Alignment):在 500 MHz 的 10bit 流里,先靠 8B/10B 的逗号
/K28.5/找到码组的正确边界。 - 通道对齐(Channel Alignment):这是 QSGMII 特有的。发射端在初始化和重同步时发送规范定义的固定同步码型,接收端在码组流里滑动搜索、命中后锁定"哪个时隙是 ch0"。因为轮转是确定性的,锁定时隙后第 0 个码组给 ch0、第 1 个给 ch1,依次类推,不需要任何数据缓冲。
① 逗号搜索:在 500MHz 流里滑窗找 /K28.5/,命中后锁定 10bit 码组边界(字对齐)
② 同步码型搜索:把码组流按 4 个一组切分,在每组的固定偏移上找规范同步码型
③ 相位锁定:找到码型后记录"该偏移=ch0",锁定轮转相位,开始把码组分发到各通道
④ 错误监测:持续校验每个时隙是否仍是合法码组;连续出错→回到①重同步
同步码型为什么能唯一标识 ch0? 因为四个通道发出的空闲/配置序列是按通道错开的——某个码组(如 /C/ 或 /I/)只在特定通道的时隙里出现,整体形成一个 4 拍一个循环、且平移一拍就不一样的特征串。接收端滑窗匹配这个特征串,就等价于"找到了相位"。这也是为什么 QSGMII 要求收发两端必须用规范规定的同步码型发送时序,任意一端乱发,对端就锁不上。
2.3 时钟换算关系
| 项目 | 1G 模式 | 说明 |
|---|---|---|
| 单路 SGMII 线速率 | 1.25 Gbaud | 8B/10B,1G 数据 + 250M 开销 |
| QSGMII 线速率 | 5.0 Gbaud | = 4 × 1.25 |
| 字节时钟(每通道) | 125 MHz | 500 MHz 直接 /4 |
| 8bit 并行时钟 | 500 MHz | 字节选择器速率 |
| 10bit 并行时钟 | 500 MHz | 8B/10B 后、串化前 |
3. 关键技术要点
- 共享 8B/10B 与运行不一致性(RD):8B/10B 里每个 8bit 字节都有两个候选码字(RD=- 用一套、RD=+ 用另一套),编码器根据当前 RD 选其一,保证码流直流平衡。QSGMII 在复用之后只用一个 8B/10B 编码器,4 个通道共用一条 RD 链——即某一通道的字节编码会受到上一个(可能属于另一通道的)字节 RD 的影响。这在语义上等价于"把 4 路字节流拼成一个大字节流再编码",对端解码端只需维护正确的 RD 即可,不影响正确性;但注意不要按"4 路各自编码后再复用"来做,那会在 10bit 域做选择,凭空多一套编码器和时钟域处理。
- 10/100M 慢速通道:线速恒为 5 Gbaud,不会降低。某个通道跑 100M/10M 时,它只在部分时间片给出有效字节,其余时隙用空闲码组
/I1/、/I2/填充,字节选择器照样轮转。4 个通道可以同时处于不同速率,每路的自动协商(Auto-Negotiation)、链路状态都是独立的;共享的只有 PMA(串化/解串)和这层 TDM。 - 无缓存/乒乓:TDM 是固定 4 时隙轮转、无填充位,接收端只靠"时隙相位锁定"就能正确分发,不需要 FIFO 做速率匹配,这是它比包级复用简单得多的原因。
4. 复用场景与时隙设计
前面讲的是"4 路全是 SGMII"的标准场景。实际工程里还有一种常见诉求:FPGA 只有一对 SerDes,但端口不全是 1G——既有 1G 的 SGMII 口,又有 100M/10M 的 SMII 口,要把它们一起打包进同一根 5G 链路。这一节把两种场景的复用方式分开讲清楚。
4.1 场景一:4×SGMII —— 标准 QSGMII
标准 QSGMII 就是第 2、3 节讲的纯字节级 TDM,4 个通道各占 1/4 带宽。用"时隙"语言看:定义超帧 = 40 个字节时隙 = 10 轮四通道轮转(80ns),那么每个 SGMII 通道在超帧内拿到 10 个字节位(每轮 1 个),也就是 10/10 满速使用——1 个字节/8ns = 1Gbps。
超帧 80ns = 40 字节时隙 @500MHz
┌────────────────────────────────────────────────────────────┐
│ 轮1: ch0 ch1 ch2 ch3 │ 轮2: ch0 ch1 ch2 ch3 │ ... │ 轮10 │
│ └→ 每个 ch 每轮 1 字节,10 轮共 10 字节 = 1Gbps 满速 │
└────────────────────────────────────────────────────────────┘
此时"超帧"没有实际意义(各通道永远占满自己的 10 个字节位),它就是为场景二的混合复用准备的一个概念。
4.2 场景二:n×SMII + (4−n)×SGMII —— 混合复用
场景:3 个 1G 口走 SGMII、1 个 100M 口走 SMII,或者 2 个 1G + 2 个 100M……总之 4 个逻辑口里有 n 个是低速 SMII,(4−n) 个是 1G SGMII,要共用一对 5G SerDes。
(a)带宽核算:一定放得下| 端口类型 | 有效载荷 | 折算成 QSGMII 时隙 |
|---|---|---|
| 1G SGMII | 1 Gbps | 1 个整时隙(10/10) |
| 100M SMII | 100 Mbps | 1/10 时隙(1 字节/80ns) |
| 10M SMII | 10 Mbps | 1/100 时隙 |
n 个 SMII + (4−n) 个 SGMII 共需 (4−n) + n/10 ≤ 4 个时隙,对任意 n 都成立,带宽上必然放得下,而且低速口越多剩余越多。
沿用 40 字节超帧(80ns),做一个固定时隙映射表:
超帧 = 40 字节时隙 @500MHz(80ns)
┌──────────────────────────────────────────────────────────────┐
│ (4−n) 个 SGMII 通道 → 每轮 1 字节,超帧内 10 字节(满速) │
│ 1 个 SMII 聚合通道 → 10 个字节位里 n 个分给 n 个 SMII 口, │
│ 其余 (10−n) 个字节位发空闲码组 │
│ 剩余通道(若有) → 全部空闲码组(/I1//I2/) │
└──────────────────────────────────────────────────────────────┘
以 n=2(2 个 SMII + 2 个 SGMII)为例:
超帧内 40 个字节位 @500MHz,每 4 位一组轮转:
ch0:SGMII 口 A ── 10 字节位全用(1Gbps)
ch1:SGMII 口 B ── 10 字节位全用(1Gbps)
ch2:SMII 聚合通道 ── 第 0 位→SMII 口 C,第 5 位→SMII 口 D,
其余 8 位→/I/ 空闲(各口 100Mbps)
ch3:无 → 全 /I/ 空闲
为什么超帧取 40 字节(80ns)?因为 SMII 的字节奏正好也是 80ns:SMII 每 10 个 125MHz 时钟出一个 10bit 字,其中 8bit 是数据,净荷 100Mbps = 1 字节/80ns。所以把超帧定为 80ns,一个 100M SMII 口每超帧恰好占 1 个字节位,映射非常干净;相位对齐后甚至不需要深缓存。
(c)SMII 数据如何进 TDMSMII 口本身是 2 根数据线(TXD/RXD)+ 共享 125MHz REFCLK + SYNC(每 10 个时钟一个脉冲)。聚合侧逻辑:解析出 SMII 10bit 字里的数据字节(TX 字结构:TX_ER、TX_EN、TXD[0:7]),再按 8bit 送进共享 8B/10B 编码器,在分配给它的超帧字节位发出。SMII 侧与 SerDes TX 侧是两个时钟域,每路 SMII 前放一个几字节的弹性缓冲吸收两域相位差即可(速率本身匹配,缓冲只做跨域,不做速率匹配)。
(d)接收端如何还原 SMII 口接收端依次完成:①逗号字对齐 → ②通道对齐(锁定哪个通道是 SMII 聚合通道)→ ③超帧同步(靠超帧里固定位置放的专用同步码型/有序集,锁定第 0 个字节位)→ ④按时隙映射表把对应字节位送给对应 SMII 口。每路 SMII 输出重建 125MHz 时钟和 SYNC 节拍,把 8bit 字节重新打包成 SMII 10bit 帧格式,同样配一个小弹性缓冲。超帧同步 + 时隙映射表是这套自定义方案与标准 QSGMII 的唯一差别——标准方案没有子通道概念,这一步可以省掉。
(e)与标准的关系(重要)- QSGMII 标准(Cisco 规范)只定义 4×SGMII,没有 n 个 SMII + m 个 SGMII 的混合模式。上面这套属于收发两端约定好的自定义帧结构,需要自己实现超帧同步和时隙映射表,且只能用于自己的背板/私有链路,接不了市售的 4 口 PHY 芯片(它们的 QSGMII 口是固定的 4×SGMII)。
- 工业界把"一条链路上承载多个不同速率的端口"做成标准的是 USGMII/USXGMII:USGMII 把 8 个 10/100/1000M 口复用进一条 10G SerDes;USXGMII 在其上支持 2.5G/5G/10G 混合速率,并显式定义了 packet control header 在 MAC 与 PHY 之间传递每口控制/状态信息。如果不想全自定义,参考它的控制头格式做裁剪是稳妥的路子。
5. 自协商与链路状态交互
光有 5G 物理层对齐还不够——"这口 up 了没有、跑 1000M 还是 100M、全双工还是半双工",这些信息必须能在 MAC 与 PHY(或对端)之间交互。不同接口方式交互机制完全不同,而且在混合复用的场景里还要分清"聚合链路状态"和"每口状态"两个层次。先立总纲,再分接口展开。
5.1 链路建立分三阶段:协商 → 同步 → 数据
上电/复位
│
▼
① 协商阶段(线路上没有帧)
发送 /C/ 配置有序集 / 链路脉冲 / 训练码
交换 16bit 配置字:速度、双工、ACK、远端故障(RF)
│ 协商一致
▼
② 同步阶段(仍没有帧)
改发 /I/ 空闲有序集,接收端完成字对齐、清状态
│ link up
▼
③ 数据模式(这时才出现帧)
[前导][SFD][帧体][IFG空闲码组][前导][SFD][帧体]…
帧里没有任何"链路状态"字段;链路 up 靠持续空闲码组维持
记住这张图就够:协商阶段和同步阶段,线上一帧都没有。 链路状态信息不是在"插入帧",而是在数据模式之前的物理层交换,以及数据模式时帧之间的填充物里承载。
5.2 关键澄清:AN 状态信息不进以太网帧
以太网帧(前导码 + SFD + 目的/源 MAC + 类型 + 载荷 + FCS)只有在链路 up、进入数据模式之后才会出现在线上。AN 的结果(link/速率/双工)不会作为字段塞进后续帧里,而是决定:帧能不能发、按什么速率/双工模式发。状态本身通过下面三种物理层机制在线传递:
| 机制 | 用在 | 状态载体 | 是否进帧 |
|---|---|---|---|
| 有序集 / 码组 | SGMII、1000BASE-X | /C/ 配置、/I/ 空闲有序集 | 否,纯 PCS 层 |
| 链路脉冲 | 10M/100M 铜缆(Clause 28) | NLP / FLP 脉冲串 | 否,模拟电信号 |
| 帧间隔带内状态位 | SMII | RX_DV=0 时的 RXD[7:0] | 否,在两帧之间的空档 |
后面 5.4~5.6 逐个展开。
5.3 物理层同步:一切的前提
整条 QSGMII 链路建立的第一阶段是纯物理的:
- 5G CDR 锁定:接收端从 5G 数据流里恢复时钟。
- 字对齐:靠逗号
/K28.5/找到 10bit 码组边界。 - 通道对齐:靠 QSGMII 同步码型锁定 ch0 时隙(自定义混合方案再加一步超帧同步)。
注意:这层只保证"字节能正确分发到各通道",不等于以太网链路 up。三层任何一层没对齐,整条聚合链路不可用,4 个通道全部 link down。这就是"聚合物理层 → 每通道逻辑层"的分层结构:聚合层状态是每口状态的前提。
5.4 SGMII 通道:类 Clause 37 自动协商
协商信息通过 4 码组的有序集在串行链路上连续发送:
/C1/ = /K28.5/ + D21.5 + 配置字(16bit)
/C2/ = /K28.5/ + D2.5 + 配置字(16bit)
/I1/ = /K28.5/D5.6/ (空闲)
/I2/ = /K28.5/D16.2/ (空闲)
/K28.5/是逗号,同时承担字对齐。- 链路上交换的是 16bit 配置字(SGMII 规范格式,按位发送):
| 位 | 字段 | 含义 |
|---|---|---|
| 15 | ACK | 1 = 本端已连续 3 次收到对端相同的能力字 |
| 14 | 保留 | 0 |
| 13 | RF | 1 = 远端故障 |
| 12 ~ 6 | 保留 | 0 |
| 5 | 双工 | 0 = 半双工、1 = 全双工 |
| 4 ~ 0 | 速度 | 00001=10M、00010=100M、00100=1000M,其余保留 |
- 双方持续发
/C/,直到收到对端 ACK 且配置一致,才切到/I/空闲、进入同步阶段(配合 SGMII 的 link_timer 定时:1.6ms;1000BASE-X 的是 10ms)。这一段全程没有以太网帧——协商码字是 PCS 层的,帧是 MAC 层的,两者完全分开。 - 链路上所谓"状态",本质是一串特定的码组:在发
/C/= 还在协商;改发/I/= 协商完成。这个转变就是最朴素的状态信号。时序示意:
- 注意"链路码字"与"软件寄存器视图"是两码事:同一份链路信息,各厂商/IP 映射到内部寄存器时位数和位置可以完全不同。例如 Intel TSE 的
partner_ability寄存器就把速度压成 2bit、单列一个 link 位:
| 位 | 字段 | 含义(Intel TSE 为例) |
|---|---|---|
| 11:10 | 速率 | 00=10M、01=100M、10=1G |
| 12 | 双工 | 1=全双工 |
| 14 | ACK | 1=已确认 |
| 15 | 铜缆链路状态 | 1=link up |
所以写驱动/调 PHY 时,以具体 PHY/IP 的 datasheet 寄存器定义为准,别拿链路码字格式直接对寄存器。
- 在 QSGMII 里,4 个通道的 AN 完全独立:通道 A 1000M 满速、通道 B 100M、通道 C 10M、通道 D 断开,可以同时存在。某个通道速率变化时,只影响它自己的时隙使用率,其余通道不受影响。
- 实现时注意:QSGMII 官方 IP 已经把这套每通道 AN 逻辑内置了;自己写 GT 方案时,每通道的 AN 状态机、定时器和码字寄存器都要按通道分开,千万别做成全局共享一份。
5.5 延伸:1000BASE-T(Clause 40)铜缆千兆的协商与训练
SGMII/1000BASE-X 协商完直接就能发数据,但 1000BASE-T 在 AN 之后还有一个训练阶段——因为它是 4 对双绞线同时收发的 4D-PAM5(5 电平),必须先把时钟、均衡和回波抵消系数调好。三种千兆协商机制对比:
| 项 | 1000BASE-X(Clause 36/37) | SGMII | 1000BASE-T(Clause 40) |
|---|---|---|---|
| 介质 | 光纤 / SerDes | MAC↔PHY 串行接口 | 4 对双绞铜缆 |
| 线路编码 | 8B/10B | 8B/10B | 4D-PAM5(5 电平) |
| AN 机制 | Clause 37 | 借用 Clause 37 码字,MAC 主导 | Clause 28(FLP)+ 能力后续页 |
| 主从时钟 | 无 | 无 | 必须:Master 用本地时钟,Slave 从信号恢复时钟 |
| 协商完成后 | 直接 /I/ 同步 | 直接 /I/ 同步 | 还有 PMA 训练阶段 |
| link up 判定 | 收到合法 idle 且无 RF | AN 完成 + PHY link | 本端/远端接收机状态均 OK |
| link_timer | 10ms | 1.6ms | — |
1000BASE-T 的完整建链流程:
① 自动协商(Clause 28)
在前两对线(A/B)上用 FLP 交换能力,同时解出 Master/Slave 角色
(Master 决定用谁家的本地时钟驱动发射,Slave 必须跟着恢复时钟)
│
▼
② PMA 训练(SEND_T 训练码)
双方在 4 对线上发 4D-PAM5 训练序列,接收机同步完成:
定时恢复 → 自适应均衡 → 回波抵消(收发同对同时进行)
→ 极性纠正 → 线对交换识别 → 线对去偏斜 → 解扰同步(scr_status=OK)
│
▼
③ 数据模式(SEND_N)
loc_rcvr_status 与 rem_rcvr_status 都 OK → link up
之后靠空闲符号持续维持
要点:"协商状态"在 1000BASE-T 里同样不进帧——它体现在 AN 脉冲、训练码和接收机状态变量里;真正的以太网帧要等第③步才出现。
5.6 SMII 通道:没有 AN,靠带内状态位
- SMII 串行线上没有自动协商机制,速率由配置决定(MDIO 或 strap),PHY 侧真正在铜缆上做的协商(如与对端交换机协商 100M 全双工)发生在 PHY 内部,结果通过状态位上报给 MAC。
- 每个 10bit 接收字 = CRS、RX_DV + 8bit 数据/状态。RX_DV=1 时 8bit 是数据;RX_DV=0(帧间隔)时 8bit 是 PHY 状态——含速率(0=10M、1=100M)、双工(0=半、1=全)、link up/down、RX_ER、Jabber、False Carrier 等。帧结构:
- 所以 SMII 的"链路状态交互"本质是:PHY 在每个帧间隔持续上报状态字,MAC 采样这些位即可知道每口的 link 和速率,没有独立的握手过程。状态字塞在两帧之间的空档,仍然不在帧内。
5.7 混合场景下的状态交互(关键)
把 SMII 和 SGMII 打进同一对 SerDes 后,要同时维护两个层次的状态:
| 层次 | 对象 | 状态来源 |
|---|---|---|
| 聚合物理层 | 整条 5G 链路 | CDR 锁定 + 字/通道对齐成功 |
| 每通道 | SGMII 口 | 该通道自身的 SGMII AN 完成 |
| 每通道 | SMII 口 | SMII 带内状态位(速率/link/双工) |
处理要点:
- SGMII 通道:AN 在各自时隙里正常跑,TDM 层完全透明,无需额外处理。聚合层 down 时该口自然 link down;聚合层 up 后由 AN 重新建立。
- SMII 通道:对端把 SMII 帧重新打包还原后,状态位自然随帧带过来。但有一个关键缺口——聚合链路本身的 up/down,SMII 帧里没有对应字段,需要自己补。两种做法:
- 沿用 SMII 状态位:SMII 口的时隙正常收发 SMII 帧,状态位由对端 MAC 从帧里解出。实现简单,但"链路 up"要等首帧解析出来才能确认,链路建立和故障检测都比较钝。
- 加控制/状态字(推荐):在超帧里预留固定字节位,主动传"每口控制/状态字"——每口 link、速率、双工、远端故障,以及聚合链路状态。不依赖业务数据,状态交互快、可靠,还能顺带承载 PTP 时间戳这类带外信息。USGMII 的 packet control header 就是这个思路的标准化形态,自设计混合方案时强烈建议加这一格。注意它也是与以太网帧并行的另一条虚拟通道(占时隙空位),不是塞进帧里。
- 聚合层同步成功 → 进入通道对齐/超帧同步。
- SGMII 通道发
/C/配置有序集开始 AN,收到对端 ACK 后 AN 完成。 - 每口链路 up,业务帧开始收发;期间某口速率变化 → 该通道重新走 AN,其余口不受影响。
- 聚合层掉链(对端拔线/SerDes 失锁)→ 所有口立即 link down;恢复后按 1→2 重新建立。
5.8 链路 up 之后:状态怎么"在线"维持
进入数据模式后,帧里没有状态字段,链路健康全靠物理层持续信号维护:
- 空闲码组连续性:每帧之间(IFG)填
/I1//I2/空闲码组。接收端持续收到合法空闲 + 数据 → 判 link up;长时间收到远端故障(RF)或丢同步 → 判 link down。 - CDR 失锁 / 信号丢失:SerDes 恢复不出时钟 → 立即 link down。这是最快、最可靠的掉链指示。
- 帧边界识别:接收端靠 idle 码组和 SFD 区分"新一帧的开头"还是"还在上一帧"。
一句话:状态不是被写进帧,而是帧之间的填充物(idle)在"说话"。
5.9 确实以"帧/报文"形式出现的状态:是管理协议,不是 AN
如果你想要"链路状态信息真的装进一个报文",标准里有,但那是链路建立之后跑在链路之上的管理协议,来源是软件/管理面,和 AN 状态机是两回事:
| 协议 | 目的 MAC | EtherType | 作用 |
|---|---|---|---|
| LACP(802.3ad/802.1AX) | 01:80:C2:00:00:02 | 0x8809 | 聚合组成员之间交互端口状态,决定哪些口能聚合 |
| LLDP | 01:80:C2:00:00:0E | 0x88CC | 邻居发现、通告能力/状态 |
| 802.3ah OAM | 01:80:C2:00:00:02 | 0x8809 | 链路监测、远端故障通告 |
| PAUSE 流控 | 01:80:C2:00:00:01 | 0x8808 | 反向压帧,链路层控制帧 |
这些确实是帧(有完整 MAC 头 + EtherType),但它们说的"状态"是聚合组里的端口状态、对端能力、链路质量监测——不是 AN 协商结果直接塞进去的。
5.10 小结
| 接口 | 是否自动协商 | 速率/双工/link 如何交互 | 状态是否进帧 |
|---|---|---|---|
| SGMII | 是(类 Clause 37) | 链路内 /C/ 有序集 + 16bit 配置字 | 否(纯 PCS 层) |
| SMII | 否 | 帧间隔 RX 带内状态位 | 否(帧间空档) |
| 1000BASE-T | 是(Clause 28)+ PMA 训练 | FLP 能力页 + 训练码 + 接收机状态 | 否(AN/训练阶段无帧) |
| 10/100M 铜缆 | 是(Clause 28) | NLP / FLP 链路脉冲 | 否(模拟电信号) |
| 聚合层 | — | CDR / 字对齐 / 通道对齐 | 先于一切,是每口状态的前提 |
6. FPGA 实现(Xilinx)
Xilinx 上两条路:用官方 IP,或用 GT + 自定义逻辑。
6.1 方式一:SGMII/QSGMII LogiCORE IP(PG047)
官方 IP,最省事:
- Vivado IP Catalog 里搜 "SGMII or QSGMII",协议类型选 QSGMII,指定收发器类型(GTX/GTH/GTY)。
- IP 自动生成 GT 及其配置:线速率 5.0 Gbps,参考时钟 125 MHz,8B/10B 由 GT PCS 承担。
- 核心内建了字节选择器、字选择器、两级对齐、每通道自动协商逻辑,用户侧只暴露 4 路标准 SGMII 接口(每路独立 GMII 数据 + 时钟 + 链路状态)。
- 用 IP 自带的 Example Design 仿真并约束即可。
优点:对齐逻辑、复位/初始化序列、AN 都替你实现好,避免踩坑。缺点:内核占用一定 LUT,且只能按 IP 固定的数据路径跑。
6.2 方式二:GT + 自定义复用逻辑
想省资源、完全可控时手写:
- 用 GT Wizard 生成 GT:线速率 5.0 Gbps,使能 PCS 8B/10B。
- 数据路径宽度的选择是个关键权衡:
- 10bit @ 500 MHz:与框图一致,但要求 fabric 能跑到 500 MHz(GTY/UltraScale+ 通常可以)。
- 20bit @ 250 MHz:老器件更稳,每拍携带 2 个码组(正好 2 个通道),字节/字选择器降到 250 MHz 域,一次处理一对通道。选型受限时优先用这种。
- Fabric 里自己实现:TX 侧字节选择器(4×125MHz→500MHz,或 20bit 路径下 2×125MHz→250MHz);RX 侧逗号检测 + QSGMII 同步码型通道对齐 + 字选择器。
- 时钟:GT 的
TXOUTCLK/RXOUTCLK为 500 MHz(或 250 MHz),再分频出每通道 125 MHz 的字节时钟。 - 若要做第 4、5 节的混合 SMII 方案:就是在"方式二"的基础上,把第 4 节的时隙映射表、超帧同步和第 5.7 节的控制/状态字通道自己写进 fabric——这也正是官方 IP 不提供、只能自实现的部分。
7. FPGA 实现(Intel / Altera)
Intel 流程与 Xilinx 类似,也是"官方 PCS IP + 收发器 PHY IP"。
7.1 官方 IP 路线:TSE + 收发器 PHY
- 生成收发器 PHY IP:
- Arria 10 / Stratix 10 / Agilex 用 Transceiver Native PHY;
- Cyclone V / Arria V 用 ALTGX(PHY IP)。
- 统一配置:PMA 线速率 5.0 Gbps、PCS 选 8B/10B、参考时钟按器件要求(常为 125 MHz)。
- 生成 Triple-Speed Ethernet Intel FPGA IP(TSE),在配置里把 PCS 选为 QSGMII 模式。
- 把 TSE 的 PCS 接口与 Native PHY 的收发器接口对接。TSE 负责字节/字选择、对齐和每通道 AN,对 MAC 侧同样暴露 4 路独立 GMII。
- 若器件老、没有现成 QSGMII PCS,也可像 Xilinx 方式二那样:ALTGX 只做 5G + 8B/10B 的 PMA,TDM 和对齐在 fabric 里手写。
8. 两种实现路线对比
| 对比项 | 官方 IP(Xilinx PG047 / Intel TSE) | GT/PHY + 自定义逻辑 |
|---|---|---|
| 工作量 | 低,配置即可 | 高,对齐/AN 都要自己写 |
| 资源占用 | 较多(LUT/FF) | 可控,能压到很小 |
| 数据路径宽度 | 按 IP 固定 | 10bit@500MHz 或 20bit@250MHz 自选 |
| 混合 SMII 方案 | 不支持 | 需要自己加超帧映射/控制字通道 |
| 风险点 | 版本/许可证、黑盒 | 对齐时序、初始化复位序列难调 |
| 适用 | 追求快、要跑通 | 资源紧张、要深度定制、老器件 |
9. 应用场景
- 多口千兆 PHY 汇聚(最常见):FPGA 只有 1 对 GT,也要接 4 个千兆网口。FPGA 通过 QSGMII 连一颗 4 口 PHY 芯片(如 Marvell 88E1543、Realtek RTL8214、Broadcom BCM5482 等),PHY 再输出 4 路 10/100/1000M 到 RJ45 或 SFP 光模块。省 3 对 GT,PCB 差分走线从 8 根降到 2 根,高密度板卡尤其受益。
- 背板/中板互联:两块单板之间高速串行通道有限,用 QSGMII 把 4 路以太网打成一路穿过背板,板内再解回 4 路独立链路。如果板上同时有 1G 口和 100M 口,就用第 4 节的混合复用方案打包。
- 工业交换机 / 串口服务器:4 口 10/100/1000M 交换、4 路以太网网关,FPGA 做交换/协议处理,对外统一走 QSGMII。
- DPU / 智能网卡:需要 4 个千兆口时,一片 4 口 PHY + QSGMII 是最省的接法,把宝贵的 GT 资源留给 PCIe、高速光口等更高价值通道。
- 成本与布板敏感的设备:少 3 对 GT 意味着更小的封装、更低的 PCB 叠层和更短的布线,消费级/准工业级 4 口设备常用。
10. 实际案例
案例一:4 口千兆工业交换机(FPGA + 88E1543)
- 场景:FPGA 实现 4 个以太网 MAC 和交换逻辑,对外 4 个 RJ45 千兆口。
- 接法:FPGA 的 1 对 GTY(5 Gbps,QSGMII)→ 88E1543 的 QSGMII 口 → 4 路铜缆。
- 实现:用 PG047 SGMII/QSGMII IP,通道速率选 1000M,每通道独立 AN。MAC 侧 4 路 GMII 全双工 1G,共享 GT 只有一对。
- 收益:GT 占用从 4 对降到 1 对,对中低端 FPGA(本身 GT 就少)是能不能做 4 口的分水岭。
案例二:FPGA 间背板 QSGMII 互联
- 场景:主控板与接口板通过背板相连,需要 4 条相互独立的以太网链路。
- 接法:两片 FPGA 各用 1 对 GT 跑 QSGMII,中间走背板走线。
- 实现:两端的 QSGMII 对齐后按固定轮转恢复 4 路 SGMII,每路再挂独立 MAC。链路故障互不影响,因为 TDM 层无状态依赖。
- 注意:此时收发两端都要实现通道对齐,任一端的同步码型发送时序必须规范,否则对端锁定不了 ch0。
案例三:DPU/智能网卡 4 口千兆
- 场景:DPU 板卡需要 4 个 1G 电口,同时还要 PCIe、多路光口。
- 接法:4 口 PHY(如 RTL8214)→ QSGMII → FPGA 仅 1 对 GT,把省下的 GT 留给 PCIe/光口。
- 实现:走官方 IP 快速跑通,GT 资源紧张时改 20bit@250MHz 自定义路线。
- 收益:GT 资源是最稀缺的,QSGMII 直接把"4 个千兆口"的成本降到"1 对 GT",性价比极高。
案例四:背板混合 1G + 100M 链路(自定义方案)
- 场景:接口板有 3 个 1G 口(SGMII PHY)+ 2 个 100M 口(SMII PHY),主控板只给了一对 5G 背板 SerDes。
- 接法:接口板 FPGA 把 3×SGMII + 2×SMII 按 n=2 的混合超帧打包,从一对 SerDes 过背板;主控板 FPGA 解出 5 路独立口。
- 实现:3 个 SGMII 通道各占 1 个时隙跑各自 AN;2 个 SMII 口共用 1 个"SMII 聚合通道",各占 1/10 时隙;超帧里预留控制字字节位,主动上报每口 link/速率,保证 SMII 口的链路状态不依赖业务帧。
- 收益:5 个端口只占一对 SerDes;SGMII 口与 SMII 口状态互不干扰,任何一口速率变化只影响自己。
11. 总结
- QSGMII = 4 路 SGMII 在字节级 TDM 进一对 5Gbaud SerDes,线速 5G、字节轮转 500 MHz、每通道 125 MHz。
- 发送靠字节选择器固定轮转,接收靠逗号字对齐 + 同步码型通道对齐两级锁定,无需数据缓存。
- 4 通道共享一条 8B/10B RD 链,速率可各不相同;只有 PMA 与 TDM 层共享,AN 与链路状态完全独立。
- 链路状态分两层:聚合物理层(CDR+对齐,是一切前提)和每口逻辑层——SGMII 靠链路内 AN(/C/ 有序集 + 16bit 配置字,link_timer 1.6ms),SMII 靠帧间隔带内状态位,1000BASE-T 靠 AN + PMA 训练,10/100M 铜缆靠链路脉冲;这些状态都不进以太网帧,帧里的"状态"只能是 LACP/OAM 这类管理协议。混合方案建议在超帧里补一个控制/状态字通道(USGMII 的 packet control header 思路)。
- FPGA 上:Xilinx 用 PG047 SGMII/QSGMII IP 或 GT + 自定义逻辑(10bit@500MHz / 20bit@250MHz 两种数据路径);Intel 用 TSE IP + Native PHY/ALTGX 组合;混合 SMII 方案只能自定义实现。
- 最大价值:1 对 GT 当 4 对用,在 4 口以太网设备、背板互联、DPU 等场景里显著省资源、省引脚、省布板。
如果你正在自己的项目里实现 QSGMII 或混合复用,需要核对 GT 参数(线速、8B/10B 开关、USRCLK 分频)或对齐/AN 逻辑的 Verilog,欢迎把器件型号和数据路径宽度发来一起讨论。