FPGA以太网电路
以太网PHY支持以太网,提供MII/GMII/RGMII接口的MAC连接。
以太网物理层:PHY,PHY是物理接口的收发器。PHY在发送数据的时候,收到MAC过来的数据,将并行数据转化为串行数据,再按照物理层的编码规则将数据编码,再变为模拟信号将数据发送出去。接收数据流程相反。
网卡包括OSI模型两个层,物理层和数据链路层,物理层定义了数据发送和接收所需要的电与光信号,线路状态,时钟校准,数据编码和电路,并向数据链路层提供标准接口。 数据链路层则提供寻址机构,数据帧的构建,数据差错检测,传送控制,向网络层提供标准数据接口。
网卡两个功能:将电脑数据封装成帧,并通过网线将数据发送到网络上去;接收网络上其他设备发送过来的帧,将数据重新组合,发送到所在电脑。
MAC: 以太网MAC 帧协议
多路访问控制协议(multiple access control protocol):MAC。
在局域网中,硬件地址又称为物理地址或者MAC地址(因为物理地址用于MAC帧中)
TCP/IP通信中使用包含MAC地址、IP地址、端口号等信息作为地址标识.
以太网是目前最流行的一种局域网组网技术。以太网中传输的数据帧格式:
SFD标识帧的开始 , FCS帧校验序列
在物理层上看,一个完整物理层以太网帧有7个字段,后五个字段是真正的以太网数据,包含了目的地址和源地址。网卡接收数据时候,将目的地址和自身MAC地址作比较,判断是否接收此数据包。
在以太网帧中,目的MAC地址分为三类,单播地址,多播地址和广播地址。
UDP协议介绍
user datagram protocol 用户数据包协议UDP,是OSI开放式系统互联 参考模型中一种无连接的传输层协议。
提供面向事务的简单不可靠信息传送服务,UDP当报文发送后,无无法得知是否安全完整到达的。
UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络流量压缩数据包的形式。一个典型数据包就是一个二进制数据的传输单位,每一个数据包的前八个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
IP数据报格式
IP是TCP/ip协议族中最核心的协议,TCP、UDP数据都是以IP数据包的格式传输。
ip数据报的格式如下,数据报的长度/类型值为0x0800,数据和填充 为ip报文头部和ip报文数据。
UDP数据报格式:
UDP数据分为首部 和 用户数据部分,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中。
UDP报文包括UDP报文首部数据和 UDP报文数据,其中UDP首部有八个字节,四个字段组成。
源端口: 源端口号对方回信时使用
目的端口: 交付报文时用到。
长度: UDP的数据报长度。
校验和: :检测 UDP 数据报在传输中是否有错,有错则丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段全为 0。
UDP 协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP 和TCP 协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将 UDP 数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
当传输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP数据报通过相应的端口,上交给应用进程。如果接收方 UDP 发现收到的报文中的目的端口号不正确(不存在对应端口号的应用进程),就丢弃该报文,并由ICMP 发送“端口不可达”差错报文给对方。
以太网 UDP 帧发包接口 FPGA 实现
以太网 UDP 帧的用户数据是打包在 UDP 协议中,而 UDP 协议又是基于 IP协议之上的,IP 协议又是走 MAC 层发送的,即从包含关系来说:MAC 帧中的数据段为 IP 数据报文,IP 报文中的数据段为 UDP 报文,UDP 报文中的数据段为用户希望传输的数据内容,如“Hello, welcome to FPGA!”。
-
将“Hello,welcome to FPGA!”内容打包进 UDP 数据报;
-
将 UDP 协议打包成 IP 数据报
-
将 IP 数据报打包进以太网帧发送单元(MAC 层),组织成标准 MAC 帧后发送。
UDP 以太网帧里面包括 3 个校验字段,IP 报文头部检验字段、UDP 头部校验字段和以太网报文的校验字段 FCS。
IP 头部检验 IPchecksun 与 IP 头部的数据有关,在 IP 头部数据改变(比如目的 IP 等数据改变)的时候,这个校验和也是需要重新进行计算的。
UDP 头部校验是可选字段,该字段可以直接填充全零,表示不进行校验,考虑设计的简单性,后面的设计就直接忽略 UDP 头部检验,直接将该字段填充全零。
以太网报文最后字段 FCS 与整个报文的数据都有关系,不管报文哪个数据发生变化,这个校验和 FCS 字段都需要重新进行计算。
IP 头部检验 IPchecksum的计算
发送端发送数据时具体 checksum 计算步骤如下。
-
把校验和字段(check sum)置为 0;
-
对 IP 头部中的每 16bit 进行二进制求和;
-
如果和的高 16bit 不为 0,则将和的高 16bit 和低 16bit 反复相加,直到和的高 16bit 为 0,从而获得一个 16bit 的值;
-
将该 16bit的值取反,即为最终计算的 check sum值,存入校验和字段。
以太网报文的校验字段 FCS 的计算:CRC冗余循环校验
以太网报文校验字段 FCS 采用的是 CRC32 计算,关于 CRC 计算的 Verilog代码实现已经做的很成熟,网上也有可直接生成 CRC计算 Verilog代码的网站。
以太网报文发送模块实现
UDP 帧根据格式包括前导码+帧界定符、以太网头部数据、IP 头部数据、UDP 头部数据、UDP数据、FCS 数据。根据格式对 UDP 帧发送的设计的状态机转移图如下。
IDLE:空闲状态
TX_PREAMBLE:发送以太网的 7 个字节的前导码和 1 字节的帧首定界符状态
TX_ETH_HEADER:发送以太网头部数据状态
TX_IP_HEADER:发送 IP 头部数据状态
TX_UDP_HEADER:发送 UDP 头部数据状态
TX_UDP_DATA:发送 UDP 数据状态
TX_FILL_DATA:发送填充数据状态,当需要发送的有效数据的长度比较小的时候,导致以太网帧的数据段小于 46 字节就需要用 0 来填充到 46字节,该状态就是用来应对这种情况下,发送填充 0 相应个数的 0 来满足以太网帧数据段长度要求。
TX_CRC:发送 FCS 校验数据状态
以太网 MAC 层接口介绍
GMII 转 RGMII 模块设计
RJ45接口通常用于数据传输,最常见的应用为网卡接口。