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

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注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://www.mfbz.cn/a/129691.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VEX —— Intrinsic attribute

目录 查看 使用 PackedGeometry Intrinsic attribute 内在属性是已经被计算的值(从几何体派生出来的),可像属性一样访问; 查看 ginfo -I,打印所有内在属性;geometry spreadsheet,查看内在属性…

08.Diffusion Model数学原理分析(下)

文章目录 denoising matching term σ t z \sigma_tz σt​z的猜想Diffusion Model for SpeechDiffusion Model for TextMask-Predict 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索。 书接上文。 denoising matching term E q ( x t ∣ x 0 …

第四章:人工智能深度学习教程-激活函数(第一节-激活函数)

简单来说,人工神经元计算其输入的“加权和”并添加偏差,如下图所示的净输入。 从数学上来说, 现在净输入的值可以是从 -inf 到 inf 之间的任何值。神经元并不真正知道如何绑定到值,因此无法决定激发模式。因此激活函数是人工神经网…

【Proteus仿真】【STM32单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用按键、LED模块等。 主要功能: 系统运行后,系统运行后,系统开始运行,K1键控制左转向灯&#xff…

【PHP函数封装】分分钟帮你实现数据脱敏处理, 支持手机号码、邮箱、身份证号 中文字符串!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

一篇文章教会你写一个贪吃蛇小游戏(纯C语言)

一篇文章教会你写一个贪吃蛇小游戏 1、游戏展示2、游戏功能3、Win32 API3.1 控制台程序3.2 控制台屏幕上的坐标COORD3.3 GetStdHandle函数3.4 GetConsoleCursorInfo函数3.4.1 CONSOLE_CURSOR_INFO结构体 3.5 SetConsoleCursorInfo函数3.6 SetConsoleCursorPosition函数3.7 GetA…

C++智能指针的使用:shared_ptr、weak_ptr、unique_ptr的使用,使用案例说明。

系列文章目录 本章内容: (1)shared_ptr、weak_ptr、unique_ptr的介绍 (2)单独使用share_ptr造成的内存泄漏 (3)shared_ptr和weak_ptr的配合使用 文章目录 系列文章目录前言一、shared_ptr、wea…

openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群

openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群 Redis 的多种模式Redis-Alone 单机模式Redis 单机模式的优缺点 Redis 高可用集群模式Redis-Master/Slaver 主从模式Redis-Master/Slaver 哨兵模式哨兵模式监控的原理Redis 节点主客观下线标记Redis 节点主客观…

如何避免手动修改文件名,批量重命名文件的方法

在我们的日常生活和工作中,经常需要处理大量的文件,其中一些文件可能需要进行重命名。如果只是少数几个文件,我们可以手动重命名,但是当面对成百上千的文件时,手动重命名就变得非常繁琐和低效。那么,有没有…

低代码技术这么香,如何把它的开发特点发挥到极致?

前言 什么是低代码技术? 低代码是一种可视化软件开发方法,通过最少的编码更快地交付应用程序。图形用户界面和拖放功能使开发过程的各个方面自动化,消除了对传统计算机编程方法的依赖。 文章目录 前言低代码平台怎么选?用友Yonbu…

C语言中一维指针、二维指针和三维指针

指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。 假设…

github遇到想要强制拉取远程仓库内容

进行项目的时候,遇到了我的远程仓库 Sync fork 更新以后,这时候我的本地就和远程不同步,如果使用 git pull 的时候,如果出现 conficts 过多的情况怎么办,如果我们想要直接把远程仓库拉下来应该怎么办? git…

srs webrtc推拉流环境搭建

官方代码https://github.com/ossrs/srs 拉取代码: git clone https://github.com/ossrs/srs.gitcd ./configure make ./objs/srs -c conf/rtc.confconf/rtc.conf中,当推拉流浏览器在本地时,如果srs也在本地,那么可以使用官网默认…

​怎么测试websocket接口

在部分业务中,我们需要使用长连接,我们可以使用http长连接或者websocket,开发结束后难免会遇到测试问题,这里推荐2个,一个是postman,一个是网站 postman 测试网站 测这边推荐测试网站,支持ws/w…

Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片,免不了有些是黑白的、被污损的、模糊的,总想着修复一下。作为一个程序员 或者 程序员的家属,当然都有责任满足他们的需求、实现他们的想法。除了这个,学习了本文的成果,或许你还…

如何记录血压的波动情况

import pandas as pd from plotnine import * import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei] 记录时间(time)、收缩压(SBP)、舒张压(DBP): df pd.DataFrame({ time: [2023-11-01 08:30, 2023-11-02 21:00, 2023-11-0…

C++之旅(学习笔记)第6章 基本操作

C之旅(学习笔记)第6章 基本操作 6.1 基本操作 class X{ public:X(Sometype); // "普通的构造函数": 创建一个对象X(); // 默认构造函数X(const X&); // 拷贝构造函数X(X&&); // 移动构造函数X& operator(const …

规划文献阅读——Obstacle Avoidance, Path Planning and Control for Autonomous Vehicles

摘要 自动驾驶汽车避障需要三个主要层面,即感知、路径规划和制导控制。在本文中,考虑到这三个层次之间的联系,提出了一个全局架构。在环境感知层面,采用基于证据占用网格的方法进行动态障碍物检测。因此,考虑物体的姿…

鸿蒙原生应用开发-DevEco Studio远程模拟器的使用

使用单设备模拟器运行应用/服务 Remote Emulator支持Phone、Wearable、Tablet、TV等设备类型,但不同区域(开发者帐号注册地)支持的设备类型可能不同,请以实际可申请的设备类型为准。 Remote Emulator中的单设备模拟器&#xff08…

Sprint Boot 学习路线 3

嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中。这使得开发、测试和部署 Web 应用程序变得容易,而且它还是轻量级的、易于启动和停止…