部分 参考https://www.cnblogs.com/571328401-/p/13268689.html
以太网是指遵守 IEEE 802.3 标准组成的局域网,由 IEEE 802.3 标准规定的主要是位于参考模型的物理层(PHY)和数据链路层中的介质访问控制子层(MAC)。
国际标准化组织(ISO)将整个以太网通信结构制定了 OSI (Open System Interconnection)模型,译为开放式系统互联。OSI 定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即 OSI 开放互连系统参考模型。每个层功能不同,网络通信中各司其职,整个模型包括硬件和软件定义。 OSI 模型只是理想分层,一般的网络系统只是涉及其中几层。在一定程度上参考了 OSI 模型后,产生了 TCP/IP 协议。TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。在 TCP/IP 协议中,OSI 七层参考模型被简化为五层。
- 数据包格式的协议
要发送的数据是加载在UDP协议中,UDP协议又是加载在IP协议中,IP协议加载在MAC协议中,是一种层层包含的关系,下面对MAC、IP、UDP协议一一详细讲解。
[MAC协议]MAC 子层是属于数据链路层的下半部分,它主要负责与物理层进行数据交接,如是否可以发送数据,发送的数据是否正确,对数据流进行控制等。它自动对来自上层的数据包加上一些控制信号,交给物理层。接收方得到正常数据时,自动去除 MAC 控制信号,把该数据包交给上层。
1)前导码(Preamble):实现底层数据的正确阐述,物理层使用 7 个字节同步码(0和1交替(55_55_55_55_55_55_55))实现数据的同步。
2)帧起始界定符:一个字节,固定为(0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
3)目的MAC地址:六个字节,表明帧的接受者(电脑的MAC地址)。
4)源MAC地址:六个字节,表明帧的发送者(板子的MAC地址,一般为自己设置一个地址)。
5)长度/类型:两个字节,长度/类型具有两个意义,当着连个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议、0x0806代表ARP协议等。
6)数据:以太网中的数据段长度最小 46 字节,最大1500个字节。最大值1500称为以太网的最大传输单元,之所以闲置最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其他数据帧等待的时间就会加长,导致体验变差。
7)帧校验序列(FCS):四个字节,为了保证数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。
值得注意的地方:以太网相邻两帧之间的时间间隔,即帧间隙(IFG)。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并未接收下一帧做准备的时间。不管是10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最小间隔时间计算方法如下:
10Mbit/s 最小时间为 :96 * 100ns = 9600ns;
100Mbit/s最小时间为 :96 *10ns = 960ns;
1000Mbit/s最小时间为:96 * 1ns = 96ns;
[IP协议]IP数据报前 20 个字节是固定的,IP首部的每一行以32位(4个字节)为单位。
1)版本:4位IP版本号,设置为0x4时,表示 IPv4,设置为0x6,表示IPv6,目前使用较多的IP协议版本号是IPv4。
2)首部长度:4位首部长度,表示IP首部一共有多少个32位。在没有可选字段时,IP首部长度为20个字节,因此首部长度的值为0x5。
3)服务类型:8位服务类型,一般设置为全零,8’h00。
4)总长度:16位,IP首部长度 + UDP首部长度 + 数据部分的长度(如:IP首部长度固定为 20个字节 + UDP首部长度为 8个字节 + 数据部分的字节数)。
5)标识:16位,用来标识主句发送的每一份数据报,通常每发一份报文它的值就会加1。(也可以设置为0)
6)标志字段:3位,第一位为保留为;第二位表示禁止分片(1表示不分片,0表示分片);第三位表示更多分片。(也可以设置为0)
7)片偏移:13位,在接收方进行数据报重组时用来标识分片的顺序。(也可以设置为0)
8)生存时间:8位,防止丢失的数据包在无休止的传播,一般被设置为64或者128。
9)协议:8位,表示此数据包所携带上层数据使用的协议类型,ICMP为1,TCP为6,UDP为17。
10)首部校验和:16位,该字段只校验数据报的首部,不包含数据部分,校验IP数据报头部是否被破坏、篡改和丢失等。
11)源IP地址:32位,即发送端的IP地址(板子的IP地址),一般为自己设置,如192.168.0.2。
12)目的IP地址:32位,即接收端的IP地址(电脑的IP地址),也可以自己设置,如192.168.0.3。在上板实验时,需将电脑上的IP改为自己设置的那个IP地址。
IP首部校验和的计算方法:
(1)将16位检核和字段置为0,然后将IP首部按照16位分成多个单元;
(2)将各个单元采用反码加法运算(即高位溢出会加到低位,通常的补码运算时直接丢掉溢出的高位);
(3)此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
(4)最后将得到的和的反码填入校验和字段;
如:0 - 31: 45_00_00_32
0 - 31: 00_00_00_00
0 - 31: 40_11_00_00
0 - 31 : c0_a8_00_02
0 - 31 : c0_a8_00_03
(a)0x4500 + 0x0032 +0x0000 +0x0000 +0x4011 +0x0000 + 0xc0a8 +0x 0002 + 0xc0a8 +0x0003 = 0x20698
(b)0x0002 + 0x0698 = 0x0698
(c)0x0000 + 0x0698 = 0x0698
(d)ip_checksm = ~0x0698 = 0xf967
[UDP协议]传输层有两种传输协议:基于字节流的 TCP 协议、基于报文流的 UDP 协议。两种协议各有优缺点,应用于不同场景。TCP 协议是面向连接的流传输协议,可以保证数据传输的完整、有序,是可靠协议,常用在对数据完整性和正确性要求较高的场合,如文件传输。占用资源较 UDP 多,速度较 UDP 慢;UDP 协议则是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,因为无需连接,传输速度较 TCP 快,占用资源量较TCP 少,适合实时数据的传输,如视频通话。使用 FPGA 实现 TCP 协议传输并非不可能,但占用逻辑量较大,设计较为复杂,我们使用较为简单的 UDP 协议。
1)源端口号:16位发送端端口号,用于区分不同服务的端口。
2)目的端口号:16位接收端端口号。
3)UDP长度:16位UDP长度,包含UDP首部长度 + 数据长度,单位是字节;(如,UDP首部长度 8 个字节 + 传输的数据字段的字节数)
4)UDP校验和:16位UDP校验和,在大多数情况下设置 0x0000
-
接口
RMII接口可以用于千兆以太网,但它更多地被设计用于百兆以太网应用。对于需要更高速度的千兆以太网应用,GMII接口是更常见的选择。
[接口信号]
(1)GTX_CLK:发送时钟信号,由FPGA中的PLL产生发送给以太网芯片,频率为 125MHz;
(2)TX_EN:发送数据使能信号,高电平有效;
(3)TX_ER:发送错误信号,高电平有效,用以破坏数据包的发送,这个信号有些博文中设置为零,但是有条件的话还是设置一下,这个信号挺有用的;
(4)TXD:发送数据线,FPGA通过该数据线将需要发送的数据依次发送给PHY芯片;
(5)RX_CLK:由PHY芯片产生,125MHz;
(6)RX_EN:接收使能信号,高电平有效;
(7)RX_ER:接收错误信号,高电平有效;
(8)RXD:接收数据线,FPGA通过该数据线从PHY接收数据;
[接口时序]
这个GMII模式的千兆网的发送时序,在TX_EN为高电平时,在时钟的上升沿发送数据给以太网芯片,在千兆网中,发送数据是先发高位,再发低位; -
代码实现
[硬件平台]
【待补充】