【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程

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

1.实验简介

实验目的:

完成 DDR3 的读写测试。

实验环境:

Window11 PDS2022.2-SP6.4

芯片型号:

PG2L50H-484

2.实验原理

2.1. 开发板以太网接口简介

      开发板使用裕泰微的裕太微电子的 YT8521SH-CA 实现了一个 10/100/1000 以太网端口。使用时需要用到光电转换模块,通过网线连接电脑的网口和光电转换模块的电口即可完成通信。

2.2. 以太网协议简介
2.2.1. 以太网帧格式

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

2.2.2. 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 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 应答。

2.2.3. 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 字节,分别记录源地址和目的地址;

2.2.4. UDP 协议

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

       UDP 协议的报头格式:

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

  1. UDP 源端口号
  2. 目标端口号
  3. 数据报长度
  4. 校验和

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

       数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计 算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报 头在内的数据报的最大长度为 65535 字节。

       不过,一些实际应用往往会限制数据报的大小,有时会降低到 8192 字节。

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

2.2.5. Ping功能

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

3.SMI(MDC/MDIO)总线接口

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

3.1. SMI 帧格式

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

3.2. 读时序

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

3.3. 写时序

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

4.实验设计

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

4.1. 发送部分
4.1.1. 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 状态,等待下一次的发送请求。

4.1.2. MAC 发送模式

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

4.1.3. ARP 发送

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

4.1.4. IP 层发送

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

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

4.1.5. IP 发送模式

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

4.1.6. UDP 发送

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

4.2. 接收部分
4.2.1. 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 状态。

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

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

4.2.4. UDP 接收

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

4.3. 其他部分
4.3.1. ICMP 应答

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

4.3.2. ARP 缓存

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

4.3.3. CRC 校验模块(crc.v)

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

5.实验现象

       用光电转换模块插入 SFP 口,再用一根网线和 PC 端网口相连;

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

       通过命令提示符,输入 arp -a,可以查到 IP:192.168.0.2 MAC:a0_b1_c2_d3_e1_e1;

       通过 Wireshark 软件抓包验证数据链路是否正常连接以及数据传输是否正常。资料包中 PC 端打开 Wireshark 软件,烧录重新后进行捕获数据报可以看到如下所示的交互过程。

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

    Ping 功能测试,由上图可知,ping 基本不丢包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88171.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《每日AI-人工智能-编程日报》--2025年7月9日

介绍:AI 方面1. Manus 通用智能体初成型,开启 AIAgent 新时代​中泰证券发布研报称,首款通用型 AI 智能体 Manus 已问世,能够将复杂任务拆解为可执行的步骤链,并在虚拟环境中灵活调用工具,标志着 AI 从 “Reasoner” 走…

MyBatis之数据操作增删改查基础全解

目录 1. ➕MyBatis添加数据 1.1. 持久层接口添加方法 1.2. 映射文件添加标签 1.3. 编写测试方法 2. ✏️MyBatis修改数据 2.1. 代码的优化 2.2. 持久层接口添加方法 2.3. 映射文件添加标签 2.4. 编写测试方法 3. 🗑️MyBatis删除数据与根据Id查询 3.1. 删…

kbmMemTable Pro 7.82 Delphi 11 源代码

kbmMemTable Pro 7.82 Delphi 11 源代码KbmMemTable 是一个用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 应用程序中存储临时数据的组件,这些应用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等编程语言创建,同时您还可以高速访问存储在数据…

LeetCode Hot 100 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在 O(n) 时间复杂度内…

VC Code--常用的配置

原文网址:VC Code--常用的配置-CSDN博客 简介 本文介绍VC Cod常用的配置。 1.字体大小 整体字体大小 左下角齿轮> Settings> Windows> Window: Zoom Level> 改为:2 编辑器字体大小(如果调整了整体字体大小,此处…

大模型驱动的智能体:从GPT-4到o1的能力跃升

大模型驱动的智能体:从GPT-4到o1的能力跃升 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xf…

200nl2sql

‘train_runtime’: 1375.1089, ‘train_samples_per_second’: 0.025, ‘train_steps_per_second’: 0.007, ‘train_loss’: 0.0, ‘num_tokens’: 115914.0, ‘completions/mean_length’: 76.4125, ‘completions/min_length’: 27.8, ‘completions/max_length’: 151.2, …

Transformer、BERT、GPT以及Embedding之间的关系

1. Transformer架构的两大方向 Transformer分为两大类应用,但划分标准不是"分类vs生成",而是编码方式: Encoder架构(代表:BERT): 使用Transformer的​​编码器​​(Encode…

ARM汇编编程(AArch64架构)课程 - 第7章:SIMD与浮点运算

目录1. NEON寄存器关键特性数据排列示例2. 浮点指令2.1 FMUL指令2.2 FADD指令2.3 FCMP指令1. NEON寄存器 AArch64架构提供32个128位NEON向量寄存器(V0-V31),支持SIMD并行计算 关键特性 寄存器类型数量位宽数据视图Q寄存器32128bQ0-Q31D寄存…

Word2Vec模型详解:CBOW与Skip-gram

Word2Vec模型详解:CBOW与Skip-gram 目录 模型概述理论基础CBOW模型详解Skip-gram模型详解模型对比代码实现详解训练过程分析应用场景实验结果总结 模型概述 Word2Vec是一种用于生成词向量的神经网络模型,由Google在2013年提出。它包含两种主要架构&am…

跨服务sqlplus连接oracle数据库

背景:ogg程序同步数据。 目标库:客户oracle数据库11.0.2.4.0,也就是11g的数据库。源库:业务组搭建的19c数据库,刚安装的oracle数据库。ogg在源库和目标库系统都部署好了并且也可以通信。在目标库系统使用sqlplus测试连…

虚拟机安装与使用vim编辑器简单使用

文章目录1.VMware17许可证2.ubuntu虚拟机的显示屏幕太小3.vmware 17 无法安装 vmware tools4.buntu常用快捷键与命令5.vim文本编辑器参考资料:1.VMware17许可证 JU090-6039P-08409-8J0QH-2YR7F(亲测2025/7/8有效) 2.ubuntu虚拟机的显示屏幕…

Tomcat:启用https(Windows)

1、在D盘cmd,使用keytool生成签名(365天)(密码111111): keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 2、在conf/server.xml中添加如下配置&#xff0…

A模块 系统与网络安全 第四门课 弹性交换网络-2

今日目标 STP协议概述STP工作原理选举根端口和指定端口BPDUMSTP工作原理及配置MSTP负载均衡1 STP协议概述 1.1 环路的危害 单点故障 PC之间的互通链路仅仅存在1个 任何一条链路出现问题,PC之间都会无法通信解决方案 提高网络可靠性 增加冗余/备份链路产生新的问题 增…

人工智能-基础篇-20-如何搭建一个人工智能知识库?

1、前期准备阶段 1、明确目标与范围 目标:确定知识库的核心用途(如内部文档共享、客户服务支持、培训材料存储等)。明确预期用户群体及其需求。范围:明确覆盖部门(如技术部、销售部)、知识类型(…

存储延时数据,帮你选数据库和缓存架构

1. 理解存储媒介量化延时类别描述延时缓存/内存L1 cache reference1 ns缓存/内存L2 cache reference4 ns缓存/内存Main memory reference(DDR4,5 - 10 ns 为补充说明 )100 ns网络传输Send packet CA->Netherlands->CA150,000,000 ns&am…

人工智能领域的顶会

人工智能领域的顶会(顶级学术会议)通常按研究方向划分,涵盖机器学习、计算机视觉、自然语言处理、机器人学等多个子领域。这些会议以录用标准严格、学术影响力高著称,是全球AI研究者交流前沿成果的核心平台。这些顶会的录用论文通…

kotlin+MongoTemplate的时间类型为is_date类型 pymongo如何处理

来自AI回答 在 Kotlin 中使用 MongoTemplate(来自 Spring Data MongoDB)时,配置方式和 Java 是一致的,主要通过 MongoClientSettings、MongoTemplate Bean、以及 application.yml 配置完成。 ✅ 一、MongoTemplate 的配置方式 你可…

Python 机器学习核心入门与实战进阶 Day 7 - 复盘 + 综合实战挑战

✅ 今日目标综合应用本周所学的: 分类算法(SVM、决策树、随机森林等)模型调参(GridSearchCV)模型持久化(joblib)特征工程与数据构造构建一套完整的二分类建模流程📘 项目任务说明构建…

C#版本的训练AI模型软件

程序介绍文档 项目概述 HL.AI.train 是由深圳海蓝智能开发的AI模型训练与转换工具,版本号1.2.1.0。该程序基于Windows Forms构建,提供图形化界面支持YOLOv5和YOLOv8模型的训练配置、数据集管理以及PyTorch模型到ONNX格式的转换功能。程序支持CUDA GPU加速…