FPGA 与千兆以太网:各类物理接口的形式、区别、使用方法与应用场景详解

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 实现要点:

  1. GTX_CLK 必须由 FPGA 的时钟管理资源(MMCM/PLL)产生,并通过 ODDR 原语从普通 IO 输出,以保证时钟与数据的相位关系。Xilinx 7 系列及以后器件推荐使用 ODDR 原语输出 GTX_CLK,而不是直接用 BUFG 驱动 IO。
  2. RX_CLK 是 PHY 恢复的时钟,进入 FPGA 后需要经过 BUFG/BUFR 处理,并在该时钟域内采样 RXD。
  3. 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 系列为例):

  1. 发送路径 :使用 ODDR 原语实现 DDR 输出。TXD 和 TX_CTL 都需要经过 ODDR,其中上升沿数据接 D1,下降沿数据接 D2。TXC 也通过 ODDR 输出,D1=1、D2=0,形成 125 MHz 时钟。
  2. 接收路径 :使用 IDDR 原语实现 DDR 输入,将 RXD 和 RX_CTL 拆分为上升沿和下降沿两路数据,再在 125 MHz 时钟域内组合成 8 位数据和 DV/ER 信号。
  3. 时序约束 :必须为 RGMII 接口编写 set_input_delay 和 set_output_delay 约束,参考时钟为 RXC/TXC。延迟值取决于 PHY 的延迟模式和 PCB 走线长度,通常需要根据数据手册计算。
  4. 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 码流,其中包含了控制字符用于标识帧边界和空闲状态。

关键特性:

  1. 速率自适应:SGMII 支持 10/100/1000 Mbps 三种速率,通过 8b/10b 控制字符中的速率标识进行协商。
  2. 自协商:SGMII 支持通过控制字符进行速率和双工协商,无需额外的管理通道。
  3. 时钟恢复:接收端从串行数据流中恢复时钟,无需单独的时钟线。

FPGA 实现要点:

  1. 必须使用 SerDes 资源:SGMII 需要 FPGA 内部的 GTP/GTX/GTH 等高速收发器。以 Xilinx 7 系列为例,需要使用 GTPE2_CHANNEL 原语或通过 1G/2.5G Ethernet PCS/PMA IP 核实现。
  2. 参考时钟:SerDes 需要 125 MHz 参考时钟(具体频率取决于器件和配置),通常由外部晶振提供。
  3. IP 核使用:Xilinx 提供 "1G/2.5G Ethernet PCS/PMA or SGMII" IP 核,可以直接配置为 SGMII 模式,输出 GMII 接口给 MAC 逻辑。这是最推荐的实现方式。
  4. 自协商处理: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。

关键技术:

  1. 回声消除(Echo Cancellation):由于每对线同时收发,发送信号会泄漏到接收端,必须通过回声消除器分离。
  2. 近端串扰消除(NEXT Cancellation):4 对线之间的串扰需要消除。
  3. 均衡(Equalization):补偿线缆的频率相关衰减。
  4. 网格编码(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 实现要点

  1. MDC 频率不能超过 2.5 MHz,通常配置为 1.25 MHz 或更低。
  2. MDIO 是双向线,需要三态控制:FPGA 输出时驱动,输入时置为高阻。
  3. 读操作有转向周期(TA),FPGA 必须在 TA 期间释放 MDIO 总线。
  4. 上电后通常需要等待 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 为例:

  1. 在 Vivado 中例化 "1G/2.5G Ethernet PCS/PMA or SGMII" IP 核。
  2. 配置为 SGMII 模式,选择正确的参考时钟频率。
  3. IP 核输出 GMII 接口(8 位数据 + 控制信号),连接到用户 MAC 逻辑。
  4. 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 选型决策树

在实际项目中,接口选型通常遵循以下逻辑:

  1. 速率需求:百兆选 MII/RMII,千兆选 RGMII/SGMII/GMII。
  2. 引脚资源:引脚紧张选 RGMII 或 SGMII,引脚充裕可选 GMII。
  3. 传输距离:板内短距离选 RGMII,板间或长距离选 SGMII + 光纤。
  4. 隔离需求:需要电气隔离选光纤(1000BASE-X)。
  5. 成本:RGMII PHY 成本最低,SGMII 需要 SerDes 资源。
  6. 多端口 :多端口选 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 实现方法和应用场景。

核心要点回顾:

  1. MII/RMII 是百兆接口,GMII/RGMII/SGMII 是千兆接口,XGMII 是万兆接口。
  2. RGMII 通过 DDR 双沿采样用 12 根引脚实现千兆,是当前 FPGA 设计的主流选择。
  3. SGMII 通过 SerDes 用一对差分线实现千兆,适合长距离和多端口场景。
  4. 1000BASE-T 是双绞线标准,1000BASE-X 是光纤/背板标准,两者在 PHY 芯片的线缆侧实现。
  5. MDIO/MDC 是 PHY 管理接口,用于配置和状态读取。
  6. 接口选型需综合考虑速率、引脚、距离、隔离、成本和端口数。

在实际工程中,建议优先使用厂商 IP 核(如 Xilinx 1G/2.5G Ethernet PCS/PMA),并严格按照 PHY 数据手册配置时序参数。RGMII 的时序调试是最容易出问题的环节,务必用示波器和时序分析工具验证。

相关推荐
NamoAmitabha1281 小时前
Zynq 的 AXI GPIO,是“ARM 通过一条国际标准高速公路(AXI 总线),去遥控 FPGA 里的一个寄存器”。---deepseek
fpga开发·zynq--ps
Black蜡笔小新1 小时前
上云网关/端口穿透/设备上云EasyNTS:无需公网IP、也不改防火墙,设备怎么从内网跑到外网去
网络·网络协议·tcp/ip
科技小登2 小时前
出海高防CDN怎么选?CDN加速、边缘清洗与跨境回源POC指南
tcp/ip·web安全·ddos
NamoAmitabha1282 小时前
ARM 不懂寄存器,它只懂内存地址---deepseek
fpga开发·zynq--ps
默|笙4 小时前
【Linux网络】传输层协议TCP(3)滑动窗口、流量控制
linux·网络·tcp/ip
FPGA小迷弟5 小时前
FPGA 千兆以太网帧格式全解:从 IEEE 802.3 帧结构到 Verilog 收发实现
人工智能·5g·fpga开发·架构·硬件架构
幻智星科技5 小时前
FPGA数据采集接口选型终极指南
fpga开发·udp·硬件架构
星夜离尘566 小时前
用 SystemVerilog 写一个可背压的流式 RLE 编码器:计数拆分、包尾与 flush 的完整实现
fpga开发
g5zhu58967 小时前
没有公网ip的情况下,本地能ping服务器服务器不能ping本地,让服务器能访问本地某端口的简单方法
服务器·网络协议·tcp/ip