1. 引言:为什么 FPGA 工程师必须吃透以太网物理接口
在工业控制、机器视觉、测试测量、雷达信号处理、车载与航空航天等领域,FPGA 承担着"数据汇聚与实时处理"的核心角色,而千兆以太网(Gigabit Ethernet,1 Gbps)几乎是这些场景里最通用的数据出口。一个常见的工程现实是:FPGA 内部的 MAC 逻辑、DMA、协议栈往往写得很好,但一旦接到板子上的 PHY 芯片,问题就集中爆发------RGMII 时序余量不够、SGMII 自协商不成功、MDIO 读不到 PHY ID、1000BASE-X 与 1000BASE-T 混用导致链路起不来。
这些问题的根源,几乎都出在"物理接口"这一层。所谓物理接口,在 FPGA 与以太网之间,实际上包含三个层次的内容:
- MAC 与 PHY 之间的板级接口:MII、RMII、GMII、RGMII、SGMII、QSGMII、XGMII 等,这是 FPGA 引脚直接面对的电气与协议接口。
- PHY 与线缆之间的介质相关接口:1000BASE-T、1000BASE-X(含 1000BASE-SX/LX/CX)、1000BASE-KX 等,这是 PHY 芯片对外呈现的物理层规范。
- 管理接口 :MDIO/MDC(IEEE 802.3 Clause 22 与 Clause 45),用于配置和读取 PHY 寄存器。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
很多资料把这三层混为一谈,导致初学者看到"RGMII 接口"和"1000BASE-T 接口"时无法区分它们处在协议栈的不同位置。本文的目标是把这三层彻底拆开讲清楚:每一种接口的电气形式、信号定义、时序关系、在 FPGA 上的实现方法、Verilog 代码要点、以及在真实项目中的选型依据与应用场景。
本文所有内容均基于 IEEE 802.3 标准、主流 PHY 芯片厂商(Marvell、Microchip、TI、Realtek、Broadcom)公开数据手册、以及 Xilinx/Intel 官方文档中的明确描述,不涉及任何推测性内容。对于存在多种实现方式的地方,会明确说明"取决于具体器件"。
2. 以太网分层模型与"物理接口"的准确定位
2.1 OSI 模型与 IEEE 802.3 的对应关系
IEEE 802.3 标准把以太网划分为两层:数据链路层(Data Link Layer)和物理层(Physical Layer)。其中数据链路层又分为逻辑链路控制(LLC)和介质访问控制(MAC)两个子层;物理层则分为物理编码子层(PCS)、物理介质接入子层(PMA)、物理介质相关子层(PMD),以及可选的物理介质连接子层(PMD 之下的 MDI 接口)。
在 FPGA 设计中,我们通常实现的是 MAC 层(有时还包括部分 PCS 功能),而 PHY 芯片实现 PCS/PMA/PMD。两者之间的连接点,就是本文要重点讨论的"MAC-PHY 接口"。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
2.2 三个层次的接口不要混淆
为了后续叙述清晰,先给出一个对照表:
| 层次 | 接口名称 | 连接对象 | 典型信号 |
|---|---|---|---|
| MAC-PHY 板级接口 | MII / RMII / GMII / RGMII / SGMII / QSGMII / XGMII | FPGA ↔ PHY 芯片 | 数据、时钟、控制 |
| PHY-线缆介质接口 | 1000BASE-T / 1000BASE-X / 1000BASE-KX | PHY ↔ 双绞线/光纤/背板 | 差分模拟信号 |
| 管理接口 | MDIO / MDC | FPGA ↔ PHY 寄存器 | 双向数据 + 时钟 |
理解这张表,是理解全文的基础。下文将按这个顺序逐一展开。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
3. MAC-PHY 板级接口详解
3.1 MII:媒体独立接口(Media Independent Interface)
MII 是 IEEE 802.3 Clause 22 定义的百兆以太网 MAC-PHY 接口,虽然它本身不是千兆接口,但它是理解 GMII/RGMII 的基础,且在很多千兆 PHY 上仍然保留作为兼容模式。
信号定义(每个方向 4 位数据):
- TX_CLK:发送时钟,25 MHz(100 Mbps)或 2.5 MHz(10 Mbps),由 PHY 提供给 MAC。
- TXD3:0:发送数据,4 位。
- TX_EN:发送使能。
- TX_ER:发送错误(可选)。
- RX_CLK:接收时钟,由 PHY 从接收数据中恢复。
- RXD3:0:接收数据,4 位。
- RX_DV:接收数据有效。
- RX_ER:接收错误。
- COL:冲突检测(半双工)。
- CRS:载波侦听(半双工)。
时钟关系:MII 的 TX_CLK 和 RX_CLK 是独立的,分别由 PHY 提供。在 100 Mbps 下为 25 MHz,每个时钟周期传输 4 位,即 100 Mbps。这种"时钟与数据同源"的特性使得 MII 在 FPGA 侧实现相对简单,但引脚数量较多(约 16 根)。
FPGA 实现要点:MII 接口在 FPGA 中通常直接由 MAC 逻辑驱动,无需特殊 IO 原语。需要注意的是 TX_CLK 由 PHY 输出,FPGA 必须把它当作输入时钟使用,并在该时钟域内产生 TXD/TX_EN。跨时钟域处理(MAC 内部 125 MHz 或系统时钟 → 25 MHz TX_CLK)是常见的设计难点。
应用场景 :MII 主要用于 10/100 Mbps 场景。在千兆设计中,MII 只在 PHY 的兼容模式下出现,或者用于管理通道之外的辅助调试。现代千兆设计中已很少直接使用 MII。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
3.2 RMII:精简媒体独立接口(Reduced MII)
RMII 是 RMII Consortium 制定的 MII 精简版本,把数据位宽从 4 位降到 2 位,时钟提高到 50 MHz,从而把引脚数从约 16 根减少到约 7 根。
信号定义:
- REF_CLK:50 MHz 参考时钟,由外部晶振或 MAC 提供,收发共用。
- TXD1:0:发送数据,2 位。
- TX_EN:发送使能。
- RXD1:0:接收数据,2 位。
- CRS_DV:载波侦听/接收数据有效(复用)。
- RX_ER:接收错误(可选)。
关键特性:RMII 使用单一的 50 MHz 参考时钟,收发共用,这大大简化了时钟域处理。50 MHz × 2 位 = 100 Mbps,正好满足百兆速率。
FPGA 实现要点:REF_CLK 必须由外部提供(通常 50 MHz 晶振),FPGA 不能自己产生后送给 PHY 再收回,否则会引入额外的时钟偏斜。RMII 的时序要求相对宽松,但在 50 MHz 下仍需注意建立/保持时间。
应用场景:RMII 广泛用于引脚资源紧张的百兆设计,如小型工业网关、嵌入式控制器。在千兆场景中不适用(RMII 标准不支持千兆)。
3.3 GMII:千兆媒体独立接口(Gigabit MII)
GMII 是 IEEE 802.3 Clause 35 定义的千兆 MAC-PHY 接口,是 MII 的千兆扩展版本。
信号定义(每个方向 8 位数据):
- GTX_CLK:发送时钟,125 MHz,由 MAC(FPGA)提供。
- TXD7:0:发送数据,8 位。
- TX_EN:发送使能。
- TX_ER:发送错误。
- RX_CLK:接收时钟,125 MHz,由 PHY 从接收数据中恢复。
- RXD7:0:接收数据,8 位。
- RX_DV:接收数据有效。
- RX_ER:接收错误。
- COL、CRS:半双工相关。
时钟关系:这是 GMII 与 MII 最重要的区别之一。GMII 的发送时钟 GTX_CLK 由 MAC 侧(FPGA)产生并送给 PHY,而接收时钟 RX_CLK 由 PHY 恢复后送给 MAC。125 MHz × 8 位 = 1 Gbps。
FPGA 实现要点:
- GTX_CLK 必须由 FPGA 的时钟管理资源(MMCM/PLL)产生,并通过 ODDR 原语从普通 IO 输出,以保证时钟与数据的相位关系。Xilinx 7 系列及以后器件推荐使用
ODDR原语输出 GTX_CLK,而不是直接用 BUFG 驱动 IO。 - RX_CLK 是 PHY 恢复的时钟,进入 FPGA 后需要经过 BUFG/BUFR 处理,并在该时钟域内采样 RXD。
- GMII 的引脚数较多(约 24 根),在引脚紧张的设计中不划算。
应用场景:GMII 主要用于早期千兆设计和需要与标准 MII 兼容的场合。由于引脚多、时序要求高,现代设计中已大量被 RGMII 和 SGMII 取代。但在一些老平台或需要严格标准兼容的场合仍有使用。
3.4 RGMII:精简千兆媒体独立接口(Reduced GMII)
RGMII 是 HP/Compaq 等公司提出、后被广泛采用的 GMII 精简版本,是当前 FPGA 千兆以太网设计中使用最广泛的 MAC-PHY 接口。
信号定义:
- TXC:发送时钟,125 MHz,由 MAC 提供。
- TXD3:0:发送数据,4 位。
- TX_CTL:发送控制(TX_EN 与 TX_ER 的复用)。
- RXC:接收时钟,125 MHz,由 PHY 恢复。
- RXD3:0:接收数据,4 位。
- RX_CTL:接收控制(RX_DV 与 RX_ER 的复用)。
核心机制:DDR 双沿采样。RGMII 用 4 位数据在时钟的上升沿和下降沿各传输一次,即 125 MHz × 2 × 4 位 = 1 Gbps。这是 RGMII 能用 12 根引脚实现千兆的关键。
控制信号的复用:
- TX_CTL 在上升沿表示 TX_EN,下降沿表示 TX_EN XOR TX_ER。
- RX_CTL 在上升沿表示 RX_DV,下降沿表示 RX_DV XOR RX_ER。
这种复用方式在 IEEE 802.3 标准中并未正式定义(RGMII 是行业规范而非 IEEE 标准),但在实际芯片中高度一致。
时序模式:延迟与非延迟。RGMII 有两种时序模式:
- 非延迟模式(Non-delayed):时钟与数据边沿对齐,接收端需要在内部对时钟或数据做 90° 相位偏移后再采样。这种模式对 PCB 走线等长要求严格。
- 延迟模式(Delayed / Internal Delay):PHY 内部对 RXC 或 TXC 做约 2 ns 的延迟,使得时钟边沿落在数据眼图中心。这是目前最常用的模式,PHY 芯片通常通过寄存器配置或引脚 strapping 选择。
FPGA 实现要点(以 Xilinx 7 系列为例):
- 发送路径 :使用
ODDR原语实现 DDR 输出。TXD 和 TX_CTL 都需要经过 ODDR,其中上升沿数据接 D1,下降沿数据接 D2。TXC 也通过 ODDR 输出,D1=1、D2=0,形成 125 MHz 时钟。 - 接收路径 :使用
IDDR原语实现 DDR 输入,将 RXD 和 RX_CTL 拆分为上升沿和下降沿两路数据,再在 125 MHz 时钟域内组合成 8 位数据和 DV/ER 信号。 - 时序约束 :必须为 RGMII 接口编写
set_input_delay和set_output_delay约束,参考时钟为 RXC/TXC。延迟值取决于 PHY 的延迟模式和 PCB 走线长度,通常需要根据数据手册计算。 - IDELAY 使用:在延迟模式下,如果 PHY 的延迟不够精确,可以使用 FPGA 的 IDELAY 原语对 RXD 做精细调整。
应用场景:RGMII 是当前 FPGA 千兆以太网设计的主流选择,广泛应用于工业控制板卡、开发板、网络设备。它的优势是引脚少(12 根)、成本低、PHY 芯片选择多(如 Marvell 88E1512、Realtek RTL8211、TI DP83867)。缺点是时序调试相对复杂,PCB 走线需要严格控制。
3.5 SGMII:串行千兆媒体独立接口(Serial GMII)
SGMII 是 Cisco 提出、后被广泛采用的串行 MAC-PHY 接口,使用 SerDes 进行差分传输。
信号定义:
- 一对发送差分线(SGMII_TX_P/N)。
- 一对接收差分线(SGMII_RX_P/N)。
- 可选的一对时钟差分线(SGMII_CLK_P/N),用于某些 PHY 的参考时钟输出。
核心机制:SGMII 在物理层使用 1.25 Gbps 的串行速率(8b/10b 编码后),承载 1 Gbps 的有效数据。数据在 PCS 层被编码为 8b/10b 码流,其中包含了控制字符用于标识帧边界和空闲状态。
关键特性:
- 速率自适应:SGMII 支持 10/100/1000 Mbps 三种速率,通过 8b/10b 控制字符中的速率标识进行协商。
- 自协商:SGMII 支持通过控制字符进行速率和双工协商,无需额外的管理通道。
- 时钟恢复:接收端从串行数据流中恢复时钟,无需单独的时钟线。
FPGA 实现要点:
- 必须使用 SerDes 资源:SGMII 需要 FPGA 内部的 GTP/GTX/GTH 等高速收发器。以 Xilinx 7 系列为例,需要使用 GTPE2_CHANNEL 原语或通过 1G/2.5G Ethernet PCS/PMA IP 核实现。
- 参考时钟:SerDes 需要 125 MHz 参考时钟(具体频率取决于器件和配置),通常由外部晶振提供。
- IP 核使用:Xilinx 提供 "1G/2.5G Ethernet PCS/PMA or SGMII" IP 核,可以直接配置为 SGMII 模式,输出 GMII 接口给 MAC 逻辑。这是最推荐的实现方式。
- 自协商处理:SGMII 的自协商通过 PCS 层的控制字符完成,IP 核会自动处理,用户只需关注 GMII 侧接口。
应用场景:SGMII 适用于需要长距离传输、抗干扰能力强、引脚资源紧张的场景。典型应用包括:
- 背板连接(板间通信)。
- 光模块连接(通过 SFP 接口)。
- 多端口交换机(配合 QSGMII)。
- 需要电气隔离的工业场景。
3.6 QSGMII:四通道串行千兆媒体独立接口(Quad SGMII)
QSGMII 是 SGMII 的多通道版本,用一对差分线承载 4 路千兆数据。
核心机制:QSGMII 的串行速率为 5 Gbps(4 × 1.25 Gbps),通过时分复用把 4 路 SGMII 数据合并到一对差分线上。接收端根据控制字符中的通道标识把数据分发到 4 个通道。
FPGA 实现要点:需要 5 Gbps 以上的 SerDes 资源。Xilinx 提供 QSGMII 相关的 IP 支持,但相对 SGMII 而言,QSGMII 的 IP 支持较少,通常需要自行实现或使用第三方 IP。
应用场景:QSGMII 主要用于多端口交换机、路由器等需要 4 路千兆汇聚的场景。在 FPGA 中,QSGMII 常用于实现 4 口千兆交换功能。
3.7 XGMII:万兆媒体独立接口(10 Gigabit MII)
虽然本文主题是千兆,但 XGMII 作为 GMII 的万兆扩展,有必要简要提及以形成完整认知。
信号定义:32 位数据 + 4 位控制,发送和接收各一套,时钟 156.25 MHz(DDR),总引脚数约 74 根。
特点:引脚极多,实际板级设计中几乎不直接使用,而是通过 XAUI(4 通道 3.125 Gbps SerDes)或直接使用 SerDes 接口。
应用场景:XGMII 主要作为内部逻辑接口,在 FPGA 内部连接 MAC 和 PCS,不用于板级连接。
3.8 各 MAC-PHY 接口对比
| 接口 | 数据位宽 | 时钟频率 | 引脚数(约) | 是否需 SerDes | 典型速率 | 主要优势 |
|---|---|---|---|---|---|---|
| MII | 4 | 25 MHz | 16 | 否 | 100 Mbps | 标准成熟 |
| RMII | 2 | 50 MHz | 7 | 否 | 100 Mbps | 引脚少 |
| GMII | 8 | 125 MHz | 24 | 否 | 1 Gbps | 标准兼容 |
| RGMII | 4 (DDR) | 125 MHz | 12 | 否 | 1 Gbps | 引脚少、成本低 |
| SGMII | 1 (串行) | 1.25 Gbps | 4 | 是 | 1 Gbps | 引脚极少、距离远 |
| QSGMII | 1 (串行) | 5 Gbps | 4 | 是 | 4 Gbps | 4 路汇聚 |
| XGMII | 32 | 156.25 MHz | 74 | 否 | 10 Gbps | 内部接口 |
4. PHY 与线缆的介质接口详解
4.1 1000BASE-T:千兆双绞线接口
1000BASE-T 是 IEEE 802.3ab 定义的千兆以太网双绞线标准,是目前最广泛使用的千兆物理层规范。
电气特性:
- 使用 Cat5e 或更高等级的双绞线(4 对线)。
- 每对线同时进行双向传输(全双工),采用回声消除技术。
- 每对线承载 250 Mbps,4 对线合计 1 Gbps。
- 采用 PAM-5 编码,每个符号携带 2 位信息(5 个电平,实际使用 4 个数据电平 + 1 个用于前向纠错)。
- 符号率为 125 MBaud。
关键技术:
- 回声消除(Echo Cancellation):由于每对线同时收发,发送信号会泄漏到接收端,必须通过回声消除器分离。
- 近端串扰消除(NEXT Cancellation):4 对线之间的串扰需要消除。
- 均衡(Equalization):补偿线缆的频率相关衰减。
- 网格编码(Trellis Coding):提高编码增益。
传输距离:标准规定 100 米(Cat5e),实际在优质线缆上可略超。
FPGA 侧连接方式:FPGA 不直接连接 1000BASE-T 线缆,而是通过 PHY 芯片。FPGA 与 PHY 之间的接口可以是 RGMII、SGMII、GMII 等。PHY 芯片内部完成 PAM-5 编解码、回声消除等模拟处理。
应用场景:1000BASE-T 是办公网络、工业以太网、嵌入式设备的标准接口。几乎所有带千兆网口的设备都使用 1000BASE-T。
4.2 1000BASE-X:千兆光纤/背板接口族
1000BASE-X 是 IEEE 802.3z 定义的一组千兆物理层规范,使用 8b/10b 编码,主要包括:
4.2.1 1000BASE-SX:短波长多模光纤
- 波长:850 nm。
- 光纤类型:多模光纤(MMF)。
- 传输距离:550 米(50/125 μm 光纤)或 275 米(62.5/125 μm 光纤)。
- 应用:数据中心内部短距离连接、楼内布线。
4.2.2 1000BASE-LX:长波长单模/多模光纤
- 波长:1310 nm。
- 光纤类型:单模光纤(SMF)或多模光纤。
- 传输距离:5 公里(单模)或 550 米(多模)。
- 应用:园区网、城域网边缘、长距离连接。
4.2.3 1000BASE-CX:短距离铜缆
- 介质:屏蔽双绞线(STP)或同轴电缆。
- 传输距离:25 米。
- 应用:机架内设备互联、短距离背板连接。
1000BASE-X 的共同特性:
- 使用 8b/10b 编码,线路速率 1.25 Gbps。
- 支持自协商(通过 /C/ 和 /I/ 有序集)。
- 通常通过 SFP 光模块或 SFP 电口模块实现。
FPGA 侧连接方式:FPGA 通过 SerDes 连接 SFP 模块,接口形式为 1000BASE-X 模式下的 SGMII 或直接 1000BASE-X PCS。Xilinx 的 "1G/2.5G Ethernet PCS/PMA" IP 核支持 1000BASE-X 模式。
应用场景:光纤接口适用于需要电气隔离、抗电磁干扰、长距离传输的场景,如电力系统、轨道交通、工业现场。
4.3 1000BASE-KX:千兆背板接口
1000BASE-KX 是 IEEE 802.3ap 定义的背板以太网标准,用于板间背板连接。
电气特性:
- 使用背板上的差分走线。
- 线路速率 1.25 Gbps(8b/10b 编码)。
- 传输距离:约 1 米(取决于背板质量)。
- 支持自协商。
FPGA 侧连接方式:通过 SerDes 直接连接背板差分对,使用 1000BASE-X PCS 逻辑。
应用场景:刀片服务器、模块化设备、ATCA 架构的背板通信。
4.4 介质接口对比
| 标准 | 介质 | 编码 | 距离 | 典型应用 |
|---|---|---|---|---|
| 1000BASE-T | Cat5e 双绞线 | PAM-5 | 100 m | 通用网络 |
| 1000BASE-SX | 多模光纤 | 8b/10b | 550 m | 数据中心 |
| 1000BASE-LX | 单模光纤 | 8b/10b | 5 km | 园区/城域 |
| 1000BASE-CX | 屏蔽铜缆 | 8b/10b | 25 m | 机架内 |
| 1000BASE-KX | 背板 | 8b/10b | ~1 m | 板间背板 |
5. 管理接口:MDIO/MDC
5.1 接口定义
MDIO(Management Data Input/Output)是 IEEE 802.3 Clause 22 定义的 PHY 管理接口,用于读写 PHY 内部寄存器。
信号:
- MDC:管理时钟,由 MAC(FPGA)产生,最高频率通常为 2.5 MHz(标准规定不超过 2.5 MHz)。
- MDIO:双向数据线,用于传输命令和数据。
5.2 帧格式(Clause 22)
Clause 22 的 MDIO 帧格式如下:
- 前导码(Preamble):32 位 1。
- 起始码(ST):2 位 01。
- 操作码(OP):2 位,01 表示读,10 表示写。
- PHY 地址(PHYAD):5 位。
- 寄存器地址(REGAD):5 位。
- 转向(TA):2 位,读操作时由 MAC 输出 Z0,PHY 输出 0;写操作时输出 10。
- 数据(DATA):16 位。
5.3 Clause 45 扩展
对于万兆及更高速率的 PHY,使用 Clause 45 的 MDIO 帧格式,支持更长的寄存器地址和更多的设备类型。千兆 PHY 通常使用 Clause 22 即可。
5.4 FPGA 实现要点
- MDC 频率不能超过 2.5 MHz,通常配置为 1.25 MHz 或更低。
- MDIO 是双向线,需要三态控制:FPGA 输出时驱动,输入时置为高阻。
- 读操作有转向周期(TA),FPGA 必须在 TA 期间释放 MDIO 总线。
- 上电后通常需要等待 PHY 复位完成(约 10-100 ms)再进行 MDIO 访问。
5.5 典型寄存器操作
- 读取 PHY ID(寄存器 2 和 3):验证 PHY 是否存在及型号。
- 配置自协商(寄存器 0 和 4):设置速率、双工、流控。
- 读取链路状态(寄存器 1):判断链路是否建立。
- 配置 RGMII 延迟(厂商自定义寄存器):设置 TX/RX 延迟模式。
6. FPGA 侧实现方法详解
6.1 整体架构
一个典型的 FPGA 千兆以太网设计包含以下模块:
- MAC 层:帧的封装/解封装、CRC 校验、地址过滤。
- MAC-PHY 接口模块:RGMII/SGMII 等接口的时序转换。
- PHY 芯片:完成物理层处理。
- 管理模块:MDIO 控制器。
- 上层逻辑:DMA、协议栈、应用处理。
6.2 RGMII 接口的 Verilog 实现要点
发送路径:
verilog
// RGMII 发送 DDR 输出(Xilinx 7 系列)
// txd_rise/txd_fall 为 4 位数据,tx_ctl_rise/tx_ctl_fall 为控制位
ODDR #(
.DDR_CLK_EDGE("SAME_EDGE"),
.INIT(1'b0),
.SRTYPE("SYNC")
) oddr_txd0 (
.Q(rgmii_txd[0]),
.C(tx_clk_125m),
.CE(1'b1),
.D1(txd_rise[0]),
.D2(txd_fall[0]),
.R(1'b0),
.S(1'b0)
);
// 其余 3 位同理
接收路径:
verilog
// RGMII 接收 DDR 输入
IDDR #(
.DDR_CLK_EDGE("SAME_EDGE_PIPELINED"),
.INIT_Q1(1'b0),
.INIT_Q2(1'b0),
.SRTYPE("SYNC")
) iddr_rxd0 (
.Q1(rxd_rise[0]),
.Q2(rxd_fall[0]),
.C(rgmii_rxc),
.CE(1'b1),
.D(rgmii_rxd[0]),
.R(1'b0),
.S(1'b0)
);
时序约束示例:
tcl
# RGMII 输入延迟约束(延迟模式,PHY 内部延迟约 2ns)
set_input_delay -clock [get_clocks rgmii_rxc] -max 2.0 [get_ports rgmii_rxd*]
set_input_delay -clock [get_clocks rgmii_rxc] -min 0.5 [get_ports rgmii_rxd*]
set_input_delay -clock [get_clocks rgmii_rxc] -max 2.0 [get_ports rgmii_rx_ctl]
set_input_delay -clock [get_clocks rgmii_rxc] -min 0.5 [get_ports rgmii_rx_ctl]
# RGMII 输出延迟约束
set_output_delay -clock [get_clocks rgmii_txc] -max 1.5 [get_ports rgmii_txd*]
set_output_delay -clock [get_clocks rgmii_txc] -min -0.5 [get_ports rgmii_txd*]
注意:上述延迟值仅为示例,实际值必须根据 PHY 数据手册和 PCB 走线长度计算。
6.3 SGMII 接口的实现
SGMII 的实现强烈建议使用厂商 IP 核。以 Xilinx 为例:
- 在 Vivado 中例化 "1G/2.5G Ethernet PCS/PMA or SGMII" IP 核。
- 配置为 SGMII 模式,选择正确的参考时钟频率。
- IP 核输出 GMII 接口(8 位数据 + 控制信号),连接到用户 MAC 逻辑。
- IP 核自动处理 8b/10b 编解码、自协商、时钟恢复。
关键配置项:
- 参考时钟频率:通常 125 MHz 或 200 MHz,取决于器件。
- 是否启用自协商。
- 是否启用管理接口(可选,用于读取 PCS 状态)。
6.4 MDIO 控制器的 Verilog 实现
verilog
// 简化的 MDIO 写操作状态机
localparam IDLE = 2'd0, PREAMBLE = 2'd1, SEND = 2'd2, DONE = 2'd3;
always @(posedge clk) begin
case (state)
IDLE: if (start) begin
state <= PREAMBLE;
shift_reg <= 32'hFFFFFFFF; // 前导码
bit_cnt <= 32;
end
PREAMBLE: begin
mdc <= ~mdc;
if (mdc) begin
mdio_out <= shift_reg[31];
shift_reg <= {shift_reg[30:0], 1'b0};
if (bit_cnt == 1) begin
state <= SEND;
shift_reg <= {2'b01, 2'b10, phy_addr, reg_addr, 2'b10, write_data};
bit_cnt <= 32;
end else bit_cnt <= bit_cnt - 1;
end
end
SEND: begin
mdc <= ~mdc;
if (mdc) begin
mdio_out <= shift_reg[31];
shift_reg <= {shift_reg[30:0], 1'b0};
if (bit_cnt == 1) state <= DONE;
else bit_cnt <= bit_cnt - 1;
end
end
DONE: begin
state <= IDLE;
mdio_oe <= 1'b0;
end
endcase
end
上述代码为示意性结构,实际实现需要处理 MDC 分频、三态控制、读操作的转向周期等细节。
6.5 时钟域处理
FPGA 千兆以太网设计中常见的时钟域:
- 系统时钟(如 100 MHz):MAC 内部逻辑。
- GTX_CLK / TXC(125 MHz):发送接口。
- RX_CLK / RXC(125 MHz):接收接口。
- MDC(1.25 MHz):管理接口。
跨时钟域处理需要使用异步 FIFO 或握手同步器。特别是 RX_CLK 是 PHY 恢复的时钟,与系统时钟异步,必须通过 FIFO 隔离。
7. 接口选型与应用场景分析
7.1 选型决策树
在实际项目中,接口选型通常遵循以下逻辑:
- 速率需求:百兆选 MII/RMII,千兆选 RGMII/SGMII/GMII。
- 引脚资源:引脚紧张选 RGMII 或 SGMII,引脚充裕可选 GMII。
- 传输距离:板内短距离选 RGMII,板间或长距离选 SGMII + 光纤。
- 隔离需求:需要电气隔离选光纤(1000BASE-X)。
- 成本:RGMII PHY 成本最低,SGMII 需要 SerDes 资源。
- 多端口 :多端口选 QSGMII 或独立 SGMII。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
7.2 典型场景分析
场景一:工业控制板卡
- 需求:单路千兆,板内 PHY,成本敏感。
- 选型:RGMII + 1000BASE-T PHY(如 Marvell 88E1512)。
- 理由:引脚少、成本低、PHY 选择多。
场景二:多端口工业交换机
- 需求:4 路千兆,小型化。
- 选型:QSGMII + 4 口 PHY(如 Marvell 88E6390)。
- 理由:一对差分线承载 4 路,节省引脚和 PCB 面积。
场景三:电力保护装置
- 需求:千兆,强电磁干扰环境,需要隔离。
- 选型:SGMII + 1000BASE-X 光模块(SFP)。
- 理由:光纤天然隔离,抗干扰能力强。
场景四:机器视觉相机
- 需求:千兆,长距离传输,低延迟。
- 选型:SGMII + 1000BASE-T PHY 或 1000BASE-X。
- 理由:SGMII 引脚少,便于小型化;光纤可选长距离。
场景五:测试测量设备
- 需求:千兆,需要精确时间同步。
- 选型:RGMII 或 SGMII,配合 IEEE 1588 硬件时间戳。
- 理由:接口选择取决于主控和 PHY,1588 需要 MAC 侧支持。
场景六:车载以太网
- 需求:千兆,车载环境。
- 选型:1000BASE-T1(单对双绞线)配合相应 PHY。
- 理由:车载布线要求单对线,标准为 IEEE 802.3bp。
7.3 常见问题与排查
问题一:RGMII 链路不通
- 检查 PHY 的 RGMII 延迟配置(寄存器或 strapping 引脚)。
- 检查 FPGA 侧时序约束是否正确。
- 用示波器观察 TXC 与 TXD 的相位关系。
问题二:SGMII 自协商失败
- 检查参考时钟是否正常。
- 检查 IP 核配置是否与 PHY 匹配。
- 读取 PCS 状态寄存器确认链路状态。
问题三:MDIO 读不到 PHY
- 检查 MDC 频率是否超限。
- 检查 PHY 地址是否正确(strapping 引脚)。
- 检查上电复位时序。
问题四:丢包严重
- 检查 FIFO 深度是否足够。
- 检查时钟域切换是否正确。
- 检查 CRC 校验逻辑。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
8. 总结
本文系统梳理了 FPGA 与千兆以太网之间的各类物理接口,按照"MAC-PHY 板级接口 → PHY-线缆介质接口 → 管理接口"三个层次展开,详细讲解了每种接口的信号定义、电气特性、时序机制、FPGA 实现方法和应用场景。
核心要点回顾:
- MII/RMII 是百兆接口,GMII/RGMII/SGMII 是千兆接口,XGMII 是万兆接口。
- RGMII 通过 DDR 双沿采样用 12 根引脚实现千兆,是当前 FPGA 设计的主流选择。
- SGMII 通过 SerDes 用一对差分线实现千兆,适合长距离和多端口场景。
- 1000BASE-T 是双绞线标准,1000BASE-X 是光纤/背板标准,两者在 PHY 芯片的线缆侧实现。
- MDIO/MDC 是 PHY 管理接口,用于配置和状态读取。
- 接口选型需综合考虑速率、引脚、距离、隔离、成本和端口数。
在实际工程中,建议优先使用厂商 IP 核(如 Xilinx 1G/2.5G Ethernet PCS/PMA),并严格按照 PHY 数据手册配置时序参数。RGMII 的时序调试是最容易出问题的环节,务必用示波器和时序分析工具验证。