导言
之前就说过要出Alexforencich以太网开源代码教程,与其说是教程不如说是笔记,本次专题多篇发送,本篇主要记录一些基础知识以及教大家如何恢复工程,后续主要以rgmii为例分模块进行仿真,从总体上把握代码并且学会使用。如果这些笔记能帮助刚入门的朋友对我来讲也算好事了。文章中如出现错误,也欢迎大家与我交流。后续也有计划出官方IP的教程。
1基础知识
什么是TCP/IP?TCP/IP协议定义了网络通信的过程,定义了数据单元的格式和基本内容,为了便于计算机能够正确接收和提取收到的消息。TCP/IP以及相关的协议构成了一套在TCP/IP网络中如何处理、传输和接收数据的完整系统,整个相关的协议TCP/IP协议被称为协议簇。在了解TCP/IP模型和相关层的协议前,我们先了解OSI模型和TCP/IP模型。
关于OSI模型和TCP/IP四层模型
针对网络协议体系有个标准的7层模型,称为“开放系统互连”,即我们熟知的OSI,这是ISO(国际标准化组织)为了标准化网络协议系统所做出的规范,旨在提高网络互连性,并且方便软件开发人员以一种开放方式来使用协议标准。OSI作为比较复杂模型,很多设计过于理想,不是很方便实现,OSI和TCP/IP模型具有类似的目标,尽管TCP/IP(4层模型)没有严格遵守ISO模型,但他们仍然具有一定的兼容性,各个层间具备一定的“对应”。如下图:
OSI模型
-
物理层:把数据转换为传输介质上的电子流或模拟脉冲,并且监视数据的传输。 -
数据链路层:提供与网络适配网络适配器相连的接口,维护子网的逻辑链接。 -
网络层:支持逻辑寻址与路由选择。 -
传输层:为网络提供错误控制和数据流控制。 -
会话层:在计算机的通信应用程序之间建立会话。 -
表示层:把数据转换为标准格式,管理数据加密与压缩。 -
应用层:为应用程序提供网络接口,支持文件传输、通信等功能的网络应用。
TCP/IP的四个层:
TCP/IP协议簇的名字来源于TCP(一个传输层协议)和IP(一个网际层/网络层协议),即应用层,传输层,网络互联层,网络接口层中的2个来命名整体协议。
「网络接口层」 这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网络互联层。(我们熟知的以太网标准属于这一层,对应的OSI是物理层和数据链路)
「网络互联层」(IP层) 该层包括以下协议:IP(网际协议)、ICMP(Internet Control Message Protocol,因特网控制报文协议)、ARP(Address Resolution Protocol,地址解析协议)、RARP(Reverse Address Resolution Protocol,反向地址解析协议)。该层负责相同或不同网络中计算机之间的通信,主要处理数据报和路由。在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用于报告差错和传送控制信息。IP协议在TCP/IP协议组中处于核心地位。
「传输层」 该层提供TCP(传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,它提供更加复杂的流量控制和错误控制,TCP能够确保发送的数据更加可靠,由于有额外的检测和流量控制机制,其速度慢于UDP。UDP提供简单的无连接服务,比TCP快,但不可靠,它把错误机制推给了应用层。简单讲,如果需要可靠的传输,则使用TCP,需要快速数据流,使用UDP。传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。
「应用层」 TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向用户提供一组常用的应用层协议,其中包括:Telnet、SMTP、DNS等。此外,在应用层中还包含有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。
总结:网络协议体系有OSI模型和TCP/IP模型,这两个模型具备一定的对应性,常用TCP/IP模型,这些模型的各个层,包含各种协议,这些协议构成整个传输协议体系。
以太网
前面写过,以太网对应OSI模型的两个层,物理层和数据链路层。从宏观上讲,以太网主要为这两个部分实现,数据链路层,即用以太网常说的MAC(媒体接入控制器)来实现,物理层中电路主要使用单独的PHY芯片来实现,由于MAC是纯数字,所以一般集成在主控芯片中,PHY由于集成较多的模拟电路,所以一般使用单独的芯片来实现,也就是我们熟知的以太网PHY芯片(这里只是说常见是PHY芯片,但也有不少是集成的)。
物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口(RGMII / GMII / MII)。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。
物理层
IEEE 802.3 标准定义了三个组成 PHY 的主要功能块或子层。这些层包括物理编码子层,简称 PCS。PCS 的主要功能是对数据进行编码和解码。例如,100BASE-TX 会将来自 MAC 接口并准备通过网络传输的4位数据编码为 5 位数的块代码(4b/5b)。因此,通过此通道传输的实际数据速率将是 125 兆位/秒。使用4b/5b块代码有助于在接收器处恢复时钟。物理介质连接子层简称 PMA,具备将位映射至符号、确定链路状态、恢复时钟和检测错误事件等功能。物理介质相关子层简称 PMD,它实现的功能允许 PHY 以物理方式连接到网络,铜缆和光纤均可。每个层都既包含发送路径,也包含接收路径。PCS 块负责接收和传回数据。PHY 中总是包含 PMA 功能, 但可能不包含 PMD 功能。这是由 MAC 支持的以太网标准的版本所决定。在某些版本的标准中,PMD 功能包含在 PMA 中。无论如何,这些块都是用于连接到物理介质的接口。它们提供的服务可以在接收路径将电信号或光信号转化为位,并在发送路径将位转换为电信号或光信号。
MII
MII即媒体独立接口,它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口。数据接口包括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII数据接口总共需要16个信号。管理接口是个双信号接口:一个是时钟信号,另一个是数据信号。通过管理接口,上层能监视和控制PHY。
RMII是简化的MII接口,在数据的收发上它比MII接口少了一倍的信号线,所以它一般要求是50兆的总线时钟。RMII一般用在多端口的交换机,它不是每个端口安排收、发两个时钟,而是所有的数据端口公用一个时钟用于所有端口的收发,这里就节省了不少的端口数目。RMII的一个端口要求7个数据线,比MII少了一倍,所以交换机能够接入多一倍数据的端口。和MII一样,RMII支持10兆和100兆的总线接口速度。
SMII是由思科提出的一种媒体接口,它有比RMII更少的信号线数目,S表示串行的意思。因为它只用一根信号线传送发送数据,一根信号线传输接受数据,所以在时钟上为了满足100的需求,它的时钟频率很高,达到了125兆,为什么用125兆,是因为数据线里面会传送一些控制信息。SMII一个端口仅用4根信号线完成100信号的传输,比起RMII差不多又少了一倍的信号线。SMII在工业界的支持力度是很高的。同理,所有端口的数据收发都公用同一个外部的125M时钟。
GMII是千兆网的MII接口,这个也有相应的RGMII接口,表示简化了的GMII接口。
RGMII时序
因为本系列主要以RGMII为例,所以简单讲一下时序。RGMII 使用 4bit 数据接口采用上下沿 DDR(Double Data Rate)的方式在一个时钟周期内传输 8bit 数据信号, 即上升沿发送或者接收数据的低 4 位[3:0],下降沿发送或者接收数据的高 4 位[7:4]。如下图的接收和传输时序图:
关于TX_CTL/RX_CTL信号定义种类比较多,大家可以看标准手册查看具体定义,一般情况我们关注2种情况,即上升沿和下降沿TX_CTL/RX_CTL均为1,则认为是正常传输,没有发生错误。如果TX_CTL/RX_CTL在时钟上升沿为1,下降沿为0,则认为数据发生错误。
RGMII 规定时钟和数据将由发送源同时生成,这需要在时钟和数据之间引入偏移(如上图)。可以通过 PCB 走线或发送/接收节点的内部延迟来实现偏移,以实现标准规定的接口时序要求(如下图RGMII2.0的时序)。
2恢复工程
2.1源文件介绍
关于源文件的基本介绍以及仓库地址,参阅“FPGA/IC优质开源项目(一)”一文,仓库地址我也贴到此处:
https://github.com/alexforencich/verilog-ethernet.git
2.2手动恢复
下载源码,进入example目录下,根据自己的板子选择例程,例如Kintex7(KC705的板子),选择rgmii,也可以根据自己板子接口选择其他的,进入fpga目录,用编辑器打开Makefile,即可看见该项目需要的文件,自己建立工程综合即可。
2.3Win环境安装Cywin执行makefile恢复工程
参阅“如何通过makefile实现Vivado自动化编译”文章,注意在环境中添加Vivado路径。如果在example/KC705/rgmii/fpga目录下执行make all出现错误,则用编辑器打开makefile文件把路径中eth路径全部换成../../../..注意执行make all会最后执行下载调试,建议把makefile里面的program命令删除,否则最后还是会有报错。
2.4Linux直接恢复
在Linux下恢复是最方便的,亦安也推荐大家使用Linux环境进行开发,执行cd命令进入开源目录,进入KC705,进入rgmii,进入fpga目录,执行make all命令,如果出现错误,处理方法如上。
总结
后续会继续出模块仿真的文章,也欢迎大家和我讨论数字相关的问题。
参考文献
-
ADI模拟对话53-03(2019年3月期刊)作者:Volker E. Goller -
TCP/IP入门经典【美】Joe Casad 著(第5版) -
TI,以太网PHY简介 -
TI,RGMII时序 -
赛灵思官网文档:PG292 -
赛灵思官网文档:PG210 -
赛灵思官网文档:PG211 -
米联FPGA 以太网 UDP 通信方案(PL)
没有回复内容