【紫光同创国产FPGA教程】【第二十三章】千兆以太网传输...
本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.alinx.com)。适用于板卡型号:PGL22G1. 简介本实验将实现FPGA芯片和PC之间进行千兆以太网数据通信, 通信协议采用Ethernet UDP通信协议。 FPGA通过RGMII总线和开发板上的Gigabit PHY芯片通信, Gigabit PHY芯片把数据通过网线发给PC,程序中实现了ARP,UDP,PING功能,此外还实现了100/1000M自适应。2. 硬件介绍在开发板上通过1片RTL8211EG以太网PHY芯片为用户提供网络通信服务。以太网PHY芯片是连接到Pango FPGA的IO接口上。芯片支持10/100/1000 Mbps网络传输速率,通过RGMII接口跟FPGA进行数据通信。RTL8211EG支持MDI/MDX自适应,各种速度自适应,Master/Slave自适应,支持MDIO总线进行PHY的寄存器管理。当网口Link到千兆以太网时, FPGA通过RGMII总线和PHY芯片进行数据通信,当网口Link到百兆以太网时, FPGA通过MII总线和PHY芯片进行数据通信。另外FPGA可以通过MDI/MDIO管理接口来配置或读取PHY芯片内部的寄存器。在千兆的RGMII通信模式下(以U8为例), 发送数据时,发送时钟为125Mhz的E_GTXC信号, 数据为E_TXD, 数据有效信号为E_TXEN, E_TXC信号连接但没有使用; 接收数据时,接收时钟为125Mhz的E_RXC信号, 数据为E_RXC, 数据有效信号为E_RXDV。关于详细的管脚说明和RGMII/MII的通信时序,请大家参考RTL8211EG的芯片手册。硬件电路设计如下:https://pic4.zhimg.com/80/v2-04b886ec9cdbbf66af8c774858ff61c3_720w.jpg开发板网络部分电路关于详细的管脚说明和RGMII的通信时序,请大家参考相关芯片手册。3. 以太网帧3.1 以太网帧格式下图为以太网的帧格式:https://pic4.zhimg.com/80/v2-636c722d2e9d73db803201b1952ed443_720w.jpg前导码(Preamble):8字节,连续7个8’h55加1个8’hd5,表示一个帧的开始,用于双方设备数据的同步。目的MAC地址:6字节,存放目的设备的物理地址,即MAC地址源MAC地址:6字节,存放发送端设备的物理地址类型:2字节,用于指定协议类型,常用的有0800表示IP协议,0806表示ARP协议,8035表示RARP协议数据:46到1500字节,最少46字节,不足需要补全46字节,例如IP协议层就包含在数据部分,包括其IP头及数据。FCS:帧尾,4字节,称为帧校验序列,采用32位CRC校验,对目的MAC地址字段到数据字段进行校验。进一步扩展,以UDP协议为例,可以看到其结构如下,除了以太网首部的14字节,数据部分包含IP首部,UDP首部,应用数据共46~1500字节。https://pic3.zhimg.com/80/v2-86f0b1c35f3034dd7d1d8b511ce66e46_720w.jpg3.2 ARP数据报格式ARP地址解析协议,即ARP(Address Resolution Protocol),根据IP地址获取物理地址。主机发送包含目的IP地址的ARP请求广播(MAC地址为48’hff_ff_ff_ff_ff_ff)到网络上的主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后将IP地址和物理地址保存到缓存中,并保留一段时间,下次请求时直接查询ARP缓存以节约资源。下图为ARP数据报格式 。https://pic2.zhimg.com/80/v2-ca081d1c4a56a3f21463fb710b82f2f9_720w.jpg帧类型:ARP帧类型为两字节0806硬件类型:指链路层网络类型,1为以太网协议类型:指要转换的地址类型,采用0x0800 IP类型,之后的硬件地址长度和协议地址长度分别对应6和4OP字段中1表示ARP请求,2表示ARP应答例如:|ff ff ff ff ff ff|00 0a 35 01 fe c0|08 06|00 01|08 00|06|04|00 01|00 0a 35 01 fe c0|c0 a8 00 02| ff ff ff ff ff ff|c0 a8 00 03| 表示向192.168.0.3地址发送ARP请求。|00 0a 35 01 fe c0 | 60 ab c1 a2 d5 15 |08 06|00 01|08 00|06|04|00 02| 60 ab c1 a2 d5 15|c0 a8 00 03|00 0a 35 01 fe c0|c0 a8 00 02|表示向192.168.0.2地址发送ARP应答。3.3 IP 数据报格式因为UDP协议包只是IP包中的一种, 所以我们来介绍一下IP包的数据格式。下图为IP分组的报文头格式,报文头的前20个字节是固定的,后面的可变https://pic3.zhimg.com/80/v2-da68895ea4c1975a4d1b5f544a704052_720w.jpg版本:占 4 位,指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4)首部长度:占4位,可表示的最大数值是15个单位(一个单位为 4 字节)因此IP 的首部长度的最大值是 60 字节区分服务:占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过.1998 年这个字段改名为区分服务.只有在使用区分服务(DiffServ)时,这个字段才起作用.一般的情况下都不使用这个字段总长度:占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节.总长度必须不超过最大传送单元 MTU标识:占16位,它是一个计数器,用来产生数据报的标识标志(flag):占3位,目前只有前两位有意义MF标志字段的最低位是 MF (More Fragment)MF=1 表示后面“还有分片”。MF=0 表示最后一个分片DF标志字段中间的一位是 DF (Don't Fragment)只有当 DF=0 时才允许分片片偏移:占12位,指较长的分组在分片后某片在原分组中的相对位置.片偏移以 8 个字节为偏移单位生存时间:占8位,记为TTL (Time To Live) 数据报在网络中可通过的路由器数的最大值,TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64.发送 ICMP 回显应答时经常把 TTL 设为最大值 255协议:占8位,指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理过程, 1表示为 ICMP 协议, 2表示为 IGMP 协议, 6表示为 TCP 协议, 17表示为 UDP 协议首部检验和:占16位,只检验数据报的首部不检验数据部分,采用二进制反码求和,即将16位数据相加后,再将进位与低16位相加,直到进位为0,最后将16位取反。源地址和目的地址:都各占4 字节,分别记录源地址和目的地址3.4 UDP协议UDP是User Datagram Protocol(用户数据报协议)的英文缩写。UDP只提供一种基本的、低延迟的被称为数据报的通讯。所谓数据报,就是一种自带寻址信息,从发送端走到接收端的数据包。UDP协议经常用于图像传输、网络监控数据交换等数据传输速度要求比较高的场合。UDP协议的报头格式:UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:https://pic3.zhimg.com/80/v2-7681bff71c8c99adc1e45d8dac31f796_720w.jpg① UDP源端口号② 目标端口号③ 数据报长度④ 校验和UDP协议使用端口号为不同的应用保留其各自的数据传输通道。数据发送一方将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。虽然UDP提供有错误检测,但检测到错误时,错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。3.5 Ping功能ICMP是TCP/IP协议族的一个IP层子协议,包含在IP数据报里,用于IP主机、路由器之间传递控制消息。控制消息是指网络是否连通,主机是否可达等功能。其中ping功能采用回送请求和回答报文,回送请求报文类型为8’h08,回答报文类型为8’h00。https://pic3.zhimg.com/80/v2-801c85d0917a7773bc63c673da03c6f2_720w.jpghttps://pic4.zhimg.com/80/v2-588ff6422ea60d57416d52ba5f9aee0b_720w.jpg4. SMI(MDC/MDIO)总线接口串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟,由MAC端提供,在本实验中也就是FPGA端。在RTL8211EG文档里可以看到MDC的周期最小为400ns,也就是最大时钟为2.5MHz。https://pic4.zhimg.com/80/v2-10203183e816b479454e728dd997e873_720w.jpg4.1 SMI帧格式如下图,为SMI的读写帧格式:https://pic3.zhimg.com/80/v2-30543aee5075d66efda6390ef918ae6e_720w.jpg
名称说明
Preamble由MAC发送32个连续的逻辑“1”,同步于MDC信号,用于MAC与PHY之间的同步
ST帧开始位,固定为01
OP操作码,10表示读,01表示写
PHYADPHY的地址,5 bits
REGAD寄存器地址,5 bits
TATurn Around,MDIO方向转换,在写状态下,不需要转换方向,值为10,在读状态下,MAC输出端为高阻态,在第二个周期,PHY将MDIO拉低
DATA共16bits数据
IDLE空闲状态,此状态下MDIO为高阻态,由外部上拉电阻拉高
4.2 读写时序1)读时序
https://pic4.zhimg.com/80/v2-a49068771b88760f9dd0790487a3d84b_720w.jpg
可以看到在Turn Around状态下,第一个周期MDIO为高阻态,第二个周期由PHY端拉低。2)写时序
https://pic1.zhimg.com/80/v2-72cb1031f9a7ee1eaebd10f3d198a3f8_720w.jpg
为了保证能够正确采集到数据,在MDC上升沿之前就把数据准备好,在本实验中为下降沿发送数据,上升沿接收数据。5. 程序设计本实验以千兆以太网RGMII通信为例来设计verilog程序,会先发送预设的UDP数据到网络,每秒钟发送一次,如果FPGA检测网口发来的UDP的数据包,会把接收到的数据包存储在FPGA内部的RAM中,再不断的把RAM中的数据包通过网口发回到ethernet网络。程序分为两部分,分别为发送和接收,实现了ARP,UDP,Ping功能。以下为原理实现框图:https://pic4.zhimg.com/80/v2-dc796f20338f7def1b76d478334094bf_720w.jpg5.1 发送部分1)MAC层发送发送部分中, mac_tx.v为MAC层发送模块,首先在SEND_START状态,等待mac_tx_ready信号,如果有效,表明IP或ARP的数据已经准备好,可以开始发送。再进入发送前导码状态,结束时发送mac_data_req,请求IP或ARP的数据,之后进入发送数据状态,最后进入发送CRC状态。在发送数据过程中,需要同时进行CRC校验。https://pic3.zhimg.com/80/v2-f6b7cf897e75bdd836492456e75227f2_720w.jpg
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
crc_resultin32CRC32结果
crcenout1CRC使能信号
crcreout1CRC复位信号
crc_dinout8CRC模块输入信号
mac_frame_datain8从IP或ARP来的数据
mac_tx_reqin1MAC的发送请求
mac_tx_readyin1IP或ARP数据已准备好
mac_tx_endin1IP或ARP数据已经传输完毕
mac_tx_dataout8向PHY发送数据
mac_send_endout1MAC数据发送结束
mac_data_validout1MAC数据有效信号,即gmii_tx_en
mac_data_reqout1MAC层向IP或ARP请求数据
2)MAC发送模式工程中的mac_tx_mode.v为发送模式选择,根据发送模式是IP或ARP选择相应的信号与数据。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
mac_send_endin1MAC发送结束
arp_tx_reqin1ARP发送请求
arp_tx_readyin1ARP数据已准备好
arp_tx_datain8ARP数据
arp_tx_endin1ARP数据发送到MAC层结束
arp_tx_ackin1ARP发送响应信号
ip_tx_reqin1IP发送请求
ip_tx_readyin1IP数据已准备好
ip_tx_datain8IP数据
ip_tx_endin1IP数据发送到MAC层结束
mac_tx_readyout1MAC数据已准备好信号
ip_tx_ackout1IP发送响应信号
mac_tx_ackin1MAC发送响应信号
mac_tx_reqout1MAC发送请求
mac_tx_dataout8MAC发送数据
mac_tx_endout1MAC数据发送结束
3)ARP发送发送部分中,arp_tx.v为ARP发送模块, 在IDLE状态下,等待ARP发送请求或ARP应答请求信号,之后进入请求或应答等待状态,并通知MAC层,数据已经准备好,等待mac_data_req信号,之后进入请求或应答数据发送状态。由于数据不足46字节,需要补全46字节发送。https://pic4.zhimg.com/80/v2-ad15035466162a440c0f1695c87d39d3_720w.jpg
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
destination_mac_addrin48发送的目的MAC地址
source_mac_addrin48发送的源MAC地址
source_ip_addrin32发送的源IP地址
destination_ip_addrin32发送的目的IP地址
mac_data_reqin1MAC层请求数据信号
arp_request_reqin1ARP请求的请求信号
arp_reply_ackout1ARP回复的应答信号
arp_reply_reqin1ARP回复的请求信号
arp_rec_source_ip_addrin32ARP接收的源IP地址,回复时放到目的IP地址
arp_rec_source_mac_addrin48ARP接收的源MAC地址,回复时放到目的MAC地址
mac_send_endin1MAC发送结束
mac_tx_ackin1MAC发送应答
arp_tx_readyout1ARP数据准备好
arp_tx_dataout8ARP发送数据
arp_tx_endout1ARP数据发送结束
4)IP层发送在发送部分,ip_tx.v为IP层发送模块,在IDLE状态下,如果ip_tx_req有效,也就是UDP或ICMP发送请求信号,进入等待发送数据长度状态,之后进入产生校验和状态,校验和是将IP首部所有数据以16位相加,最后将进位再与低16位相加,直到进入为0,再将低16位取反,得出校验和结果。此程序中校验和以树型加法结构,并插入流水线,能有效降低加法部分的延迟,但缺点是会消耗较多逻辑资源。如下图ABCD四个输入,A与B相加,结果为E,C与D相加,结果为F,再将E与F相加,结果为G,在每个相加结果之后都有寄存器。https://pic4.zhimg.com/80/v2-589982ea8429c3158dc219fb4caae07f_720w.jpg在生成校验和之后,等待MAC层数据请求,开始发送数据,并在即将结束发送IP首部后请求UDP或ICMP数据。等发送完,进入IDLE状态。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
destination_mac_addrin48发送的目的MAC地址
source_mac_addrin48发送的源MAC地址
source_ip_addrin32发送的源IP地址
destination_ip_addrin32发送的目的IP地址
TTLin8生存时间
ip_send_typein8上层协议号,如UDP,ICMP
upper_layer_datain8从UDP或ICMP过来的数据
upper_data_reqout1向上层请求数据
mac_tx_ackin1MAC发送应答
mac_send_endin1MAC发送结束信号
mac_data_reqin1MAC层请求数据信号
upper_tx_readyin1上层UDP或ICMP数据准备好
ip_tx_reqin1发送请求,从上层过来
ip_send_data_lengthin16发送数据总长度
ip_tx_ackout产生IP发送应答
ip_tx_busyoutP发送忙信号
ip_tx_readyout1IP数据已准备好
ip_tx_dataout8IP数据
ip_tx_endout1IP数据发送到MAC层结束
5)IP发送模式工程中的ip_tx_mode.v为发送模式选择,根据发送模式是UDP或ICMP选择相应的信号与数据。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
mac_send_endin1MAC数据发送结束
udp_tx_reqinUDP发送请求
udp_tx_readyin1UDP数据准备好
udp_tx_datain8UDP发送数据
udp_send_data_lengthin16UDP发送数据长度
udp_tx_ackout1输出UDP发送应答
icmp_tx_reqin1ICMP发送请求
icmp_tx_readyin1ICMP数据准备好
icmp_tx_datain8ICMP发送数据
icmp_send_data_lengthin16ICMP发送数据长度
icmp_tx_ackout1ICMP发送应答
ip_tx_ackin1IP发送应答
ip_tx_reqin1IP发送请求
ip_tx_readyout1IP数据已准备好
ip_tx_dataout8IP数据
ip_send_typeout8上层协议号,如UDP,ICMP
ip_send_data_lengthout16发送数据总长度
6)UDP发送发送部分中,udp_tx.v为UDP发送模块,第一步将数据写入UDP发送RAM,同时计算校验和,第二步将RAM中数据发送出去。UDP校验和与IP校验和计算方法一致。在计算时需要将伪首部加上,伪首部包括目的IP地址,源IP地址,网络类型,UDP数据长度。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
source_ip_addrin32发送的源IP地址
destination_ip_addrin32发送的目的IP地址
udp_send_source_portin16源端口号
udp_send_destination_portin16目的端口号
udp_send_data_lengthin16UDP发送数据长度,用户需给出其值
ram_wr_datain8写UDP的RAM数据
ram_wr_enin1写RAM使能
udp_ram_data_reqout1请求写RAM数据
mac_send_endin1MAC发送结束信号
udp_tx_reqin1UDP发送请求
ip_tx_reqout1IP发送请求
ip_tx_ackin1Ip应答
udp_data_reqin1IP层请求数据
udp_tx_readyout1UDP数据准备好
udp_tx_dataout8UDP数据
udp_tx_endout1UDP发送结束(未使用)
almost_fullout1Fifo接近满标志
5.2 接收部分1) MAC层接收在接收部分,其中mac_rx.v为mac层接收文件,首先在IDLE状态下需要判断rx_dv信号是否为高,在REC_PREAMBLE前导码状态下,接收前导码。之后进入接收MAC头部状态,即目的MAC地址,源MAC地址,类型,将它们缓存起来,并在此状态判断前导码是否正确,错误则进入REC_ERROR错误状态,在REC_IDENTIFY状态判断类型是IP(8’h0800)或ARP(8’h0806)。然后进入接收数据状态,将数据传送到IP或ARP模块,等待IP或ARP数据接收完毕,再接收CRC数据。并在接收数据的过程中对接收的数据进行CRC处理,将结果与接收到的CRC数据进行对比,判断数据是否接收正确,正确则结束,错误则进入ERROR状态。https://pic3.zhimg.com/80/v2-35e4350ef1b11d8f32f88a4c0a7ee736_720w.jpg
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
crc_resultin32CRC32结果
crcenout1CRC使能信号
crcreout1CRC复位信号
crc_dinout8CRC模块输入信号
rx_dvin1从PHY层过来的rx_dv信号
mac_rx_datainin8从PHY层接收的数据
checksum_errin1IP层校验和错误
ip_rx_endin1IP层接收结束
arp_rx_endin1ARP层接收结束
ip_rx_reqout1请求IP层接收
arp_rx_reqout1请求ARP接收
mac_rx_dataoutout8MAC层接收数据输出给IP或ARP
mac_rec_errorout1MAC层接收错误
mac_rx_destination_mac_addrout48MAC接收的目的IP地址
mac_rx_source_mac_addrout48MAC接收的源IP地址
2) ARP接收工程中的arp_rx.v为ARP接收模块,实现ARP数据接收,在IDLE状态下,接收到从MAC层发来的arp_rx_req信号,进入ARP接收状态,在此状态下,提取出目的MAC地址,源MAC地址,目的IP地址,源IP地址,并判断操作码OP是请求还是应答。如果是请求,则判断接收到的目的IP地址是否为本机地址,如果是,发送应答请求信号arp_reply_req,如果不是,则忽略。如果OP是应答,则判断接收到的目的IP地址及目的MAC地址是否与本机一致,如果是,则拉高arp_found信号,表明接收到了对方的地址。并将对方的MAC地址及IP地址存入ARP缓存中。https://pic1.zhimg.com/80/v2-11ae063410d40151b87e4f9426ee6bd4_720w.jpg
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
local_ip_addrin32本地IP地址
local_mac_addrin48本地MAC地址
arp_rx_datain8ARP接收数据
arp_rx_reqin1ARP接收请求
arp_rx_endout1ARP接收完成
arp_reply_ackin1ARP回复应答
arp_reply_reqout1ARP回复请求
arp_rec_source_ip_addrin32ARP接收的源IP地址
arp_rec_source_mac_addrin48ARP接收的源MAC地址
arp_foundout1ARP接收到请求应答正确
3) IP层接收模块在工程中,ip_rx为IP层接收模块,实现IP层的数据接收,信息提取,并进行校验和检查。首先在IDLE状态下,判断从MAC层发过来的ip_rx_req信号,进入接收IP首部状态,先在REC_HEADER0提取出首部长度及IP总长度,进入REC_HEADER1状态,在此状态提取出目的IP地址,源IP地址,协议类型,根据协议类型发送udp_rx_req或icmp_rx_req。在接收首部的同时进行校验和的检查,将首部接收的所有数据相加,存入32位寄存器,再将高16位与低16位相加,直到高16位为0 ,再将低16位取反,判断其是否为0,如果是0,则检验正确,否则错误,进入IDLE状态,丢弃此帧数据,等待下次接收。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
local_ip_addrin32本地IP地址
local_mac_addrin48本地MAC地址
ip_rx_datain8从MAC层接收的数据
ip_rx_reqin1MAC层发送的IP接收请求信号
mac_rx_destination_mac_addrin48MAC层接收的目的MAC地址
udp_rx_reqout1UDP接收请求信号
icmp_rx_reqout1ICMP接收请求信号
ip_addr_check_errorout1地址检查错误信号
upper_layer_data_lengthout16上层协议的数据长度
ip_total_data_lengthout16数据总长度
net_protocolout8网络协议号
ip_rec_source_addrout32IP层接收的源IP地址
ip_rec_destination_addrout32IP层接收的目的IP地址
ip_rx_endout1IP层接收结束
ip_checksum_errorout1IP层校验和检查错误信号
4) UDP接收在工程中,udp_rx.v为UDP接收模块,在此模块首先接收UDP首部,再接收数据部分,并将数据部分存入RAM中,在接收的同时进行UDP校验和检查,如果UDP数据是奇数个字节,在计算校验和时,在最后一个字节后加上8’h00,并进行校验和计算。校验方法与IP校验和一样,如果校验正确,将拉高udp_rec_data_valid信号,表明接收的UDP数据有效,否则无效,等待下次接收。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
udp_rx_datain8UDP接收数据
udp_rx_reqin1UDP接收请求
mac_rec_errorin1MAC层接收错误
net_protocolin8网络协议号
ip_rec_source_addrin32IP层接收的源IP地址
ip_rec_destination_addrin32IP层接收的目的IP地址
ip_checksum_errorin1IP层校验和检查错误信号
ip_addr_check_errorin1地址检查错误信号
upper_layer_data_lengthin16上层协议的数据长度
udp_rec_ram_rdataout8UDP接收RAM读数据
udp_rec_ram_read_addrin11UDP接收RAM读地址
udp_rec_data_lengthout16UDP接收数据长度
udp_rec_data_validout1UDP接收数据有效
5.3 SMI接口1)SMI读写控制模块smi_read_write.v文件用于SMI接口的读写控制,在IDLE状态下根据写请求或读请求到相应的状态,再根据SMI时序实现MDC和MDIO的控制。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
mdcout1MDC时钟
mdioinout1MDIO数据
phy_addrin5PHY地址
reg_addrin5寄存器地址
write_reqin1写请求
write_datain16写数据
read_reqin1读请求
read_dataout16读数据
data_validout1数据有效
doneout1读或写结束
2)SMI配置模块smi_config.v文件读取寄存器0x11的bit10和bit来判断以太网是否已经连接和当前的以太网速度,默认状态下,PHY芯片是自动协商速度,根据对方的速度做匹配。bit 10为1则link成功,否则失败,bit为00则是10M,01为100M,10或11为1000M,根据不同的速度点亮LED灯,没有link都不亮,10M亮一个灯,100M亮两个灯,1000M亮三个灯。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
mdcout1MDC时钟
mdioinout1MDIO数据
speedout2速度 00:10M; 01:100M; 10:1000M
linkout1寄存器地址
ledout4写请求
5.4 10/100/1000M仲裁由于10/100M传输数据时是单边沿采集数据,因此一个周期传输4bit数据,而RGMII为双边沿采集数据,所以要进行数据的转换,如发送时,要将一周其8bit数据转成一周期4bit数据,因此要设置数据缓存,读数据速率为写数据的一半。1)TX buffergmii_tx_buffer.v将要发送的8bit缓存到eth_data_fifo中,同时将数据长度缓存到len_fifo中,在状态机中判断长度FIFO中的数据是否大于0,是则表明已经缓存了数据,之后进入读FIFO数据状态,每两个周期读一次数据,此功能不好理解,最好用signaltap抓取信号帮助理解。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
eth_10_100m_enin110/100M使能信号
linkin1Link信号
gmii_tx_enin1内部的gmii发送使能
gmii_txdin8内部的gmii发送数据
e10_100_tx_enout110/100M发送使能
e10_100_txdout810/100M发送数据
2)RX buffergmii_rx_buffer.v将接收的10/100M数据缓存到eth_data_fifo中,同时将数据长度缓存到len_fifo中,在状态机中判断长度FIFO中的数据是否大于0,是则表明已经缓存了数据,之后进入读FIFO数据状态,每两个周期读一次数据,最好用signaltap抓取信号帮助理解。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
eth_10_100m_enin1100M使能信号
eth_10m_enin110M使能信号
linkin1Link信号
gmii_rx_dvin1外部的gmii接收有效
gmii_rxdin8外部的gmii接收数据
e10_100_rx_dvout110/100M接收有效信号
e10_100_rxdout810/100M接收数据
3)仲裁gmii_arbi.v用于三种速度的仲裁,同时设定了发送的间隔都为1S。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
speedin2以太网速度
linkin1Link信号
gmii_rx_dvin1外部的gmii接收有效
gmii_rxdin8外部的gmii接收数据
gmii_tx_enin1内部的gmii发送使能
gmii_txdout8内部的gmii发送数据
pack_total_lenout32延迟数值,每种速度都设置为1S
e_rst_nout1复位MAC信号
e_rx_dvout1仲裁后接收有效信号
e_rxdout8仲裁后接收有效数据
e_tx_enout1仲裁后发送使能信号
e_txdout8仲裁后发送数据信号
5.5 其他部分1)ICMP应答在工程中,icmp_reply.v实现ping功能,首先接收其他设备发过来的icmp数据,判断类型是否是回送请求(ECHO REQUEST),如果是,将数据存入RAM,并计算校验和,判断校验和是否正确,如果正确则进入发送状态,将数据发送出去。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
mac_send_endin1Mac发送结束信号
ip_tx_ackin1IP发送应答
icmp_rx_datain8ICMP接收数据
icmp_rx_reqin1ICMP接收请求
icmp_rev_errorin1接收错误信号
upper_layer_data_lengthin16上层协议长度
icmp_data_reqin1发送请求ICMP数据
icmp_tx_readyout1ICMP发送准备好
icmp_tx_dataout8ICMP发送数据
icmp_tx_endout1ICMP发送结束
icmp_tx_reqout1ICMP发送请求
2)ARP缓存在工程中,arp_cache.v为arp缓存模块,将接收到的其他设备IP地址和MAC地址缓存,在发送数据之前,查询目的地址是否存在,如果不存在,则向目的地址发送ARP请求,等待应答。在设计文件中,只做了一个缓存空间,如果有需要,可扩展。
信号名称方向宽度(bit)说明
clkin1系统时钟
rst_nin1异步复位,低电平复位
arp_foundin1ARP接收到回复正确
arp_rec_source_ip_addrin32ARP接收的源IP地址
arp_rec_source_mac_addrin48ARP接收的源MAC地址
destination_ip_addrin32目的IP地址
destination_mac_addrout48目的MAC地址
mac_not_existout1目的地址对应的MAC地址不存在
3)CRC校验模块(crc.v)一个IP数据包的CRC32校验是在目标MAC 地址开始计算的,一直计算到一个包的最后一个数据为止。以太网的CRC32的verilog的算法和多项式可以在以下网站中直接生成:http://www.easics.com/webtools/crctoolhttps://pic1.zhimg.com/80/v2-23222c6d34acf4b7b1297cbdb0325368_720w.jpg4)以太网测试模块(mac_test.v)测试模块实现数据流的控制,首先在按下按键后发送ARP请求信号,直到对方回应,进入发送UDP数据状态,如果在WAIT状态时发现UDP接收数据有效,则将接收的数据发送出去。循环1秒发送,在每次发送前需要检查目的IP地址是否能在ARP缓存里找到,如果没有,则发送ARP请求。
信号名称方向宽度(bit)说明
clk_50min1系统时钟
rst_nin1异步复位,低电平复位
pack_total_lenin32包长度
push_buttonin1按键信号
gmii_tx_clkin1GMII发送时钟
gmii_rx_clkin1GMII接收时钟
gmii_rx_dvin1接收数据有效信号
gmii_rxdin8接收数据
gmii_tx_enout1发送数据有效信号
gmii_txdout8发送数据
5)RGMII转GMII模块util_gmii_to_rgmii.v文件是将RGMII与GMII转换,提取出控制信号与数据信号。与PHY连接是RGMII接口。https://pic1.zhimg.com/80/v2-0695709afb62e006996136dbf68b8b84_720w.jpgGMII接口https://pic3.zhimg.com/80/v2-fb09fd41792b1784208c067b08df7caa_720w.jpgRGMII接口RGMII接口是GMII接口的简化版,在时钟的上升沿及下降沿都采样数据,上升沿发送TXD/RXD,下降沿发送TXD/RXD,TX_EN传送TX_EN(上升沿)和TX_ER(下降沿)两种信息,RX_DV传送RX_DV(上升沿)和RX_ER(下降沿)两种信息。6. 下载和试验6.1 准备工作第一步:首先确认一下自己PC的网卡是否是千兆网卡,用户可以点击本地连接查看,再用五类+或者六类网线连接开发板的网口和PC的网口。 第二步:修改PC的IP地址为192.168.0.3。PC的IP Address需要和mac_test.v中设置一致,不然网络调试助手会接收不到开发板发送的UDP数据包。https://pic4.zhimg.com/80/v2-763e7fea547e91c1c17bab8b0fd26fdf_720w.jpghttps://pic4.zhimg.com/80/v2-807083c528e90e5497b5603ef9448ae7_720w.jpg第三步:安装Wireshark是为了方便用户网络通信的调试,安装”\07_软件工具及驱动\网络调试工具\wireshark_cn”目录下的网络抓包工具Wireshark, 我们在实验的时候可以用这工具来查看PC网口发送的数据和接收到的数据的详细信息。https://pic4.zhimg.com/80/v2-46f8b06c6f53b8751dcf758a345df4f7_720w.jpg6.2 以太网通信测试第一步:烧写ethernet_test.bit文件到FPGA,(如果需固化到FLASH中烧写ethernet_test.bin文件),等待两三秒,看到三个LED灯亮,为千兆网卡,两个灯亮为百兆网卡,如果都没亮,需要检查网口连接情况。第二步:以管理员权限打开CMD窗口,输入arp –a查看ARP绑定结果,可以看到开发板的IP地址和MAC地址已经缓存。https://pic2.zhimg.com/80/v2-7df9a0a2a800503640dfb2e6f4f92775_720w.jpg第三步:在CMD窗口中,输入ping 192.168.0.2查看PC与开发板是否ping通。https://pic3.zhimg.com/80/v2-ebd392e3e5a2d22e09e9af8c0119235a_720w.jpg第四步:打开“\07_软件工具及驱动\网络调试工具\NetAssist “目录下的网络调试助手并设置参数如下,再按连接按钮(这里的本地的IP地址为PC的IP Address, 本地端口需要跟FPGA程序中的一致,为8080)。https://pic2.zhimg.com/80/v2-8f1aa6b4f522b57f0788e54bd532a821_720w.jpg这时网络数据接收窗口会显示FPGA发给PC的以太网数据包"HELLO ALINX HEIJIN"目标主机的IP地址需要和FPGA程序中的IP地址一致,目标端口号也需要和FPGA程序的一致(8080)。如下图网络显示:https://pic1.zhimg.com/80/v2-03af920260d7628befaf47ee6d52ed2c_720w.jpg第五步:再在网络调试助手的发送窗口发送一大串字符,在网络的数据接收窗口我们可以看到从FPGA返回的数据也变成刚发送的字符串。https://pic4.zhimg.com/80/v2-f762d76abc12088fbccb8bcefdab81ff_720w.jpg也可以发送较少字符,低于46字节,FPGA程序会自动补充至46字节,如下图:https://pic3.zhimg.com/80/v2-904403063d020c89500ff8e29839e1b2_720w.jpg第六步:这一步对用户来讲是可选的,用户如果想查看更多数据包传输的信息,可以使用网络抓包工具Wireshark来查看PC的网卡接收和发送的网络数据,打开安装好的wireshark抓包工具,点击菜单抓包->网络接口。https://pic4.zhimg.com/80/v2-923dba9ab48c3e539c8ed7432df75323_720w.jpg在弹出的抓包接口窗口选择PC的千兆网卡,按开始按钮开始抓包。https://pic1.zhimg.com/80/v2-f80dbf29ddbad3f2117bc87b2d9068b8_720w.jpg在wireshark抓包窗口我们可以看到开发板(192.168.0.2)向PC网口(192.168.0.2)发来的数据包,这里会显示数据包的目标MAC, 源MAC,IP包头和UDP包等信息, 如下图开发板抓包窗口显示:https://pic3.zhimg.com/80/v2-4ca25ebc4ffeeb11eb4b0f7a664ba01a_720w.jpg6.3 以太网速度测试我们可以通过抓包工具wireshark测量以太网部分的数据发送的速度,因为千兆以太网理想模式网络的速度可以达到1Gbps,但实际因为每个数据包中有包头,CRC等非数据字符,而且每包之间有空隙,一般千兆以太网的数据传输速度最高在950Mbps左右。传输是上下对称传输,就是说上行和下行都能达到950Mbps左右。在这里,因为抓包wireshark只能统计接收的数据包,而不会发送数据,所以这里只是测试FPGA发给电脑的输送数据的速度。第一步:修改程序,修改工程中mac_test.v中的代码,如下图所示https://pic1.zhimg.com/80/v2-58505171571d8a04974ac71280f5d50c_720w.jpg把上图中的红色标的”//”去掉,如下:https://pic3.zhimg.com/80/v2-f72a3fdf0feaf50e0c9cb6b3d0a50d7a_720w.jpg第二步:编译综合完成后下载测试程序,下载完成后这时FPGA网络会进行动态绑定,PC机的IP设置请参照5.2章节(如已设置忽略)。打开wireshark,点击菜单“抓包”->"抓包参数选择”。在抓包选项中设置缓冲大小为1000megabyte,在10000个数据包之后停止抓包。(这里需要注意:如果不设置的话wireshark因为抓的包太多,处理不了导致软件崩溃)https://pic4.zhimg.com/80/v2-dfb726828543a74ab1c4a3be3a36ccab_720w.jpg按开始后抓包,等待接收到10000个包后停止抓包,用时0.087932秒。https://pic3.zhimg.com/80/v2-1bb9bea03a6867f43469ea1d8004f9b6_720w.jpg我们可以看到每个数据包的内容都是00->FF的数据,总共是3个00->FF,1个00->e7的数据。总共是1000个有效数据。https://pic3.zhimg.com/80/v2-7ef71afb00f1bcc082d43379da5e034e_720w.jpg这里我们看到软件用了0.087932秒收到了10000个数据包,每个数据包里含有的有效数据是1000个字节(8bit)。所以我们可以算出以太网的传输速度为:传输速度 = 1000* 10000 * 8 / 0.087932 = 910Mbps。这里提示一下,网络传输的速度跟包长也有关系,数据包长越长,效率就越高,传输数据的速度会变高;数据包越短,效率就越低,传输数据的速度就慢。这个道理我想大家应该明白的吧!下面是1000000包的时间是8.799832秒,自己可以按照上面的方面算下速度,速度是非常稳定的。https://pic2.zhimg.com/80/v2-e33a7363df583c08d0781aba6a49ea01_720w.jpg6.4 以太网100M/1000M测试改变电脑的网卡速度,首先打开网络连接,找到本地网卡,右键点击属性弹出如下窗口,再点击配置。https://pic3.zhimg.com/80/v2-d38533f196b701c3acb1bf4966db660a_720w.jpg在弹出的窗口中找到链接速度,选择100Mbps全双工,点击确定,等待几秒钟,会发现LED灯会发生改变,之后再按前面的操作步骤进行测试。https://pic4.zhimg.com/80/v2-63017786f6a1946827ce85b354e192fb_720w.jpg到这里为止,我们的以太网数据通信就全部结束了,要实现以太网的数据通信首先需要理解以太网数据包的格式和通信协议,还需要了解MAC和PHY之间的GMII,RGMII,MII,RMII接口的时序。千兆以太网的数据传输速度非常快,而且是全双工传输,而且UDP通信的数据速度可以达到900Mbps以上,非常适合高速数据传输的场合,比如视频图像传输,高速数据采集等等。
页:
[1]