1)实验平台:正点原子开拓者FPGA 开发板
2)摘自《开拓者FPGA开发指南》关注官方微信号公众号,获取更多资料:正点原子
3)全套实验源码+手册+视频下载地址http://www.openedv.com/docs/index.html
![9255b79aa5b276e925e9901c46f68934.png](https://i-blog.csdnimg.cn/blog_migrate/536513e4aaaa511105b2f6821a4c5f22.png)
第四十三章 以太网通信实验
以太网(Ethernet)是当今现有局域网采用的最通用的通信协议标准,该标准定义了在局域
网中采用的电缆类型和信号处理方法。以太网凭借其成本低、通信速率高、抗干扰性强等优点
被广泛应用在网络远程监控、交换机、工业自动化等对通信速率要求较高的场合。本章我们将
使用FPGA开发板上的以太网接口完成上位机与FPGA通信的功能。
本章包括以下几个部分:
43.1 以太网简介
43.2 实验任务
43.3 硬件设计
43.4 程序设计
43.5 下载验证
以太网简介
以太网是一种产生较早,使用相当广泛的局域网。其最初是由Xerox(施乐)公司创建并
由Xerox、Intel和DEC公司联合开发的基带局域网规范,后来被电气与电子工程师协会(IEEE)
所采纳作为802.3的标准。
以太网的分类有标准以太网(10Mbit/s),快速以太网(100Mbit/s)和千兆以太网
(1000Mbit/s)。随着以太网技术的飞速发展,市场上也出现了万兆以太网(10Gbit/s),它
扩展了IEEE802.3协议和MAC规范,使其技术支持10Gbit/s的传输速率。然而在实际应用中,标
准以太网和快速以太网已经能够满足我们的日常需求,对通信速率要求较高的场合,才会用到
千兆以太网。
以太网通信离不开连接端口的支持,网络数据连接的端口就是以太网接口。以太网接口类
型有RJ45接口,RJ11接口(电话线接口),SC光纤接口等。其中RJ45接口是我们现在最常见的
网络设备接口(如:电脑网口),我们开发板使用的就是这种接口。
RJ45接口俗称“水晶头”,专业术语为RJ45连接器,由插头(接头、水晶头)和插座(母
座)组成,属于双绞线以太网接口类型。RJ45插头只能沿固定方向插入,设有一个塑料弹片与
RJ45插槽卡住以防止脱落。
RJ45接口样式如图 43.1.1所示:
![26ee4c08f83e0ee4eda6beb0e2fcd280.png](https://i-blog.csdnimg.cn/blog_migrate/59e99a251fa65846511893fd4f80987e.png)
图 43.1.1 RJ45插头(左)、插座(右)
RJ45接口定义以及各引脚功能说明如图 43.1.2所示,在以太网中只使用了1、2、3、6这
四根线,其中1、2这组负责传输数据(TX+、TX-),而3、6这组负责接收数据(RX+、RX-),
另外四根线是备用的。
![c0ef81ef46bdeca9226152302013c2e0.png](https://i-blog.csdnimg.cn/blog_migrate/548d436ba30ed094cb21637f39f70f52.png)
图 43.1.2 RJ45插座接口定义
以太网是目前应用最广泛的局域网通讯方式,同时也是一种协议。以太网协议定义了一系
列软件和硬件标准,从而将不同的计算机设备连接在一起。我们知道串口通信单次只传输一个
字节,而以太网通信是以数据包的形式传输,其单包数据量达到几十,甚至成百上千个字节。
下图为以太网通过UDP(User Datagram Protocol,用户数据报协议)传输单包数据的格式,
从图中可以看出,以太网的数据包就是对各层协议的逐层封装来实现数据的传输。这里只是让
大家了解下以太网数据包的格式,后面会逐个展开来讲。
![db5efb65d62e346a4785911a8c643383.png](https://i-blog.csdnimg.cn/blog_migrate/82e6fce3d39ab8bd6c0a46010738c392.png)
图 43.1.3 以太网包数据格式
以太网MAC帧格式
以太网技术的正式标准是IEEE 802.3,它规定了以太网传输数据的帧结构,我们可以把以
太网MAC层理解成高速公路,我们必须遵循它的规则才能在上面通行,以太网MAC层帧格式如图
1.4所示。
![595520f1c2376f68429a5e051d644c2a.png](https://i-blog.csdnimg.cn/blog_migrate/4315ca027350d6f213b91552f98a28e0.png)
图 43.1.4 以太网帧格式
以太网传输数据时按照上面的顺序从头到尾依次被发送和接收,我们下面进一步解释各个
区域。
前导码(Preamble):为了实现底层数据的正确阐述,物理层使用7个字节同步码(0和1
交替(55-55-55-55-55-55-55))实现数据的同步。
帧起始界定符(SFD,Start Frame Delimiter):使用1个字节的SFD(固定值为0xd5)来
表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
目的MAC地址:即接收端物理MAC地址,占用6个字节。MAC地址从应用上可分为单播地址、
组播地址和广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用
于标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于
标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志
同一网段中的所有设备。
源MAC地址:即发送端物理MAC地址,占用6个字节。
长度/类型:上图中的长度/类型具有两个意义,当这两个字节的值小于1536(十六进制为
0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网
中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地
址解析协议)等。
数据:以太网中的数据段长度最小46个字节,最大1500个字节。最大值1500称为以太网的
最大传输单元(MTU,Maximum Transmission Unit),之所以限制最大传输单元是因为在多个
计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会
加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红
灯的人一定不愿意的。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因
素,因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置,通常以太网的有
效数据字段小于1500个字节。
帧检验序列(FCS,Frame Check Sequence):为了确保数据的正确传输,在数据的尾部
加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太
网帧头开始即不包含前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC
CCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。
在这里还有一个要注意的地方就是以太网相邻两帧之间的时间间隔,即帧间隙(IFG,
Interpacket Gap)。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来
恢复并为接收下一帧做准备的时间,IFG的最小值是96 bit time,即在媒介中发送96位原始数
据所需要的时间,在不同媒介中IFG的最小值是不一样的。不管10M/100M/1000M的以太网,两
帧之间最少要有96bit time,IFG的最少间隔时间计算方法如下:
10Mbit/s最小时间为:96*100ns = 9600ns;
100Mbit/s最小时间为:96*10ns = 960ns;
1000Mbit/s最小时间为:96*1ns = 96ns。
接下来我们介绍IP协议以及它和以太网MAC层的关系。在介绍IP协议之前,我们先了解下
TCP(传输控制协议)/IP(网际协议)协议簇。TCP/IP是网络使用中最基本的通信协议,虽然
从名字看上去TCP/IP包括两个协议,TCP和IP,但TCP/IP实际上是一组协议,它包括上百个各
种功能的协议,如:TCP、IP、UDP、ICMP(网际控制报文协议)等。而TCP协议和IP协议是保
证数据完整传输的两个重要的协议,因此TCP/IP协议用来表示Internet协议簇。
TCP/IP协议不仅可以运行在以太网上,也可以运行在FDDI(光纤分布式数据接口)和WLAN
(无线局域网)上。反过来,以太网的高层协议不仅可以是TCP/IP协议,也可以是IPX协议(互
联网分组交换协议)等,只不过以太网+TCP/IP成为IT行业中应用最普遍的技术。下面我们来
熟悉下IP协议。
IP协议
IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP协议的载体,IP协议规定了数据传输时
的基本单元和格式。从前面介绍的图 43.1.3中可以看出,IP协议位于以太网MAC帧格式的数据
段,IP协议内容由IP首部和数据字段组成。所有的TCP、UDP及ICMP数据都以IP数据报格式传输,
IP数据包格式如图 43.1.5所示。
![c13c04bb6d6c9e8b2870ef217f354e57.png](https://i-blog.csdnimg.cn/blog_migrate/8eabaf6df17e09fc769df253fc5af5bd.png)
图 43.1.5 IP数据报格式
前20个字节和紧跟其后的可选字段是IP数据报的首部,前20个字节是固定的,后面可选字
段是可有可无的,首部的每一行以32位(4个字节)为单位。
版本:4位IP版本号(Version),这个值设置为二进制的0100时表示IPv4,设置为0110时
表示IPv6,目前使用比较多的IP协议版本号是4。
首部长度:4位首部长度(IHL,Internet Header Length),表示IP首部一共有多少个32
位(4个字节)。在没有可选字段时,IP首部长度为20个字节,因此首部长度的值为5。
服务类型:8位服务类型(TOS,Type of service),该字段被划分成两个子字段:3位优
先级字段(现在已经基本忽略掉了)和4位TOS字段,最后一位固定为0。服务类型为0时表示一
般服务。
总长度:16位IP数据报总长度(Total Length),包括IP首部和IP数据部分,以字节为单
位。我们利用IP首部长度和IP数据报总长度,就可以知道IP数据报中数据内容的起始位置和长
度。由于该字段长16bit,所以IP数据报最长可达65535字节。尽管理论上可以传输长达65535
字节的IP数据报,但实际上还要考虑网络的最大承载能力等因素。
标识字段:16位标识(Identification)字段,用来标识主机发送的每一份数据报。通常
每发送一份报文它的值就会加1。
标志字段:3位标志(Flags)字段,第1位为保留位;第2位表示禁止分片(1表示不分片
0:允许分片);第3位标识更多分片(除了数据报的最后一个分片外,其它分片都为1)。
片偏移:13位片偏移(Fragment Offset),在接收方进行数据报重组时用来标识分片的
顺序。
生存时间:8位生存时间字段,TTL(Time To Live)域防止丢失的数据包在无休止的传播,
一般被设置为64或者128。
协议:8位协议(Protocol)类型,表示此数据报所携带上层数据使用的协议类型,ICMP
为1,TCP为6,UDP为17。
首部校验和:16位首部校验和(Header Checksum),该字段只校验数据报的首部,不包
含数据部分;校验IP数据报头部是否被破坏、篡改和丢失等。
源IP地址:32位源IP地址(Source Address),即发送端的IP地址,如192.168.1.123。
目的IP地址:32位目的IP地址(Destination Address),即接收端的IP地址,如
192.168.1.102。
可选字段:是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入
值为0的填充字节,保证IP首部始终是32bit的整数倍。
以上内容是对IP首部格式的详细阐述,还需要补充的内容是IP首部校验和的计算方法,其
计算步骤如下:
1、将16位检验和字段置为0,然后将IP首部按照16位分成多个单元;
2、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢
掉溢出的高位);
3、此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
4、最后将得到的和的反码填入校验和字段。
例如,我们使用IP协议发送一个IP数据报总长度为50个字节(有效数据为30个字节)的数
据包,发送端IP地址为192.168.1.123,接收端IP地址为192.168.102,则IP首部数据如下:
![0b7444879f6250c9e3d6ea995a9272b5.png](https://i-blog.csdnimg.cn/blog_migrate/c16e19483dbc7534e3613d5227b323da.png)
图 43.1.6 IP首部数据
按照上述提到的 IP 首部校验和的方法计算 IP 首部校验和,即:
1、 0x4500 + 0x0032 + 0x0000 + 0x4000 + 0x4011 + 0x0000(计算时强制置0) + 0xc0a8 + 0x017b
+ 0xc0a8 + 0x0166 = 0x24974
2、 0x0002 + 0x4974 = 0x4976
3、 0x0000 + 0x4976 = 0x4976(此种情况并未出现进位)
4、 check_sum = ~0x4976(按位取反) = 0xb689
到此为止IP协议内容已经介绍完了,我们从前面介绍的图 43.1.3可以知道,UDP的首部和
数据位于IP协议的数据段。既然已经有IP协议了,为什么还需要UDP协议呢?为什么我们选择
的是UDP还不是传输更可靠的TCP呢?带着这些疑问我们继续往下看。
UDP协议
首先回答为什么还需要UDP协议?事实上数据是可以直接封装在IP协议里而不使用TCP、
UDP或者其它上层协议的。然而在网络传输中同一IP服务器需要提供各种不同的服务,各种不
同的服务类型是使用端口号来区分的,例如用于浏览网页服务的80端口,用于FTP(文件传输
协议)服务的21端口等。TCP和UDP都使用两个字节的端口号,理论上可以表示的范围为0~65535,
足够满足各种不同的服务类型。
然后是为什么不选择传输更可靠的TCP协议,而是UDP协议呢?TCP协议与UDP协议作为传输
层最常用的两种传输协议,这两种协议都是使用IP作为网络层协议进行传输。下面是TCP协议
与UDP协议的区别:
1、TCP协议面向连接,是流传输协议,通过连接发送数据,而UDP协议传输不需要连接,是数据报协议;
2.TCP为可靠传输协议,而UDP为不可靠传输协议。即TCP协议可以保证数据的完整和有序,
而UDP不能保证;
3.UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;
4.应用场合:TCP协议常用在对数据文件完整性较高的一些场景中,如文件传输等。UDP常
用于对通讯速度有较高要求或者传输数据较少时,比如对速度要求较高的视频直播和传输数据
较少的QQ等。
首先可以肯定的告诉大家,使用FPGA实现TCP协议是完全没有问题的,但是,FPGA发展到
现在,却鲜有成功商用的RTL级的TCP协议设计,大部分以太网传输都是基于比较简单的UDP协
议。TCP协议设计之初是根据软件灵活性设计的,如果使用硬件逻辑实现,工程量会十分巨大,
而且功能和性能无法得到保证,因此,TCP协议设计并不适合使用硬件逻辑实现。UDP协议是一
种不可靠传输,发送方只负责数据发送出去,而不管接收方是否正确的接收。在很多场合,是
可以接受这种潜在的不可靠性的,例如视频实时传输显示等。
UDP数据格式如图 43.1.7所示:
![569da27c1d5b75950af08340453b450c.png](https://i-blog.csdnimg.cn/blog_migrate/57fa4abb3f610b27c86f2c9368b466c8.png)
图 43.1.7 UDP数据格式
UDP首部共8个字节,同IP首部一样,也是一行以32位(4个字节)为单位。
源端口号:16位发送端端口号,用于区分不同服务的端口,端口号的范围从0到65535。
目的端口号:16位接收端端口号。
UDP长度:16位UDP长度,包含UDP首部长度+数据长度,单位是字节(byte)。
UDP校验和:16位UDP校验和。UDP计算校验和的方法和计算IP数据报首部校验和的方法相
似,但不同的是IP数据报的校验和只检验IP数据报的首部,而UDP校验和包含三个部分:UDP伪
首部,UDP首部和UDP的数据部分。伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达
目的地,只是单纯为了做校验用的。在大多数使用场景中接收端并不检测UDP校验和,因此这
里不做过多介绍。
以太网的帧格式、IP数据报协议以及UDP协议到这里已经全部介绍完了,关于用户数据、
UDP、IP、MAC四个报文的关系如下图所示:
![5cf9d321f20efe5fa8d99c3e3e1f31ad.png](https://i-blog.csdnimg.cn/blog_migrate/b7c8872efa7816eb6e9f75547e7c4e29.png)
图 43.1.8 以太网包数据格式
用户数据打包在UDP协议中,UDP协议又是基于IP协议之上的,IP协议又是走MAC层发送的,
即从包含关系来说:MAC帧中的数据段为IP数据报,IP报文中的数据段为UDP报文,UDP报文中
的数据段为用户希望传输的数据内容。现在再回过头看图 43.1.8的内容是不是很好理解了呢?
前面介绍的内容全部都是和协议相关的,以太网通信如果只有协议,没有硬件芯片的支持
是不行的,这个硬件芯片就是以太网PHY芯片。PHY是物理接口收发器,它实现物理层IEEE 802.3
标准定义的以太网PHY,包括MII(媒体独立接口)/GMII(千兆媒体独立接口)等。
以太网PHY芯片
PHY在发送数据的时候,接收MAC发过来的数据(对PHY来说,没有帧的概念,都是数据而
不管什么地址,数据还是CRC),把并行数据转化为串行流数据,按照物理层的编码规则把数