Buck Blog · 博客正文

返回技术分享首页
QSGMII 原理与 FPGA 实现详解 —— 4 路 SGMII 复用一对 5G SerDes

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,依次类推,不需要任何数据缓冲。
通道对齐的具体过程(以 10bit@500MHz 路径为例):

① 逗号搜索:在 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 都成立,带宽上必然放得下,而且低速口越多剩余越多。

(b)帧结构:超帧 + 时隙映射

沿用 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 数据如何进 TDM

SMII 口本身是 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 口为例,SMII 口把 AN 换成状态位采样即可):
  • 聚合层同步成功 → 进入通道对齐/超帧同步。
  • 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,欢迎把器件型号和数据路径宽度发来一起讨论。