一、课程导论与以太网基础

大家好,我是你们的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模式。

核心要点: 千兆以太网的物理层编码方式为8B/10B编码(光纤)或PAM-5编码(铜缆)。MAC层速率是125MHz,数据位宽8位(GMII模式)或4位(RGMII模式)。

1.2 OSI模型与MAC层定位

OSI七层模型,大家应该都背过。但做FPGA实现,我们最关心的是下面两层:物理层(PHY)和数据链路层(MAC)。

MAC层,全称是Media Access Control,介质访问控制。它负责什么?说白了就三件事:

  • 帧的封装与解封装——把上层下来的数据包上MAC头尾,或者反过来拆掉
  • 差错检测——通过CRC32校验,判断帧有没有传错
  • 介质访问控制——半双工时用CSMA/CD,全双工时直接怼

我刚开始做的时候,总把MAC层和PHY层的分工搞混。后来有个老工程师跟我说了一句:「MAC管帧,PHY管比特」。嗯,这句话我记到现在。

下面这张图,是我自己画的MAC层在OSI模型中的位置,以及它和上下层的关系:

OSI模型与MAC层定位 应用层 / 表示层 / 会话层 / 传输层 / 网络层 数据链路层(Layer 2) ├── 逻辑链路控制子层(LLC) └── 介质访问控制子层(MAC) ← 我们实现的部分 物理层(Layer 1) ├── 物理编码子层(PCS) └── 物理介质相关子层(PMA/PMD) 物理传输介质(双绞线 / 光纤) MAC层位于数据链路层下半部分,直接与物理层交互,负责帧的收发与控制

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到数据字段
小经验: 我刚开始写MAC接收模块时,总把前导码和SFD也算进帧长度里,结果CRC怎么都对不上。后来才意识到,FCS只校验从目的MAC开始到数据结束的部分。前导码和SFD是物理层的事,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逻辑调通的。后来上板一次点亮,那种感觉,嗯,挺爽的。

注意: 如果你用的是Vivado,记得在工程设置里把目标语言选为Verilog或SystemVerilog。咱们课程代码以Verilog为主,部分模块会用SystemVerilog的interface来简化连接。

好了,第一讲就到这里。内容不多,但都是基础中的基础。下一讲,咱们开始动手写代码——先从GMII接口的时序开始。


公众号:蓝海资料掘金营,微信deep3321