4、以太网协议基础:MAC帧格式、VLAN标签、IP/UDP协议、以太网PHY接口(GMII/RGMII/SGMII)
在FPGA上实现TSN(时间敏感网络)低时延数据转发模块,首先需要透彻理解以太网协议栈的底层结构。TSN的核心价值在于通过精确的时间同步和流量调度,将数据转发时延控制在微秒甚至亚微秒级别。而这一切的实现,都建立在FPGA对以太网帧的逐字节解析、字段提取和高速收发之上。本章将系统梳理MAC帧格式、VLAN标签、IP/UDP协议以及FPGA与PHY芯片之间的三种主流接口(GMII/RGMII/SGMII),为后续的TSN队列调度和门控机制打下坚实的协议基础。
上图展示了FPGA TSN转发模块中协议栈与PHY接口的整体映射关系。从底层PHY接口到MAC帧、VLAN标签、IP/UDP,每一层都有明确的字段定义和时序要求。FPGA设计的关键在于:在时钟节拍内完成多级流水线解析,同时保证线速处理能力。下面我们将逐层深入。
4.1 MAC帧格式:以太网数据链路层基石
4.1.1 核心原理:帧结构与最小/最大帧长约束
IEEE 802.3标准定义的MAC帧格式是FPGA解析逻辑的基本操作对象。一个完整的以太网帧包含:7字节前导码(用于时钟同步)、1字节帧起始定界符(SFD)、6字节目的MAC地址、6字节源MAC地址、2字节类型/长度字段、46-1500字节载荷数据以及4字节帧校验序列(FCS,使用CRC32算法)。FPGA在接收数据时,通常由PHY芯片负责剥离前导码和SFD,MAC层从目的MAC地址开始接收。
帧长约束是TSN设计必须关注的硬性指标:最小帧长64字节(不含前导码),最大帧长1518字节(标准帧)或1522字节(含VLAN标签)。如果接收到的帧小于64字节,则视为短帧(runt frame)直接丢弃;大于最大帧长则视为超长帧(jumbo frame),在标准以太网中同样丢弃。TSN流量的帧长分布直接影响门控调度的时间槽分配,例如一个125字节的帧在千兆速率下占用1μs传输时间,而一个1518字节的帧则需要12.144μs。
| 字段 | 长度(字节) | FPGA处理要点 | TSN相关影响 |
|---|---|---|---|
| 前导码 + SFD | 8 | PHY芯片剥离,MAC层不处理 | 用于接收时钟同步 |
| 目的MAC | 6 | 第一字节最低位为组播标志(bit0) | TSN组播流识别依据 |
| 源MAC | 6 | 用于MAC地址表学习 | TSN流过滤的辅助字段 |
| 类型/长度 | 2 | 值≥0x0600表示类型(如0x0800为IPv4) | 决定上层协议解析路径 |
| 载荷 | 46-1500 | 按字节流送入FIFO | TSN帧抢占时需支持帧片段重组 |
| FCS | 4 | CRC32校验,错误帧丢弃 | TSN要求低时延,校验需流水线化 |
4.1.2 判断方法:FPGA接收状态机设计
在FPGA中实现MAC帧接收,通常采用有限状态机(FSM)驱动。核心状态包括:IDLE(等待SFD)、DA(接收目的MAC)、SA(接收源MAC)、TYPE(接收类型字段)、DATA(接收载荷)、FCS(接收校验字段)。每个状态对应一个字节计数器,当计数值达到字段长度时自动跳转。关键设计决策是:FCS校验可以在接收完最后一个数据字节后立即开始计算,而不必等待整个帧接收完毕,这样可以节省一个帧的存储时间。
// 简化版MAC接收FSM状态跳转(Verilog伪代码)
always @(posedge clk) begin
case (state)
IDLE: if (rx_dv) state <= DA;
DA: if (byte_cnt == 5) state <= SA;
SA: if (byte_cnt == 5) state <= TYPE;
TYPE: if (byte_cnt == 1) state <= DATA;
DATA: if (byte_cnt == payload_len-1) state <= FCS;
FCS: if (byte_cnt == 3) state <= IDLE;
endcase
end
4.1.3 案例拆解:最小帧间隔(IFG)对TSN时延的影响
在千兆以太网中,帧间隔(IFG)为12字节(96ns)。对于TSN低时延转发,IFG是不可避免的固定开销。假设一个TSN流每125μs发送一个100字节的帧,则IFG占用的时间约为0.096μs,占比不到0.1%。但在极端情况下,如果TSN流需要发送大量小帧(如64字节),IFG开销占比将升至约15%。FPGA设计时,MAC层必须严格遵循IFG要求,否则会导致下游交换机丢弃帧。实际工程中,我们可以在MAC发送状态机中插入IFG计数器,确保相邻帧间隔不小于96ns。
4.2 VLAN标签:TSN流识别与优先级映射
4.2.1 核心原理:802.1Q标签结构与优先级编码
IEEE 802.1Q定义了VLAN标签,插入在源MAC地址和类型/长度字段之间,共4字节。其中TPID(Tag Protocol Identifier)固定为0x8100,用于识别该帧携带VLAN标签。TCI(Tag Control Information)包含3位PCP(Priority Code Point)、1位DEI(Drop Eligible Indicator)和12位VID(VLAN Identifier)。PCP字段是TSN实现优先级映射的关键——它定义了8个优先级等级(0-7),对应IEEE 802.1p的流量类别。
在TSN中,PCP值通常与802.1Qbv的门控队列直接关联。例如,PCP 7映射到最高优先级队列(队列7),用于时间关键流量;PCP 1映射到最低优先级队列(队列0),用于尽力而为流量。VID字段则用于区分不同的VLAN域,TSN流过滤(802.1Qci)可以基于VID+PCP+目的MAC的组合进行精确匹配。
4.2.2 操作流程:FPGA中的VLAN标签解析与插入
FPGA处理VLAN标签的典型流程如下:
- 接收方向:检测TPID是否为0x8100,若是则提取PCP、DEI、VID字段,并将这些信息作为旁路信号送入TSN流分类器;同时将帧载荷(不含VLAN标签)送入解析FIFO。
- 发送方向:根据TSN队列调度结果,在源MAC之后插入VLAN标签。PCP值由队列优先级决定,VID由配置寄存器提供。
- 双标签处理:若检测到TPID为0x88A8(QinQ),则需要解析两层VLAN标签,外层用于运营商网络,内层用于用户网络。
4.2.3 实战场景:基于PCP的TSN优先级映射
考虑一个工业控制场景:PLC通过TSN网络控制伺服驱动器。控制报文使用PCP 7(最高优先级),诊断报文使用PCP 3,配置报文使用PCP 1。FPGA内部的优先级映射表如下:
| PCP值 | TSN队列 | 流量类型 | 门控时间槽 |
|---|---|---|---|
| 7 | 队列7 | 时间关键控制流 | 每125μs周期分配20μs |
| 6 | 队列6 | 音视频流 | 每125μs周期分配30μs |
| 5-4 | 队列5-4 | 普通数据流 | 每125μs周期分配40μs |
| 3-0 | 队列3-0 | 尽力而为流量 | 剩余时间(35μs) |
该映射表通过FPGA内部的寄存器阵列实现,每个PCP值对应一个3位队列号。TSN门控调度器根据队列号查询门控列表(Gate Control List),决定该队列在特定时间槽是否允许发送。这种设计使得优先级映射灵活可配置,适应不同工业场景的需求。
4.3 IP/UDP协议:网络层与传输层解析
4.3.1 核心原理:IPv4头部与UDP头部关键字段
当MAC帧的类型字段为0x0800时,表示上层承载IPv4报文。IPv4头部固定20字节(不含选项字段),关键字段包括:版本号(4bit,固定为4)、头部长度(4bit,以4字节为单位)、总长度(16bit,含头部)、协议号(8bit,UDP为17)、源IP地址(32bit)、目的IP地址(32bit)。FPGA在解析时,通常只提取协议号和IP地址,用于TSN流分类和路由决策。
UDP头部固定8字节:源端口(16bit)、目的端口(16bit)、长度(16bit,含头部)、校验和(16bit,可选)。在TSN应用中,UDP端口号常被用作流识别标识。例如,某些TSN协议(如IEEE 1722)使用特定的UDP端口号来标识音视频流。FPGA解析UDP时,只需提取目的端口号即可完成流分类,无需校验UDP校验和(因为MAC层的FCS已经保证了帧完整性)。
4.3.2 判断方法:IP分片与TSN的冲突
IP分片是TSN需要特别注意的问题。当一个IP报文超过链路MTU(最大传输单元)时,路由器会将其分片为多个IP分片。每个分片都有独立的IP头部,但只有第一个分片包含UDP头部。对于TSN流识别,这意味着:
- 如果TSN流使用UDP端口号作为识别依据,则只有第一个分片能被识别,后续分片无法匹配流规则。
- TSN标准(802.1Qbv)要求时间关键流量不能被分片,否则会破坏时延确定性。
- FPGA设计时,应在IP层检测分片标志(MF位和片偏移字段),若发现分片且属于TSN流,则直接丢弃或上报异常。
4.3.3 案例拆解:UDP端口号在TSN流过滤中的应用
假设一个TSN网络需要同时传输三种流量:控制流(UDP端口5001)、视频流(UDP端口5002)、普通数据流(UDP端口任意)。FPGA内部的流过滤器配置如下:
// 流过滤规则配置(寄存器描述)
规则0: 目的MAC=01:00:5E:00:00:01, VLAN_PCP=7, UDP_DPORT=5001 → 队列7
规则1: 目的MAC=01:00:5E:00:00:02, VLAN_PCP=5, UDP_DPORT=5002 → 队列5
规则2: 默认规则 → 队列0
FPGA在解析完MAC帧、VLAN标签、IP头部和UDP头部后,将提取的字段与规则表进行并行比较。由于规则表通常存储在TCAM(三态内容寻址存储器)或分布式RAM中,比较操作可以在一个时钟周期内完成。匹配成功后,帧被送入对应的TSN队列,同时更新流统计计数器。该设计的关键在于:解析流水线必须在帧数据完全接收前完成头部提取,以便在帧尾到达时立即决定入队操作,避免额外的存储延迟。
4.4 以太网PHY接口:GMII/RGMII/SGMII对比与选型
4.4.1 核心原理:三种接口的时序与数据位宽
FPGA与PHY芯片之间的接口决定了数据吞吐量和引脚开销。三种主流接口的对比如下:
| 接口类型 | 数据位宽 | 时钟频率 | 数据速率 | 引脚数(数据+时钟) | 适用场景 |
|---|---|---|---|---|---|
| GMII | 8bit | 125MHz | 1Gbps | 18(8TX+8RX+2时钟) | FPGA资源充足,追求简单时序 |
| RGMII | 4bit(DDR) | 125MHz | 1Gbps | 10(4TX+4RX+2时钟) | 引脚受限,主流选择 |
| SGMII | 1bit(SerDes) | 1.25GHz | 1Gbps | 2(差分对) | 高速背板,引脚极少 |
GMII使用独立的8位发送/接收数据总线,每个时钟周期传输1字节,时序简单但引脚多。RGMII采用DDR(双沿采样)技术,在时钟上升沿和下降沿各传输4bit,因此只需4根数据线。SGMII则通过SerDes将数据串行化,使用1.25Gbps的差分信号传输,引脚最少但需要额外的PCS层处理。
4.4.2 操作流程:RGMII接口的FPGA实现要点
RGMII接口在FPGA实现中需要注意以下几点:
- 时钟延迟:RGMII规范要求接收时钟相对于数据延迟2ns(约90度相移)。FPGA内部通常使用IODELAY或PLL相位调整来实现。
- DDR采样:在时钟上升沿采样低4位,下降沿采样高4位。FPGA需要使用IDDR/ODDR原语来实现双沿采样。
- 控制信号:TX_CTL和RX_CTL信号在上升沿表示TX_EN/RX_DV,下降沿表示TX_ER/RX_ER。
- 千兆/百兆切换:RGMII支持10/100/1000Mbps自适应,时钟频率分别为2.5MHz/25MHz/125MHz。
// RGMII接收数据采样(Verilog伪代码)
IDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED")) u_iddr_rx (
.D(rx_data[0]), .C(rx_clk), .CE(1'b1),
.Q1(rx_data_low[0]), .Q2(rx_data_high[0])
);
// 在时钟上升沿采样低4位,下降沿采样高4位
4.4.3 实战场景:SGMII接口在TSN交换机背板中的应用
在TSN交换机设计中,SGMII接口常用于连接FPGA与PHY芯片,或者FPGA与FPGA之间的背板互连。考虑一个8端口TSN交换机,每个端口使用SGMII接口,FPGA只需16个引脚即可完成8个端口的连接,而如果使用GMII则需要144个引脚。SGMII的SerDes通道在FPGA内部需要经过GTX/GTH收发器,这些收发器提供了时钟数据恢复(CDR)功能,能够从串行数据流中恢复时钟。
在实际调试中,SGMII接口的常见问题是信号完整性。由于数据速率为1.25Gbps,PCB布线需要严格控制差分阻抗(100Ω±10%),并且需要交流耦合电容(0.1μF)。FPGA内部需要配置参考时钟(125MHz),并确保GTX收发器的TX/RX极性正确。如果出现链路不通,首先检查SGMII的自动协商结果,然后使用IBERT(集成误码率测试)工具验证物理层质量。
4.5 常见误区与总结复盘
4.5.1 误区一:忽略前导码和IFG的处理
很多初学者在FPGA设计中只关注MAC帧的有效载荷,而忽略了前导码和IFG。实际上,PHY芯片虽然剥离了前导码,但MAC层必须正确生成IFG。在TSN中,IFG的精确控制尤为重要——如果IFG过短,对端交换机可能将帧视为错误;如果IFG过长,则会浪费带宽,影响调度精度。FPGA设计时,应使用独立的IFG计数器,确保发送帧间隔精确为96ns(千兆速率)。
4.5.2 误区二:VLAN标签处理不当导致帧长计算错误
当帧携带VLAN标签时,帧长计算需要额外加上4字节。例如,一个标准最大帧1518字节,加上VLAN标签后变为1522字节。FPGA在计算FCS时,必须将VLAN标签纳入CRC计算范围。如果设计中将VLAN标签剥离后再计算FCS,会导致校验失败。正确的做法是:接收时先计算包含VLAN标签的FCS,然后剥离标签;发送时先插入标签,再计算FCS。
4.5.3 误区三:RGMII时钟相位调整不当
RGMII接口的时钟延迟是调试中最常见的问题。如果接收时钟与数据之间的相位关系不正确,会导致采样数据错误。FPGA中应使用IODELAY原语对接收时钟进行精细调整,调整步长通常为78ps(对应Vivado的IODELAY分辨率)。调试时,可以通过发送已知数据模式(如0x55)并检查接收数据来验证相位设置。
4.5.4 总结复盘:协议解析的流水线设计
在FPGA中实现TSN低时延转发,协议解析必须采用流水线架构。推荐的五级流水线如下:
- 第一级:MAC帧接收,提取目的MAC、源MAC、类型字段。
- 第二级:VLAN标签解析,提取PCP、VID,判断是否存在双标签。
- 第三级:IP头部解析,提取协议号、源/目的IP地址。
- 第四级:UDP头部解析,提取源/目的端口号。
- 第五级:TSN流分类,将提取的字段与规则表匹配,决定入队队列。
每一级流水线必须在8ns(千兆速率下)内完成,因此需要使用组合逻辑加寄存器切分。对于复杂的匹配操作(如TCAM查找),可以拆分为两个流水级。通过这种设计,FPGA可以实现线速处理,确保TSN流量的转发时延保持在微秒级。