一、课程导论与以太网基础
大家好,我是你们的FPGA讲师。做网络通信这块,掐指一算也有十来年了。今天咱们开始《千兆以太网MAC层FPGA实现》这门课。第一讲,我想先带大家把地基打牢。
说实话,以太网这东西,你天天用,但真要自己用FPGA实现一个MAC控制器,很多人第一反应是「从哪下手?」。别急,咱们一步步来。
1.1 千兆以太网概述
千兆以太网,也就是我们常说的Gigabit Ethernet,简称GE。它跑在1000Mbps,也就是1Gbps的速率上。你可能觉得现在都25G、100G了,学这个是不是过时了?
我个人不这么看。千兆以太网是基础中的基础。你想想看,很多SoC、交换芯片、基站设备,内部互联还是用RGMII或者SGMII接口,跑的就是千兆。我当年做第一个项目,就是给某款国产交换芯片写MAC层逻辑,踩了不少坑。从那以后,我对千兆以太网的理解才算真正到位。
千兆以太网的标准是IEEE 802.3ab(铜缆)和802.3z(光纤)。它向下兼容100M和10M,但咱们课程主要聚焦在1000M模式。
1.2 OSI模型与MAC层定位
OSI七层模型,大家应该都背过。但做FPGA实现,我们最关心的是下面两层:物理层(PHY)和数据链路层(MAC)。
MAC层,全称是Media Access Control,介质访问控制。它负责什么?说白了就三件事:
- 帧的封装与解封装——把上层下来的数据包上MAC头尾,或者反过来拆掉
- 差错检测——通过CRC32校验,判断帧有没有传错
- 介质访问控制——半双工时用CSMA/CD,全双工时直接怼
我刚开始做的时候,总把MAC层和PHY层的分工搞混。后来有个老工程师跟我说了一句:「MAC管帧,PHY管比特」。嗯,这句话我记到现在。
下面这张图,是我自己画的MAC层在OSI模型中的位置,以及它和上下层的关系:
1.3 以太网帧结构详解
帧结构,这是咱们实现MAC层最核心的东西。你写代码的时候,脑子里必须时刻清楚:当前处理的是帧的哪个字段。
标准的以太网帧(IEEE 802.3)长这样:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 前导码(Preamble) | 7 | 0x55重复7次,用于接收端时钟同步 |
| 帧起始定界符(SFD) | 1 | 0xD5,标志帧正式开始 |
| 目的MAC地址 | 6 | 接收方MAC地址 |
| 源MAC地址 | 6 | 发送方MAC地址 |
| 长度/类型 | 2 | ≤1500表示长度,≥1536表示类型(如0x0800为IP) |
| 数据载荷 | 46~1500 | 上层协议数据,不足46字节需填充 |
| 帧校验序列(FCS) | 4 | CRC32校验,覆盖目的MAC到数据字段 |
这里有个细节,很多人容易忽略:帧间隙(Interframe Gap, IFG)。千兆以太网要求帧与帧之间至少间隔12字节的空闲时间。为什么?因为接收端需要时间处理上一帧。我在一个项目里,就因为IFG没做够,导致接收端FIFO溢出,丢帧丢得我怀疑人生。
1.4 课程项目目标与开发环境介绍
咱们这门课,最终目标是:用FPGA实现一个完整的千兆以太网MAC层控制器。具体来说,包括:
- GMII/RGMII接口的发送与接收
- MAC帧的封装与解封装
- CRC32校验的硬件实现
- 流量控制(Pause帧)
- 与上层用户逻辑的AXI-Stream接口
开发环境方面,我推荐大家用:
- FPGA芯片: Xilinx Artix-7或Zynq-7000系列(便宜,资源够用)
- 开发工具: Vivado 2020.1以上版本
- 仿真工具: Vivado Simulator或ModelSim/Questa
- 硬件平台: 带RGMII接口的FPGA开发板 + 千兆PHY芯片(如RTL8211、KSZ9031)
没有开发板也没关系。咱们的代码都是可综合的,仿真就能跑。我当年学的时候,就是纯仿真把整个MAC逻辑调通的。后来上板一次点亮,那种感觉,嗯,挺爽的。
好了,第一讲就到这里。内容不多,但都是基础中的基础。下一讲,咱们开始动手写代码——先从GMII接口的时序开始。
公众号:蓝海资料掘金营,微信deep3321