一、队伍介绍
本参赛队队名为“Supernova”,报名编号:CICC2796。本篇为第六篇分享帖。在本项目由于我们需要使用PC实时的向FPGA发送将要识别的图片,所以我们最终选择使用以太网来从PC向FPGA发送图片并暂存在DDR中,下面是对以太网协议和硬件实现的一些介绍。
二、前言
以太网是目前应用最广泛的局域网通讯方式,同时也是一种协议。以太网协议定义了一系列软件和硬件标准,从而将不同的计算机设备连接在一起。串口通信单次只传输一个字节,而以太网通信是以数据包的形式传输,其单包数据量达到几十,甚至成百上千个字节。下图为以太网通过UDP传输单包数据的格式,可以看出,以太网的数据包就是对各层协议的逐层封装来实现数据的传输。本项目实现内容主要包括MAC层即数据链路层,IP层即网络层,UDP/TCP层即传输层这三种层次。
MAC层主要包括前导码、帧起始界定符、目的MAC地址、源MAC地址、长度/类型、要传输的数据和帧校验序列,具体内容如下图所示:
IP协议是TCP/IP协议的载体,IP协议规定了数据传输时的基本单元和格式。其位于以太网MAC帧格式的数据段,IP协议内容由IP首部和数据字段组成。所有的TCP、UDP及ICMP数据都以IP数据报格式传输,主要包括版本:4位IP版本号、首部长度、服务类型、总长度、标识字段、片偏移、生存时间、协议类型、首部校验和、源IP地址、目的IP地址与可选字段。IP数据包格式如图所示。
UDP协议提供一种基本的、低延迟的被称为数据报的通讯。数据报就是一种自带寻址信息,从发送端走到接收端的数据包。UDP 协议经常用于图像传输、网络监控数据交换等数据传输速度要求比较高的场合。UDP 报头由4 个域组成,其中每个域各占用 2 个字节,具体包括UDP源端口号、目的端口号、数据报长度和校验和。UDP 协议使用端口号为不同的应用保留其各自的数据传输通道。数据发送一方将UDP 数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。 数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分。数据报的最大长度根据操作环境的不同而各异。报头中的校验值用来保证数据的安全。UDP数据格式如下图所示:
TCP协议是面向连接的、可靠的流协议,提供可靠的通信传输。TCP数据包包括源、目标端口号字段、顺序号字段、确认号字段、头部长度字段、标志位字段、窗口大小字段、TCP校验和字段、紧急指针字段和选项字段。其中标志位字段又分为:URG紧急指针、ACK确认序号、PSH、RST重建连接、SYN发起连接、FIN结束标志。TCP连接的建立需要进行3次握手,每次传输数据也需要一次应答确认数据收到,断开连接双方需要进行4次挥手。如图所示:
在本开发板上提供有以太网PHY芯片KSZ9031RNX, PHY在发送数据的时候,接收MAC发过来的数据,把并行数据转化为串行流数据,按照物理层的编码规则把数据编码转换为模拟信号发送出去,收数据时的流程反之。当给网卡接入网线的时候,PHY芯片会通过自动化协商功能来确定两个设备的连接苏速度、双工模式、是否采用流控等。FPGA 和PHY之间有一个RGMII接口。RGMII是GMII的简化版,数据位宽为2位,在1000Mbps传输速率下,时钟频率为125Mhz。
PHY芯片KSZ9031RNX可使用SMI接口来配置其内部寄存器,完成对网速、双工模式、是否数据回环等选项的设置,当需要对发出的数据进行测试时,就通过SMI接口将PHY芯片配置为数据回环模式,tx端发送的数据会通过rx端返回,用来观察发出的数据是否正确。
本项目设计的以太网通信部分主要分为6个模块,具体为UDP模块,TCP server 模块,MAC TX模块,MAC RX模块,Trans模块。具体结构图如图所示:
UDP模块用来将需要发送的数据添加报文头封装为UDP报文,然后发送给MAC层,也负责将接收到的UDP报文提取出数据供FPGA其他模块使用,TCP server模块负责TCP协议的建立连接、数据传输、结束连接等功能,可将用户数据封装为TCP报文,发送给MAC层,也可接收MAC传输来的TCP报文并获取其中的数据。server端用于被动接收连接。本文所设计的以太网接口可同时支持多个UDP,,TCP server同时通信,MAC层TX和RX接口共用一个,多个模块同时发送数据时,Trans模块负责数据的缓冲,将待发送数据一个一个传输至TX端,Trans模块也用于将MAC接收的数据分发。以太网MAC模块位于最底层,分为接收RX和发送TX两个部分,主要用来实现上文所述的IP协议和MAC层协议。TX部分接收上层发来的UDP或TCP报文,将其添加IP头并封装为一个完整的以太网帧后由RMII接口发出。RX部分接收PHY芯片侧发送来的以太网数据,将其解析为一个完成的以太网报文,之后去除MAC层和IP层部分,由报文中的端口信息决定具体分配至上层哪个端口模块。
为了验证以太网接口的正确性,本项目使用wireshark软件和NetAssist网络调试助手来进行调试,wireshark可捕获网口发出的报文,观察发出的报文是否正确,网络调试助手可设置为UDP通信模式和TCP client模式,用来与FPGA进行通信,其中client用于连接server。测试内容为在PC端通过UDP,TCP client这两个接口与FPGA进行通信,设置PC端IP为192.168.1.100,FPGA端IP为192.168.1.254。FPGA将接收的数据在发回PC端,实现回环。其中TCP server和TCP client模块需要先建立连接,之后才能发送数据。测试结果如下图所示,可见以太网功能正确实现。
四、总结
这次主要完成了在黑金XC7A200T开发板上以太网通讯协议的硬件实现,同时和大家分享一些以太网通讯相关的内容。