一、千兆以太网概述:从10M到1000M的演进史

做FPGA通信开发这些年,我接触最多的就是以太网。从早期的10M半双工,到现在的千兆、万兆,这条演进路线其实很有意思。说白了,以太网的发展史就是一部「速度与效率」的博弈史。

1.1 从10M到1000M:速度的跃迁

1980年代,以太网刚出来时只有10Mbps。那时候用同轴电缆,一个网段上所有设备共享带宽。你想想看,10M的速度在今天连一张高清图片都传不利索,但在当时已经是革命性的了。

到了1995年,快速以太网(100M)出现了。我记得第一次在实验室调通100M链路时,那种感觉就像从绿皮火车换成了高铁。不过真正让我觉得「够用了」的,还是千兆以太网。

千兆以太网(1000M)有几个关键变化:

  • 编码方式变了:从8B/10B编码改为更高效的编码方案
  • 传输介质升级:双绞线从Cat5升级到Cat5e甚至Cat6
  • 全双工成为标配:不再有冲突检测的烦恼

核心要点:千兆以太网并不是简单地把时钟频率提高10倍,而是在物理层和MAC层都做了重大改进。我在项目中遇到过有人直接把百兆代码改个时钟就上板子,结果死活不通——嗯,这里要注意,千兆的时序收敛难度比百兆高了一个数量级。

1.2 OSI模型与TCP/IP协议栈

做FPGA开发,我们最关心的是OSI模型的下面两层:物理层和数据链路层。上面那些TCP、UDP什么的,通常是软件工程师的活。但你要完全不懂也不行,毕竟FPGA有时候也要做协议卸载。

OSI七层模型和TCP/IP四层模型的对应关系,我习惯这样记:

OSI模型TCP/IP模型FPGA关注度
应用层应用层★☆☆☆☆
表示层★☆☆☆☆
会话层★☆☆☆☆
传输层传输层★★★☆☆
网络层网络层★★★☆☆
数据链路层网络接口层★★★★★
物理层★★★★★

说白了,FPGA工程师的战场就在最下面两层。物理层管信号怎么在线上跑,MAC层管数据怎么组帧。我见过不少新手一上来就想用FPGA实现完整的TCP协议栈,结果把自己绕进去了。我的建议是:先把MAC层吃透,再考虑上层。

1.3 以太网帧结构详解

以太网帧的结构,我闭着眼睛都能画出来。做FPGA开发时,你每天都在跟这玩意儿打交道。

| 前导码(7B) | 帧起始定界符(1B) | 目的MAC(6B) | 源MAC(6B) | 类型/长度(2B) | 数据(46-1500B) | FCS(4B) |

这里有几个坑,我一个个说:

  • 前导码和SFD:FPGA接收时通常会把这两部分剥离掉,只给上层MAC地址之后的数据。但发送时你得自己加上去。
  • MAC地址:目的地址可以是单播、多播或广播。我曾经在调试时忘了处理广播帧,结果整个网络都被我搞卡了...尴尬。
  • 类型/长度字段:值大于1536时表示上层协议类型(比如0x0800是IP),小于等于1500时表示数据长度。这个判断逻辑在FPGA里很好实现。
  • 数据字段:最小46字节,最大1500字节。如果数据不够46字节,你得填充到46字节。这个填充逻辑,我建议在发送端就处理好,不要在接收端做假设。
  • FCS:4字节的CRC32校验。FPGA实现CRC32有现成的IP核,但要注意初始值和多项式是否匹配。

个人经验:调试以太网帧时,我习惯先用Wireshark抓包确认软件侧的行为,再用FPGA的ILA抓内部信号对比。这样能快速定位问题是出在MAC层还是物理层。

1.4 千兆以太网的物理层与MAC层分工

千兆以太网中,物理层和MAC层的分工非常明确。我画了一张图来说明:

千兆以太网分层架构 MAC层(数据链路层) 帧封装/解封装 · 地址过滤 · CRC校验 · 流量控制 半双工/全双工控制 · 冲突检测(CSMA/CD) GMII / RGMII 接口 物理层(PHY) 编码/解码(8B/10B) · 串行/解串 · 时钟恢复 · 线路驱动 双绞线 / 光纤

这张图我做了简化,但核心逻辑都在里面了。MAC层和物理层之间通过GMII(千兆介质独立接口)或RGMII(简化版)连接。我个人更推荐RGMII,因为它只需要8根数据线,布线压力小很多。

物理层负责的事情,说白了就是「把数字信号变成能在线上跑的电信号/光信号」。这里面涉及编码、时钟恢复、均衡等一堆模拟电路的东西。FPGA一般不直接处理这些,而是外接一个PHY芯片。

MAC层则是FPGA的主战场。你要实现:

  • 帧的组装与解析:按照前面讲的帧结构,把数据打包或拆包
  • 地址过滤:判断收到的帧是不是发给自己的
  • CRC校验:保证数据完整性
  • 流量控制:防止接收端被数据淹没

避坑指南:我曾经在项目中把MAC层的流量控制逻辑写错了,导致发送端疯狂重传,把整个网络的带宽都吃掉了。后来排查了三天才发现是PAUSE帧的处理时序有问题。所以,流量控制这块一定要仔细验证。

千兆以太网的时钟频率是125MHz(对于GMII),数据位宽8位。如果你用RGMII,时钟频率不变,但数据在时钟的双沿采样。这个细节在FPGA时序约束时要特别注意,我习惯在约束文件里明确标注DDR模式。

好了,这一章的内容就到这里。千兆以太网的基础概念先铺垫到这,后面我们会一步步深入到具体的FPGA实现中去。


专注资料整理