一、千兆以太网概述:从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层和物理层之间通过GMII(千兆介质独立接口)或RGMII(简化版)连接。我个人更推荐RGMII,因为它只需要8根数据线,布线压力小很多。
物理层负责的事情,说白了就是「把数字信号变成能在线上跑的电信号/光信号」。这里面涉及编码、时钟恢复、均衡等一堆模拟电路的东西。FPGA一般不直接处理这些,而是外接一个PHY芯片。
MAC层则是FPGA的主战场。你要实现:
- 帧的组装与解析:按照前面讲的帧结构,把数据打包或拆包
- 地址过滤:判断收到的帧是不是发给自己的
- CRC校验:保证数据完整性
- 流量控制:防止接收端被数据淹没
避坑指南:我曾经在项目中把MAC层的流量控制逻辑写错了,导致发送端疯狂重传,把整个网络的带宽都吃掉了。后来排查了三天才发现是PAUSE帧的处理时序有问题。所以,流量控制这块一定要仔细验证。
千兆以太网的时钟频率是125MHz(对于GMII),数据位宽8位。如果你用RGMII,时钟频率不变,但数据在时钟的双沿采样。这个细节在FPGA时序约束时要特别注意,我习惯在约束文件里明确标注DDR模式。
好了,这一章的内容就到这里。千兆以太网的基础概念先铺垫到这,后面我们会一步步深入到具体的FPGA实现中去。