【紫光同创国产FPGA教程】——【PGL22G第十一章】以太网传输实验例程

news/2024/7/1 3:01:19

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注www.meyesemi.com)
 

适用于板卡型号:

紫光同创PGL22G开发平台(盘古22K)

一:盘古22K开发板(紫光同创PGL22G开发平台)简介

盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板,全面实现国产化方案,板载资源丰富,高容量、高带宽,外围接口丰富,不仅适用于高校教学,还可以用于实验项目、项目开发,一板多用,满足多方位的开发需求。

二:实验目的

MES22GP开发板使用Realtek RTL8211E PHY实现了一个10/100/1000以太网端口,用于网络连接。该器件工作电压为支持2.5V、3.3V。PHY连接到BANK R3,并通过RGMII接口连接到PGL22G。RJ-45连接器是HFJ11-1G01E-L12RL,具有集成的自动缠绕磁性元件,可提高性能,质量和可靠性。RJ-45有两个状态指示灯LED,用于指示流量和有效链路状态(详情请查看“MES22GP开发板硬件使用手册”)。

通过以太网端口实现PC端和开发板间通信,实现了ARP,UDP功能。

三:以太网协议简介 

以太网帧格式

前导码(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字节。 

ARP数据报格式 

ARP地址解析协议,即ARP(Address Resolution Protocol),根据IP地址获取物理地址。主机发送包含目的IP地址的ARP请求广播(MAC地址为48’hff_ff_ff_ff_ff_ff)到网络上的主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后将IP地址和物理地址保存到缓存中,并保留一段时间,下次请求时直接查询ARP缓存以节约资源。下图为ARP数据报格式。

帧类型:ARP帧类型为两字节0806; 

硬件类型:指链路层网络类型,1为以太网;

协议类型:指要转换的地址类型,采用0x0800 IP类型,之后的硬件地址长度和协议地址长度分别对应6和4;

OP字段中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 0a35 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 abc1 a2 d5 15|c0 a8 00 03|00 0a 35 01 fe c0|c0 a8 00 02|

表示向192.168.0.2地址发送ARP应答。

IP数据包格式

因为UDP协议包只是IP包中的一种,所以我们来介绍一下IP包的数据格式。下图为IP分组的报文头格式,报文头的前20个字节是固定的,后面的可变

版本:占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字节,分别记录源地址和目的地址;

UDP协议

UDP是User Datagram Protocol(用户数据报协议)的英文缩写。UDP只提供一种基本的、低延迟的被称为数据报的通讯。所谓数据报,就是一种自带寻址信息,从发送端走到接收端的数据包。UDP协议经常用于图像传输、网络监控数据交换等数据传输速度要求比较高的场合。

UDP协议的报头格式:

UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:

①UDP源端口号            ②目标端口号                     ③数据报长度                 ④校验和 

UDP协议使用端口号为不同的应用保留其各自的数据传输通道。数据发送一方将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。

数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。

UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。虽然UDP提供有错误检测,但检测到错误时,错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。

 Ping功能

UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。虽然UDP提供有错误检测,但检测到错误时,错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。

四:SMI(MDC/MDIO)总线接口 

串行管理接口(SerialManagementInterface),也被称作MII管理接口(MIIManagementInterface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟,由MAC端提供,在本实验中也就是FPGA端。在RTL8211EG文档里可以看到MDC的周期最小为400ns,也就是最大时钟为2.5MHz。

SMI帧格式

如下图,为SMI的读写帧格式: 

读时序

可以看到在Turn Around状态下,第一个周期MDIO为高阻态,第二个周期由PHY端拉低。

写时序

为了保证能够正确采集到数据,在MDC上升沿之前就把数据准备好,在本实验中为下降沿发送数据,上升沿接收数据。

 五:实验设计

本实验以千兆以太网RGMII通信为例来设计verilog程序,会先发送预设的UDP数据到网络,每秒钟发送一次.程序分为两部分,分别为发送和接收,实现了ARP,UDP功能。

发送部分

MAC层发送

发送部分中,mac_tx.v为MAC层发送模块,首先在SEND_START状态,等待mac_tx_ready信号,如果有效,表明IP或ARP的数据已经准备好,可以开始发送。再进入发送前导码状态,结束时发送mac_data_req,请求IP或ARP的数据,之后进入发送数据状态,最后进入发送CRC状态。在发送数据过程中,需要同时进行CRC校验。前导码完成后就将上层协议数据发送出去,这个时候同样把这些上层数据放到CRC32模块中做序列生成,上层协议会给一个数据输出完成标志信号,这个时候mac_tx知道数据发送完成了,需要结束CRC32的序列生成,这个时候就开始提取FCS,衔接数据之后发送出去。这样就连接了前导码---数据(Mac帧)----FCS。之后跳转到结束状态,再回到IDLE状态,等待下一次的发送请求。

 

MAC发送模式 

工程中的mac_tx_mode.v为发送模式选择,根据发送模式是IP或ARP选择相应的信号与数据。

ARP发送

发送部分中,arp_tx.v为ARP发送模块,在IDLE状态下,等待ARP发送请求或ARP应答请求信号,之后进入请求或应答等待状态,并通知MAC层,数据已经准备好,等待mac_data_req信号,之后进入请求或应答数据发送状态。由于数据不足46字节,需要补全46字节发送。 

IP层发送 

在发送部分,ip_tx.v为IP层发送模块,在IDLE状态下,如果ip_tx_req有效,也就是UDP或ICMP发送请求信号,进入等待发送数据长度状态,之后进入产生校验和状态,校验和是将IP首部所有数据以16位相加,最后将进位再与低16位相加,直到进入为0,再将低16位取反,得出校验和结果。

在生成校验和之后,等待MAC层数据请求,开始发送数据,并在即将结束发送IP首部后请求UDP或ICMP数据。等发送完,进入IDLE状态。

IP发送模式 

工程中的ip_tx_mode.v为发送模式选择,根据发送模式是UDP或ICMP选择相应的信号与数据。

UDP发送 

发送部分中,udp_tx.v为UDP发送模块。

接收部分 

MAC层接收

在接收部分,其中mac_rx.v为mac层接收文件,首先在IDLE状态下当rx_en信号为高,进入REC_PREAMBLE前导码状态,接收前导码。之后进入接收MAC头部状态,即目的MAC地址,源MAC地址,类型,将它们缓存起来,并在此状态判断前导码是否正确,错误则进入REC_ERROR错误状态,在REC_IDENTIFY状态判断类型是IP(8’h0800)或ARP(8’h0806)。然后进入接收数据状态,将数据传送到IP或ARP模块,等待IP或ARP数据接收完毕,再接收CRC数据。并在接收数据的过程中对接收的数据进行CRC处理,将结果与接收到的CRC数据进行对比,判断数据是否接收正确,正确则结束,错误则进入ERROR状态。

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缓存中。 

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状态,丢弃此帧数据,等待下次接收。

UDP接收 

在工程中,udp_rx.v为UDP接收模块,在此模块首先接收UDP首部,再接收数据部分,在接收的同时进行UDP校验和检查,如果UDP数据是奇数个字节,在计算校验和时,在最后一个字节后加上8’h00,并进行校验和计算。校验方法与IP校验和一样,如果校验正确,将拉高udp_rec_data_valid信号,表明接收的UDP数据有效,否则无效,等待下次接收。

其他部分 

ICMP应答

在工程中,icmp_reply.v实现ping功能,首先接收其他设备发过来的icmp数据,判断类型是否是回送请求(ECHO REQUEST),如果是,将数据存入RAM,并计算校验和,判断校验和是否正确,如果正确则进入发送状态,将数据发送出去。

ARP缓存 

在工程中,arp_cache.v为arp缓存模块,将接收到的其他设备IP地址和MAC地址缓存,在发送数据之前,查询目的地址是否存在,如果不存在,则向目的地址发送ARP请求,等待应答。在设计文件中,只做了一个缓存空间,如果有需要,可扩展。

CRC校验模块(crc.v) 

CRC32校验是在目标MAC地址开始计算的,一直计算到一个包的最后一个数据为止。一些网站可以自动生成CRC算法的verilog文件:https://bues.ch/cms/hacking/crcgen.html

六:实验现象 

用网线连接MES22GP开发板网口和PC端网口;

设置接收端(PC端)IP地址为192.168.0.105,开发板的IP地址为192.168.0.11如下图:

将程序下载到开发板后,便可以看到已连接网线的网口对应LED灯规律性闪烁或常亮:

本次实验通过Wireshark软件抓包验证数据链路是否正常连接以及数据传输是否正常。资料包中Wireshark安装包目录如下:

MES22GP_v1\5_Software\网络调试助手\Wireshark-win32-2.4.1.0.exe

PC端打开Wireshark软件,烧录重新后进行捕获数据报可以看到如下所示的交互过程。 

成功建立连接后会持续发送数据报“www.meyesemi.com”。

 

 

 

 

 

 

 

 

 

 


http://lihuaxi.xjx100.cn/news/1776487.html

相关文章

linux下搭建gperftools工具分析程序瓶颈

1. 先安装 unwind //使用root wget https://github.com/libunwind/libunwind/archive/v0.99.tar.gz tar -xvf v0.99.tar.gz cd libunwind-0.99 autoreconf --force -v --install ./configure make sudo make install2. 安装gperftools wget https://github.com/gp…

n-gram语言模型——句子概率分布计算与平滑

n-gram语言模型——句子概率分布计算与平滑 前言 语言模型 等价假设 n元语法 句子概率分布计算方式 数据平滑 Lidstone平滑(1-gram) Laplace平滑(1-gram) 附上两种平滑在1-gram下代码 Lidstone平滑与Laplace平滑(2-gram) 附上两种平滑在2-gram下代码 前言 语言模型…

消息中间件汇总

RocketMQ和MetaQ的区别 RocketMQ和MetaQ其实是同一种消息队列中间件的两种不同称呼。 在阿里巴巴内部,它被称为MetaQ,而在开源版本中,它被称为RocketMQ。RocketMQ是MetaQ的3.0版本 ONS 阿里ONS是阿里巴巴公司推出的一款分布式消息系统。它基…

classification_report分类报告的含义

classification_report分类报告 基础知识混淆矩阵(Confusion Matrix)TP、TN、FP、FN精度(Precision)准确率(Accuracy)召回率(Recall)F1分数(F1-score) classi…

MySQL窗口函数——让查询变得更简单

文章目录 一、窗口函数概述1、什么是窗口函数2、窗口函数有哪些(1)聚合函数(聚合函数不是本文讨论的重点)(2)专用窗口函数 3、基本语法4、测试数据准备 二、窗口函数使用1、初识窗口函数:使用聚…

k8s docker cgroup驱动问题 —— 筑梦之路

cgroup作用是什么? 在 Linux 操作系统上,控制组(CGroup)用于限制分配给进程的资源。 kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组&a…

java 读取excel/word存入mysql

引入依赖 <!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artif…

有关自动化的脚本思考 python 按键 javascript

start 说来其实挺巧的&#xff0c;去年年中的时候&#xff0c;有一个同组的同事&#xff0c;由于工作流程需要&#xff0c;经常会打开某一网页&#xff0c;填写某些信息&#xff0c;然后上传特定的代码。 他有一次和我闲聊&#xff0c;他吐槽说&#xff0c;他每天的时间会被这…