本项目是基于Xilinx Artix7 XC7A35T芯片
以太网芯片选用的是RTL8211EG PHY芯片 MAC 和PHY接口标准是GMII
开发工具是vivado 2018.3

本期讲解以太网的发送代码。

注意这里发送是指从FPGA开发板发送到PC端

8125B支持esxi吗_fpga

第一段代码不用过多解释了,注释已经标注得很详细了。其中4字节校验就是指FCS。

8125B支持esxi吗_数字通信_02


第二部分我们能够看出,这其实不是注释所说的IP包头,严格来说这是MAC帧的格式,前导码加上MAC的起始和目的地址,然后8x0800表明了MAC帧的上层协议是IP协议,具体如下图:

8125B支持esxi吗_8125B支持esxi吗_03


值得注意的这里MAC目标地址的6个字节写入的全是ff,这是通过广播寻找目的地址的意思,具体原理在我的另一篇文章:基于Xilinx artix 7的FPGA高级应用(二):千兆以太网通信(原理篇) 第二期补充 里面这里贴一下链接

8125B支持esxi吗_数字通信_04


发送程序,我们首先按照IP头格式发送IP包头数据。这里我们用一个个32位的寄存器把包头数据分为了好几个部分,IP协议的总体结构如下:

8125B支持esxi吗_8125B支持esxi吗_05


在第一个寄存器中,这里版本号选的是IPV4,其编码是0010在16进制中就是4,然后首部长度的单位是4字节,这里5*4字节=20字节。接下来服务类型我们全填入0;后面16位是整个IP数据包的总长度。

接下来在第二个寄存器中,前16位是包序列号,因为在传送数据包时,我们经常将其分片传输(这个对TCP协议影响不大,因为它本身就分片传输),这个序列号能帮我们唯一地识别被分片的IP数据包。

接下来16位有3位标志位和13位片位移:用于IP数据报分片。
三位标志位:该字段第1bit不使用,第2bit是DF(Don’t Fragment)位,DF位设为1时表明IP不对该数据包分片。第3bit是MF(More Fragments)位,当对数据包分片时,除了最后一片外,其他每个组成数据报的片都要把此位设为1。
13位片偏移:用于IP数据报分片。单位为8字节。表示该片相对于原始数据报开始处的位置,能表示的最大偏移为2132
13 *8=65536字节。
这里我们看到后面16位统一用了4000来表示,那么展开后就是0100000000000000,前三位表示了此IP数据包不分片,后面则对应了——不分片那么片偏移肯定为0.

在3号寄存器中,包含生存时间,协议还有首部校验和。
这里面写入80110000,首先80展开是10000000也就是128,生存时间是每经过一个路由器减1,到0的到时候,这个数据包就会被丢弃。后面11展开是00010001也就是17,代表着IP数据包的上层是UDP数据包(1表示ICMP协议,2表示IGMP协议,6表示TCP协议)。
首部校验和这里全部置0.

下一个寄存器和再下一个寄存器中先后放入源IP地址和目的IP地址,注意这个目的IP地址是要广播到整个局域网的。

接下来一个寄存器严格来说已经不属于IP包头,而是属于UDP协议的内容了,当然整个UDP包是包含在IP数据包的数据部分,所以也可以说是IP数据包的一部分。先来看UDP格式:

8125B支持esxi吗_网络通信_06


在6号和7号寄存器中我们完成了UDP包头,至此基本完成了数据的包装。

8125B支持esxi吗_数字通信_07


这个时候我们要计算包头的校验和:

8125B支持esxi吗_数字通信_08


这样我们就理解了之前为什么将首部校验和全置0了。

以上我们完成的工作,实际上都是装配数据包,而没有开始发送数据。

接下来我们开始正式发送数据包:

8125B支持esxi吗_8125B支持esxi吗_09


首先使能GMII端口,然后将校验功能复位。紧接着开始将前导码和开始码发送,然后开始发送源和目的MAC地址,然后注意这时候开启了CRC校验,关于CRC校验的东西有些多,我会再写一篇文章讲解,这里先不做介绍。

8125B支持esxi吗_fpga_10


在这里我们发送了事先准备好的IP数据包头,然后在这里将RAM中待发送的数据送入最后真正发送的数据的缓冲区。这里值得注意的是,由于受到GMII口的限制,每次发数据都是以八位为单位。之前我们说过程序将UDP包头也写入了名为IP header的寄存器,所以这里也已经完成了UDP数据包头的发送。

8125B支持esxi吗_fpga_11


此处开始从缓冲区读取真正需要发送的数据来传输。这里蕴含一个FPGA程序书写的习惯,也就是计数器溢出时的操作会先写在前面,就像上图的代码块,我们一开始进行的下面的操作,知道计数器快要溢出才进行上面的操作,也就是传输最后的数据包。

8125B支持esxi吗_数字通信_12


最后是CRC校验,这个我们会另开一个博客专门讲 CRC、FCS以及IP包头UDP包头的校验位。

本次的分享就到这里了,本人并非网络通信方向专业人士,如有错误请大家在评论区指出!

谢谢观看!