UDP网口(3)逻辑组包(下)

news2024/9/24 1:17:26

在这里插入图片描述

文章目录

  • 1.ARP应答验证
  • 2.UDP实现思路
  • 3.UDP接收验证
  • 4.UDP发送验证
  • 5.总结与思考
  • 6.传送门

1.ARP应答验证

创建一个ARP应答工程,当PC发出ARP请求的时候,手动按下板卡指定按键,将会响应ARP应答。以此验证phy芯片的配置正常,硬件链路正常,也验证了CRC32bit 校验代码。判断和验证步骤如下。
1.打开本地“网络和Internet设置”,选择“更改适配器选项”,右键以太网选择“属性”,双击“Internet协议版本4”,配置ip地址为192.168.1.102。关于以太网组网,设备应该在同一个网段中,通常是192.168.x.x或者10.0.x.x。此处配置为192.168.1.102指在FPGA记录了PC机的IP地址为192.168.1.102,另外,任何与此FPGA板卡网口的主机应该配置为该ip地址。
在这里插入图片描述
2.命令提示符输入 ipconfig /all查看主机MAC地址
在这里插入图片描述
3.连接设备,并且上电,烧入FPGA程序。使用ping命令或者通过上位机向FPGA板卡发送数据,因为本地ARP映射表中没有对应ip地址的mac地址,因此都会下发ARP请求报文。实践中通过在命令提示符中ping 192.168.1.10,即可产生PC到FPGA的ARP报文,与此同时观察已打开的wireshark可抓取到请求包,与此同时按下指定板卡按键,则可收到ARP应答报文如步骤4所示。Ping命令使用的网络层的ICMP协议,因为该工程并没有实现这个协议,所以ping不通是正常现象,此处用它是为了让PC发出ARP请求。
4.打开wireshark(提前打开),选择与板卡相连的以太网卡。
在这里插入图片描述
在与步骤3同步的时刻,即使用ping后,接着按下板卡按键(不同的板子可以自己指定)观察到ARP请求和应答报文如下。
下图为ARP请求包wireshark抓包状态
在这里插入图片描述
下图为ARP请求包wireshark请求包与fpga接收时序图对比
在这里插入图片描述
在这里插入图片描述
下图为ARP应答包wireshark应答包与fpga发送时序图对比
在这里插入图片描述
在这里插入图片描述
5.使用arp -a查看ARP映射表,已更新IP与MAC的映射,说明ARP应答实现成功,说明硬件电路正确。(使用管理员方式运行)
在这里插入图片描述

2.UDP实现思路

从前面的描述可以看到,不论经过什么硬件回路,不论是什么样的协议实现,对于FPGA逻辑的开发,本质上是实现与PHY芯片的读写操作。对于ARP协议,接收ARP请求,发送ARP应答;对于UDP协议,接收UDP数据包,发送UDP数据包。因此将所有的逻辑整合到一起,为后续在此基础上开发应用打好基础。将读写操作分离,整个逻辑分为三个子模块,一个是pll模块,为其他模块生成用户时钟;一个是writeOnly模块,负责向PHY芯片写数据;另一个是readOnly模块,负责读取PHY芯片的数据。架构简单使用,如下图所示。
在这里插入图片描述
Readonly模块负责接收UDP数据包和ARP请求报文,其他的报文一概忽略。将eth_rd_clk源同步接口的随路时钟接入BUFG全局网络,在模块内,使用该时钟作为用户时钟。rd_ctrl信号经过idelay固定延时15x78ps=1170ps,这是因为RTL8211芯片没有采用延时模式(见2.1节),实际测试中采用这个延时数据接收稳定。对数据信号rd_data做同样的处理。Rd_ctrl经IDELAYE2输出ctrl_delay信号,该信号进入IDDR原语模块,输出SDR信号iddr_ctrl[1:0],由iddr_ctrl[1]&iddr_ctrl[0]生成数据有效信号eth_sdr_valid。对于数据信号rd_data,也是先经过IDELAYE2调整数据窗口,然后经过IDDR变成SDR信号eth_sdr_data。获取到数据同步信号eth_sdr_valid和有效数据eth_sdr_data之后,按照前导码、定界符等一系列帧格式,解析出ARP请求报文跳入ARP处理段(sequence_cnt22-50),根据ARP请求报文的ip地址和mac地址作为Writeonly模块的对端地址;同时生成arp_req_done信号,指示WriteOnly模块发起一次ARP响应。当收到UDP报文转到UDP处理段(sequence_cnt71-100),并将解析到的应用层数据保存到fifo中,输出有效字节个数信号rec_byte_num,输出rec_pkt_done信号指示WriteOnly信号发起一次UDP包传输。
Readonly模块负责发送UDP数据包和ARP应答报文。当收到ARP应答指示时,按照接收的ip地址和mac地址打包ARP应答数据,并在最后添加FCS校验字段,将生成的SDR的数据同步信号port_end和数据信号port_data_d分别进入ODDR生成DDR信号发送到RGMII接口上。收到UDP发送指示的时候,则按照UDP数据包格式打包,与ARP处某些固定字段不同之外,多了一个IP首部校验和字段(见2.6节),还涉及发送字节有效个数的问题,当不足18字节时,要补全。另外,校验模块输入有效信号和有效数据延迟一个周期才能出现校验值,为了将这个校验数据准确的打包到UDP数据包中还是做了一点处理,需要注意。写数据的用户时钟直接由pll提供,千兆模式RGMII对应125MHz,RGMII接口上的时钟也是由pll提供,与用户时钟同频率,不同的是相位有90°的偏差(由于未采用延时模式)。
关于代码中用到的原语的具体的配置将在系列文章的原语部分做介绍,本文不在做解释。为接收到小于18Bytes数据时,采用dummy数据填充至18字节产生的正确的效果。
当自己构建逻辑代码时,应该注意以下几点,①芯片延时模式未设置带来的时钟与数据的相位关系不同,在我的硬件环境中明确了发送数据为pll出来的125MHz作为用户时钟,125MHz偏差90°的相位时钟作为源同步时钟。②FCS采用CRC校验算法,是发送过程中很重要的一环,一旦出错,上位机将丢弃这个数据。③RGMII时序简单,但也应该稍微注意,例如在校验字段若数据有效信号拉低,则会导致校验数据无法正确发送,以至于上位机无法收到数据包。④关于ip首部校验,是在被校验的数据还没有填充完毕的时候就填出,因此需要单独的逻辑进行ip首部的16bit累加和校验。⑤现在的回环程序是在一帧之内的数据完成的,如果要是多帧连续发送,应该注意,两针之间千兆网的速度应该是有960ns 的间隔的。⑥接收数据因为时钟与数据的对应关系不对齐,因此需要添加idelay原语进行延迟,使数据对齐,目前程序中使用了200MHz的参考时钟,使用了15个抽头指,15*78ns的延迟,当数据不对齐的时候,明显的错误是把a4变成了f4等,大部分数据对,小部分数据异常的情况。⑦注意ODDR的ddr-sdr转换为i与i+4。

3.UDP接收验证

基于第一节成功获取ARP应答之后,创建UDP工程(里面含ARP的实现,该工程的ARP实现验证过程与第一节一致,在第5节附上下载链接),其代码搭建的思路按照第四节,此处先介绍使用这个代码该如何一步步验证。
首先要关注上位机到下位机的UDP数据是否发送成功,下图以此展示了上位机的发送状态,上位机单击发送之后wireshark的抓包状态,以及抓到的UDP下行包的具体内容与上位机发送的数据一致。然后使用ILA抓取到的接收到的数据与上位机的发送数据一致,证明接收链路与接收逻辑都正确。
在这里插入图片描述
下图为FPGA接收下行数据,与上图对比一致。
在这里插入图片描述

4.UDP发送验证

首先,通过ILA抓取到FPGA发送出来的数据,数据帧格式各字段都正确。然后看到wireshark找到UDP上行数据,显示上行数据内容与FPGA发送数据一致,最后在网口调试助手中看到,接收数据与FPGA发送数据一致,也与上位机下发数据一致。
在这里插入图片描述
在这里插入图片描述

5.总结与思考

关于上位机的开发非常简单,需要三个动作。①第一个动作是根据协议和ip地址以及当前的端口获取该端口的监控权。②通过检测readready信号,当数据来临的时候,通过readDatagram获取网口的数据到QByteArray。③通过writeDatagram函数向指定的ip和端口发送数据。与自己开发的上位机的联调结果如下,链接如下:Qt实现网络调试助手
在这里插入图片描述思考:
①在实际应用场景中,多是大量数据的发送,如何对该模块进行调用值得思考,这种场景可以是采集视频数据上行,或者发送图片数据下行,可以尝试构建如采集摄像头数据进入SDRAM,再通过网口回传到上位机显示的应用。或者通过以太网下发图片到DDR,然后在显示到TFT上。
②xilinx官方提供了一个用于实现以太网应用的ip核叫做TEMAC,Tri Mode Ethernet MAC,可以尝试通过这个IP实现数据收发功能。
③数据收发模块从逻辑上将可以有多种实现方式,综合考虑时序优化,资源节约的情况下可以做不同的尝试。
④如果工程复杂,可以考虑实现FPGA可以主动的发起ARP请求,在现有程序的基础上,做到这一点并不复杂。

6.传送门

  • 我的主页
  • FPGA通信接口专栏汇总导航
  • 手动ARP应答工程
  • UDP工程链接
  • 我的主页
  • FPGA通信接口汇总导航
  • UDP网口(1)概述

🔈文章原创,首发于CSDN论坛。
🔈欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🔈欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


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

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

相关文章

node+mysql实现(账户密码,阿里云短信验证,QQ邮箱注册登录,短信验证密码重置,邮箱密码重置)之注册,登录密码重置总篇

node+mysql实现账户登录 注意效果图项目插件代码参数说明短信验证模块邮箱验证模块注册方式登录方式密码重置前端页面部分登录页面账户登录页面(login.html)短信验证登录页面(smsLogin.html)邮箱登录页面(emailLogin.html)注册部分页面短信验证注册页面(register.html)邮…

Profinet 转 EtherCAT 主站网关

一、功能概述 1.1 设备简介 本产品是 PN(Profinet)和 ECAT(EtherCAT)网关,通过数据映射方式工作。 本产品在 PN 侧作为 PN IO 从站,接西门子 PLC 的 Profinet 口;在 ECAT 侧 做为 ECAT 主站,接 ECAT 从站,如伺服驱…

懒人精灵安卓版纯本地离线文字识别插件

目的 懒人精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务,节省大量人工操作的时间。懒人精灵也包含图色功能,识别屏幕上的图像,根据图像的变化自动执行相应的操作。本篇文章主要讲解下更优秀的…

nacos2.x作为配置中心和服务注册和发现以及springcloud使用

目录 一、nacos是什么 二、windows下安装配置nacos 1、准备 2、安装nacos 3、配置nacos 4、启动并且访问nacos 三、springcloud使用nacos作为配置中心 四、springcloud使用nacos进行服务注册与发现 五、springcloud使用nacos进行服务消费 六、nacos的一些高级配置 1…

IP地址申请HTTPS证书

申请IP地址的HTTPS证书是一个相对简单但需要仔细操作的过程。选择合适的CA机构,明确所需证书类型,按照规定步骤提交申请并验证信息,最后正确安装和部署,即可实现通过IP地址访问的安全HTTPS连接。 下面是具体的申请流程&#xff0…

云盘高速视觉检测机,如何提高螺丝件的检测效率?

螺纹螺丝钉是一种常见的螺纹结构紧固件,通常由金属制成,具有螺旋状的螺纹结构。这种螺丝钉旨在通过旋入螺纹孔或材料中,实现可靠的固定连接。 螺纹螺丝钉具有螺旋状的螺纹结构,使其能够轻松旋入金属或其他硬质材料。主要用于金属…

Spring Boot 引入 Guava Retry 实现重试机制

为什么要用重试机制 在如今的系统开发中,为了保证接口调用的稳定性和数据的一致性常常会引入许多第三方的库。就拿缓存和数据库一致性这个问题来说,就有很多的实现方案,如先更新数据库再删除缓存、先更新缓存再更新数据库,又或者…

江苏省发改委副主任钱海云一行莅临我司调研指导

近日,江苏省发改委副主任钱海云、支援合作处副处长卢桐、调研员鲁培和一行,在江宁开发区管委会及市、区发改委有关负责人陪同下,莅临南京天洑软件有限公司走访调研。天洑软件总工程师郭阳博士携管理层参与本次调研活动。 在参观过程中&#x…

【C++】选择结构- 嵌套if语句

嵌套if语句的语法格式&#xff1a; if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数&#xff0c;根据分…

通过 Function-Call Input Events启用图表中的控制状态

在由function-call input event启用的图表中&#xff0c;可以通过设置启用图表时的状态属性来控制状态的行为。根据此属性的值&#xff0c;当输入事件重新启用图表时&#xff0c;状态要么保持其最新值&#xff0c;要么恢复为初始值。要修改属性&#xff0c;请执行以下操作&…

一文读懂《制造业数字化转型行动方案》

​在推动新型工业化与构建现代化产业体系的宏伟蓝图中&#xff0c;制造业的数字化转型无疑是至关重要的一环。随着国务院常务会议正式批准《制造业数字化转型行动方案》&#xff08;简称《方案》&#xff09;&#xff0c;标志着我国制造业正式迈入了一个全面拥抱数字化、智能化…

C++迈向精通:STL-iterator_traits迭代器类型萃取解析

STL-iterator_traits迭代器类型萃取解析 源码 在阅读STL源码的时候遇到了这样的一行代码&#xff1a; 通过ctags跳转到对应的定义区域&#xff1a; 下面还有两个特化版本&#xff1a; 根据英文释义&#xff0c;发现模板中需要传入的是一个迭代器类型&#xff0c;在上面找到源…

NAND Flash 的 SDR、ONFI、DDR 接口

NAND Flash 的 SDR、ONFI、DDR 接口 1. 省流导图 2. SDR、ONFI、DDR 概述 2.1 SDR (Single Data Rate) SDR&#xff08;Single Data Rate&#xff09;是指读写数据使用 单个时钟信号的边缘&#xff0c;即上升沿或下降沿 。在 SDR 模式下&#xff0c;数据的传输速率受限于时钟…

用友U8 Cloud MeasureQueryFrameAction接口处SQL注入漏洞复现 [附POC]

文章目录 用友U8 Cloud MeasureQueryFrameAction接口处SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现用友U8 Cloud MeasureQueryFrameAction接口处SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿…

【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(上)

【Gin】深度解析&#xff1a;在Gin框架中优化应用程序流程的责任链设计模式(上) 大家好 我是寸铁&#x1f44a; 【Gin】深度解析&#xff1a;在Gin框架中优化应用程序流程的责任链设计模式(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&#xf…

Jenkins的相关概述和安装

Jenkins 1.什么是jenkins Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。耗内存max 2. 为什么使用Jenkins 拉取、编译、打包…

AI绘画入门实践|Midjourney:使用 --no 去除不想要的物体

在 Midjourney 中&#xff0c;--no 作为反向提示词&#xff0c;告诉 MJ 在生成图像时&#xff0c;不要包含什么。 使用格式&#xff1a;--no 对应物体提示词&#xff08;多个物体之间使用","间隔&#xff09; 使用演示 a web banner, summer holiday --v 6.0 a web b…

变阻器在实际应用中需要注意哪些安全事项?

变阻器是广泛应用于电子设备中的电子元件&#xff0c;它可以改变电阻值以控制电流的大小。然而&#xff0c;在实际应用中&#xff0c;如果操作不当&#xff0c;可能会引发一些安全问题。因此&#xff0c;使用变阻器时&#xff0c;必须注意以下安全事项&#xff1a; 1. 选择合适…

windows wsl ubuntu系统安装桌面可视化

参考&#xff1a; https://www.bilibili.com/read/cv33557374/ 1&#xff09;首先先安装好wsl ubuntu系统 2&#xff09;安装 Ubuntu 桌面版 sudo apt purge -y acpid acpi-support modemmanagersudo apt-mark hold acpid acpi-support modemmanager sudo apt install ubunt…

UE4如何直接调试Game

某些功能在编辑器里不好调试&#xff0c;例如Pak&#xff0c;就需要直接调试 Game&#xff0c;做法是选择 Game&#xff0c;不要选择Client&#xff0c;加断点&#xff0c;然后点击 Debug 就好了。 断点调试成功&#xff1a; 同时看到界面&#xff1a;