FPGA 进阶 14:千兆以太网 RGMII——GMII/RGMII 时序、PHY 对接与帧收发
本文是
fpga/进阶层第 18 篇。千兆以太网是 FPGA 最常用的对外高速口:数据回传、图像/频谱上传、与 PC 通信都靠它。这篇把一条网口链路讲完整:FPGA 里的 MAC → GMII/RGMII → 外部 PHY → RJ45,重点是开发板上最常见的 RGMII 源同步 DDR 接口怎么对齐、以太网帧长什么样、工程用什么 IP、以及从 link 灯亮到 Wireshark 抓到包的 bring-up 顺序。PHY 之下的差分线、收发器深水区见专家层高速串行篇。
本文要回答的问题
- 一条千兆网口在 FPGA 侧由哪些部分组成?MAC、PHY 各管什么?
- GMII 和 RGMII 差在哪?RGMII 用 4 根数据线怎么跑到千兆?
- RGMII 的时钟/数据相位(延迟)怎么对齐?谁加延迟?
- 以太网帧结构是什么?CRC 怎么来?
- 工程用什么 MAC IP?PC 端怎么收发自定义数据?
- link 不亮、CRC 错、收不到包怎么分层查?
一、链路全貌:MAC—PHY—网线
┌─────────────── FPGA ───────────────┐ ┌──────┐ ┌──────┐
│ 你的逻辑 ↔ 以太网 MAC(TEMAC/轻量) │──RGMII──► PHY ├──► RJ45 ──► 网线/PC
│ 帧缓冲/CRC/地址过滤 125MHz DDR │ 4bit │芯片 │ 差分MDI
└────────────────────────────────────┘ └──────┘- MAC(媒体访问控制):在 FPGA 内,负责组帧/拆帧、前导码、CRC32 生成校验、地址过滤、CSMA/CD(全双工基本不用)、与上层(IP/UDP 或自定义帧)接口;
- PHY(物理层芯片):板上独立芯片(如 Marvell 88E1512、Realtek RTL8211),负责线路编码、差分驱动、自动协商(速率/双工)、时钟恢复;
- MAC↔PHY 接口:GMII 或 RGMII(本文重点);PHY↔RJ45 是差分 MDI,硬件走线,不归逻辑管。
- PHY 配置通常通过 MDIO/MDC(两根管理线,类似 I2C 的读写寄存器接口)由 FPGA 或上电 strap 配置。
二、GMII vs RGMII
| GMII | RGMII(Reduced GMII) | |
|---|---|---|
| 数据位宽 | 8 bit | 4 bit |
| 传输方式 | 单边沿(SDR) | 双沿 DDR(上升沿低 4 位、下降沿高 4 位) |
| 时钟 | 125 MHz | 125 MHz |
| 每周期字节 | 1 | 1(双沿各传 4 位) |
| 引脚数 | 多(8+控制/方向) | 约一半,PCB 省 |
| 典型 | 早期/部分接口 | 绝大多数开发板 |
RGMII 用 4 根线在 125MHz 时钟的两个边沿各传半字节,一个时钟周期凑齐 1 字节,所以吞吐和 GMII 相同但引脚减半。FPGA 侧发送要用 ODDR/OSERDESE 把 8bit 拼成双沿 4bit、接收用 IDDR/ISERDESE 把双沿 4bit 还原成 8bit。
三、RGMII 时序与延迟对齐(核心难点)
RGMII 是源同步接口:时钟跟着数据一起走,接收端要在数据眼图中心采样。RGMII 规范要求时钟相对数据有 约 1.5~2ns 延迟(数据在时钟沿前后都稳定)。
- 发送方向:FPGA 发出 GTX_CLK(TX 时钟)和 TXD/TX_CTL,PHY 用这个时钟采样数据,期望时钟滞后数据 ~2ns;
- 接收方向:PHY 发出 RX_CLK 和 RXD/RX_CTL,FPGA 用 RX_CLK 采样,同样要对齐。
两种对齐方案,二选一、不能重复加:
- PHY 内部延迟:多数 PHY 可配(寄存器或 strap)在 RX/TX 插入 2ns 延迟。选了它,FPGA 侧就发「边沿对齐」的时钟数据,不再用 IDELAY 调;
- FPGA 延迟:用 IDELAYE2/ODELAYE2 对数据(或时钟)做可编程延迟,逐 tap 调整直到稳定采样窗口中心。
常见错误:FPGA 和 PHY 两边都加延迟(过冲,数据跑到时钟另一边沿)或都不加(正好对到跳变沿)→ 表现为链路时通时断、CRC 错误率高。调通的标志:在整包流量下 CRC 错误为 0、长时间不丢包。
时序约束上,RGMII 不是普通同步路径:时钟数据相位是刻意用延迟调出来的,若当普通时钟跑 STA,工具会报错或把你调好的延迟优化掉。正确做法是把 IDDR/ODDR + IDELAY 放在 IOB,按源同步接口用 set_input_delay/set_output_delay(相对 RGMII 时钟、含 DDR 边沿)约束——Xilinx TEMAC/三速以太网 IP 会附带配套 XDC,照抄即可,不要简单 set_false_path 一禁了之(那样延迟校准失去依据)。
四、以太网帧结构
MAC 收发的数据是一帧帧以太网包:
| 字段 | 字节 | 说明 |
|---|---|---|
| 前导码 Preamble | 7 | 0x55×7,用于时钟同步 |
| 帧起始 SFD | 1 | 0xD5,标志帧开始(MAC 硬件处理) |
| 目的 MAC | 6 | 目标网卡地址(广播 FF:FF:FF:FF:FF:FF) |
| 源 MAC | 6 | 发送方地址 |
| 类型/长度 | 2 | 0x0800=IPv4、0x0806=ARP、自定义值可传裸帧 |
| 载荷 payload | 46~1500 | IP/UDP 包或自定义数据(不足 46 要填充 pad) |
| FCS/CRC32 | 4 | 对 目的MAC~payload 的 CRC32 校验 |
- CRC32:对「目的 MAC 到 payload」整段计算 32 位循环冗余校验,由 MAC 硬件在发送时追加、接收时校验。并行 CRC(每时钟处理 8/32bit)用 LFSR 或查表/异或展开实现,Xilinx MAC IP 自带,无需手写。
- 帧间有 IFG(间隔 12 字节)、最小帧 64 字节(不含前导)。
五、工程做法:MAC IP 与软件配合
MAC 侧:
- Xilinx 三速以太网 MAC(TEMAC / Tri-Mode Ethernet MAC):支持 10/100/1000M,配 RGMII 接口 + 外部 PHY,Block Design 里可配;提供 AXI 管理接口和帧收发(通常配 AXI DMA/Stream FIFO);
- 轻量/开源 MAC(如各种 Verilog 1G MAC)适合资源敏感或想完全掌控帧的场景;
- MAC 的数据出口是 AXI4-Stream(见进阶 14):收帧是一串 TDATA + TLAST(帧末),接 AXI DMA 可直接写进 DDR。
PC 软件侧两条路:
| 方式 | FPGA 侧 | PC 侧 | 特点 |
|---|---|---|---|
| UDP/IP | MAC + 轻量 IP/UDP 协议栈 | 普通 socket | 免驱动、可过交换机、Wireshark 可抓,推荐 |
| 裸以太网帧 | MAC 发自定义 EtherType | WinPcap/Npcap(Scapy/pcap 库) | 最低延迟、最直接,但要装 pcap、一般不过路由 |
调试利器是 Wireshark:能立刻区分「帧根本没发出来 / CRC 错被丢 / MAC 或 IP 地址不匹配 / 端口不对」。bring-up 顺序:① PHY link 灯亮(协商成功,先查 MDIO/strap);② Wireshark 能看到帧(哪怕 CRC 错);③ CRC 正确、数据对;④ 再跑上层协议。
六、bring-up 分层排查
| 现象 | 可能层级 | 排查 |
|---|---|---|
| link 灯不亮 / 协商不成 | PHY、时钟、MDIO | 查 PHY 上电 strap、125MHz 参考时钟、MDIO 能否读到 PHY ID 寄存器 |
| Wireshark 完全看不到帧 | MAC 没发 / RGMII 延迟 | ILA 抓 MAC→RGMII 的 TX 有数据;查 RGMII 延迟是否两边都加/都没加 |
| 能看到帧但 CRC 错误 | RGMII 相位/采样 | 调 IDELAY tap 或改 PHY 延迟模式;确认 IDDR/ODDR 在 IOB、约束正确 |
| CRC 对但数据错位 | 字节序/位序、双沿拼字 | 查 DDR 高低半字节顺序、TX_CTL/RX_CTL(DV+ERR 双沿)拼接 |
| 偶尔丢包/长流量崩 | FIFO 水位/反压 | 收侧 AXI-Stream FIFO/DMA 反压是否正确(见进阶 10) |
| PC 收到但应用层没数据 | MAC/IP/端口、ARP | Wireshark 看是 ARP 没回、IP 不匹配还是 UDP 端口错 |
相关与延伸
前置/配套:AXI4-Stream 与 AXI4-Lite(MAC 帧走 Stream)、DDR MIG(帧/DMA 缓冲落点)、FIFO 设计(收包缓冲反压)、低速接口 UART/SPI/I2C(MDIO 类管理接口思路)。 万兆/10G 以太网、RGMII 之上的 SGMII/光口、TCP 卸载见专家层「以太网深水区(10G·卸载)」规划篇;差分线与收发器基础见下一篇 LVDS 源同步。
一句话总结:千兆网口 = FPGA 内 MAC(TEMAC,AXI-Stream 出帧、硬件算 CRC32)经 RGMII(4bit DDR、125MHz 源同步)连外部 PHY;RGMII 的关键是时钟相对数据 ~2ns 延迟只能由 FPGA IDELAY 或 PHY 内部延迟二选一提供、配合源同步约束;PC 侧优先走 UDP+Wireshark 调试,bring-up 按「link 灯亮→抓到帧→CRC 对→数据对→上层通」分层定位。