从近似0基础开始FPGA开发 -- part.7 FPGA的网络通信设计 UDP 网络通信FPGA的工程应用离不开通信功能当前电子学场景泛用的通信方式为以太网通信大规模的工程化项目基本离不开组网场景。因此本文从以太网为引展开介绍如何通过FPGA纯逻辑实现网络通信。以太网是一种传输规则收发双方必须遵循这些规则才能使数据有效传输。OSIOpen System Interconnection七层模型和 TCP/IP 四层模型是常用的数据传输模型其各个子层的功能如下表所示。数据从上至下逐级封装加入每层的头部信息在物理层转换为比特流发送接收端使用逆向顺序把数据逐级解封装发送给应用层。FPGA 的 UDP 通信只做到了传输层物理层一般由外部 PHY 芯片提供没有应用层、表示层和会话层。物理层以太网物理层是 OSI 模型中的第一层它负责数据的编码、解码、数模转换和数据在物理介质上的传输等。在 10Mbps、100Mbps 和 1Gbps 速率的以太网中通常采用 RJ45 网口和双绞线作为物理介质传输数据RJ45连接器是一种 8 针连接器提供 4 对提供信号输出。在 10Mbps./100Mbps 速率下使用了其中 4 根线在 1Gbps速率下使用了全部 8 根线。千兆以太网传输的数据由外部 PHY 芯片提供编解码和数模转换功能。千兆以太网的数据链路层和物理层之间一般采用RGMII 接口连接其接口连接示意图如下这一层一般为FPGA芯片与外部PHY芯片的交接界面这里提供开发板原理图的PHY芯片引脚作为参考。对应的信号线均会给到FPGA。RGMII接口采用双沿采样的方案相比 GMII接口减少了I/O数量从而减小了PCB的面积和布线难度降低了成 本。RGMII接口的控制信号被多路复用CTL信号复用了ER和EN信号上升沿传输EN信号下降沿传输EN信号与ER信号的异或结果。万兆以太网的内部逻辑则通过 XGMII接口与FPGA芯片内部的SERDES连接。XGMII接口的数据位宽为32位SERDES提供PMA和PCS子层其结构包括锁相环、串并转换器、预加重电路、均衡器、时钟恢复电路等万兆网的数据经过SERDES进行64/66B的编码通过10.3125Gbps的速率发出经过光模块进行光电转换后采用光纤作为物理介质进行传输。本文着重介绍千兆以太网的 UDP协议栈实现。RGMII与XGMII*RGMII 是 FPGA 中 MAC 与千兆 PHY 之间的低引脚数并行接口通过 4 bit DDR 125 MHz 实现 1Gbps而XGMII 是高速以太网 MAC 与 PCS 之间的宽并行接口常见于 10GbE通过宽数据总线承载数据和控制字符再由 PCS/SerDes 转换成高速串行信号。如下给出两种不同协议的典型FPGA设计架构。RGMII使用 4 bit 数据总线 DDR在一个时钟周期的上升沿和下降沿各传输一次数据125 MHz × 4 bit × 2 edges 1 GbpsXGMII结合接口版本和 IP 架构来看尤其是 FPGA 10G Ethernet IP 中常见的是 64-bit XGMII 156.25 MHz64 × 156.25 MHz ≈ 10 Gbps项目RGMIIXGMII典型速率10/100/1000M10G典型连接MAC ↔ PHYMAC ↔ PCS数据宽度4 bit DDR常见64 bit SDR千兆时钟125 MHz156.25 MHz是否使用控制信息有有典型 FPGA IO普通IOGT PCS相关逻辑常见物理接口RJ45SFP是否需要 SERDESPHY内部完成FPGA GT/PCS完成设计难点RGMII skewPCS/GT/64b66b/CDR本次UDP工程使用开发板外部RJ45接口进行1Gbps速率设计因此对RGMII的传输时序进行具体展开RGMII_TX一个 8 bit 数据Data D[7:0]通过TXD[3:0]会分两次发送TXC ↑ → D[3:0]TXC ↓ → D[7:4]例如Data 8b1010_0110上升沿TXD 0110下降沿TXD 1010由于采用了DDR编码RGMII 中的TX_CTL可以同时承担TX_EN及TX_ERTXC ↑TX_CTL TX_ENTXC ↓TX_CTL TX_EN XOR TX_ERRGMII_RXRXC ↑ → RXD[3:0] 低4位RXC ↓ → RXD[3:0] 高4位在上下沿接受数据后重新组合为RX_DATA[7:0]由于DDR在时钟上下沿均会对数据信号进行采样在实际 FPGA 设计中RGMII 最容易出问题的地方不是数据宽度而是Clock 和 Data 的相位关系。因为 FPGA 和 PHY 之间存在PCB 走线延迟、FPGA IO 延迟、PHY IO 延迟、时钟偏移、setup/hold 时间等不确定因素。如果数据变化太靠近时钟边沿就可能产生setup violationhold violation进而导致偶发 CRC 错误丢包UDP 数据异常TCP 重传网络不稳定因此 RGMII 通常需要约束好 clock skew / clock delay。以太网帧格式数据在以太网中传输时需逐层封装或拆解以添加或过滤上各层协议对应的首部。UDP 数据帧的结构和封装顺序如图所示用户数据经过 UDP 层、IP 层、MAC 层分别添加了 8 字节 UDP 头部、20 字节 IP 头部、22 字节 MAC头部和 4 字节 CRC 校验结果再经过 PHY 层传出完整的一帧数据。在了解了物理层后继续向上介绍数据链路层。数据链路层以太网 MAC 层在网络通信中起着至关重要的作用它负责数据的封装与拆包、传输控制、错误检测与纠正功能确保数据在网络中正确传输和有效处理。MAC 数据帧格式如下图所示其包头包含前导码、SFD、目的 MAC 地址、源 MAC 地址、类型/长度最后 4 个字节为 CRC 校验位。下图为典型的 Ethernet II Frame格式。前导码7Byte用于调整时钟使收发节点的时钟同步接收端通过识别前导码来确定数据帧的边界以确保接收端能够准确地提取出完整的数据帧。内容为连续 7 字节的 8’h55。帧起始定界符 SFD1Byte用于区分前导段和数据段确保后续数据的正确解析。内容为 8’hd5。DST/SRCMAC 地址6ByteMAC 地址由 48bit 数据组成它是网卡的物理地址一般固化在网卡的 ROM 中。在以太网传输的最底层就是根据 MAC 地址来发送数据同一个网络里不能有两个相同的 MAC 地址。MAC 地址的前 3个字节是组织唯一标识符用于标识网络硬件制造商后 3 个字节是制造商为网卡分配的序列号。类型/长度2Byte该区域可以用来表示 MAC 数据包下一层的类型也可以用来描述 MAC 数据包数据段的长度。该值小于 1536 表示长度大于 1536 表示类型IPv4 协议对应的数值为 0x0800ARP 协议为 0x0806。FCS4ByteFCS错误检测码是用于检测数据帧在传输过程中是否发生错误的一个字段它通过 CRC循环冗余校验算法计算得出并附加在数据帧的尾部。发送数据时会根据数据内容生成简短的校验和并将其与数据一起发送。接收数据时将再次生成的校验和并将其与发送的校验和进行比较。如果二者相等则数据没有损坏。每一帧传输完成后都必须等待 96bit 数据传输的时间即最小帧间隔IFG才可以进行下一次以太网帧的传输。由于以太网每个时钟周期发送 8bit 数据所以最小帧间隔为 12 个时钟周期。PAUSE流量控制帧*在任何通信形式的两端发送端的发送速率如果大于接受端的接受处理速率都会导致通信异常。因此在通信架构下设计反压机制十分重要在以太网下也存在这样的设计即流量控制帧。目的 MAC6BytePAUSE 帧的目的为保留的组播地址其值为固定的 48’h01_80_c2_00_00_01。TYPE2Byte固定值为 16’h8808表示帧类型为 MAC 控制帧。OPCODE2Byte操作码值为 16’h0001表示 MAC 控制帧中的 PAUSE 帧。TIME2Byte时间参数它的值表示以太网以当前速率传输 512bit 数据的时间接收方实际暂停的时间为该字段数值左移 6 位得到的值乘时钟周期。补充数据有效信息后补 0补齐 MAC 帧所需要的最小数据数量。PAUSE帧仅用于全双工以太网链路。在半双工模式下流量控制通过强制碰撞等机制实现。同时PAUSE帧作为链路层协议不会被路由器转发只在直连设备间生效。标准PAUSE帧会暂停链路上的所有流量无论其优先级高低。Tri Mode Ethernet IP对于数据链路层这种通用性极强的FPGA设计Xilinx也提供了封装好的IP。网络层MAC 数据帧经过数据链路层传输到网络层时前导码、SFD、MAC 地址、类型/长度以及校验字节均被过滤IP 数据包传入了网络层。该数据包也不完全是有效数据其还包含 20 字节的 IP 头部具体见下图。IP 头部各区域功能如下版本4bit定义 IP 协议版本IPV4 为 4’h4。首部长度4bit定义 IP 数据包头部长度表示具有 32 位字长数据的数量。最小值为 5最大值为 15。服务类型8bit用于分配优先级、延迟、吞吐量及可靠性一般为 8’h00。总长度16bit定义整个 IP 数据包长度。标识8bit发完一包数据自动加 1。标记3bit最高位保留为 0中间位是否开启分段0 不开启1 开启最低位表示是否存在下一个分段0表示为最后一个分段1 表示还存在下一个分段。一般默认为 3’b010。分段偏移13bit表示分段数据在源数据报中的相对位置。生存时间8bit表示以太网数据包可以中转进过多少个路由器每进过一个路由器该值就会减少 1直到该值变成 0丢包该包。WIN 系统默认为 8’h80。协议8bit指出 IP 处理过程完成后传输层的协议。UDP 为 8’d17TCP 为 8’d6ICMP 为 8’d1。首部校验和16bit该区域确保 IP 协议头部的完整性。将头部每 16 位划分为一部分将各部分相加取得的结果再取反码即为该区域数据。源地址32bit源主机 IP 地址。目的地址32bit目的主机 IP 地址。IP TXIP RXARPAddress Resolution Protocol*既然从数据链路层再上一级就是网络层了那么ARP又是做什么的ARP的主要功能是管理IP地址-MAC地址的映射。例如FPGA192.168.1.100想要给目标IP192.168.1.10 发送UDP首先FPGA会查询本地的ARP Cache如果在本地的ARP Table中检索到MAC映射信息则直接组包发送如果没有查到192.168.1.10则会对外发送ARP Request在Wireshark中抓包可以看到“Who has 192.168.1.10Tell 192.168.1.100”这种报文PC在收到该报文后会回复“192.168.1.10 is xx:xx:xx:xx:xx:xx”FPGA在收到后会更新本地的ARP Cache然后才会进行正式发送。当然实际工程中 ARP 和 IPv4 通常不是严格的串联关系而是共同连接到 Ethernet MAC。硬件类型2Byte硬件地址的类型以太网的硬件类型为 1。协议类型2Byte上层协议类型IP 的协议类型为 16’h0800。硬件地址长度1Byte硬件地址MAC 地址的长度以字节为单位其值固定为 8’h06。协议地址长度1ByteIP 地址的长度以字节为单位固定值 8’h04。OPCODE2Byte操作码值为 16’h0001 表示 ARP 请求值为 16’h0002 表示 ARP 应答。源 MAC 地址6Byte发送方的 MAC 地址。源 IP 地址4Byte发送方的 IP 地址。目的 MAC 地址6Byte发送 ARP 请求时为广播地址 48’hff_ff_ff_ff_ff_ff发送 ARP 应答时为接收方的 MAC地址。目的 IP 地址4Byte接收端的 IP 地址。在PC上cmd指令arp -a所查看的即是 ARP Cache。ICMPInternet Control Message Protocol*ICMP协议主要用于IP网络中的控制、错误报告和诊断即常用的ping指令。在IPv4下ICMP的Protocol 1UDP为17TCP为6。当网络设备能ping通时即可证明以下通信路径正常工作PHY 基本正常RGMII/XGMII 基本正常MAC RX/TX 基本正常MAC 地址基本正常ARP 基本正常IPv4 RX/TX 基本正常ICMP RX/TX 基本正常。因此Ping 是非常好的 FPGA Ethernet 基础功能验证手段。FPGA 网络协议栈总览在了解了以太网相关的知识后即可有明确的FPGA设计框架这篇文章属于临时起意从工程角度出发不能通信的设备肯定不是好设备所以先准备打通上位机到开发板之间的通信链路吧。这一篇内容已经比较多了下一篇再介绍代码落地吧。Fin