以太网模块问题及优化

  在使用以太网发送摄像头数据到PC端时,发现了之前编写以太网发送模块的两个小问题,对实际使用有一定的影响,本文将问题指出来并进行修正。

  问题一:为了方便设计,工程直接把以太网发送模块的忙闲指示信号输出作为用户端口的udp发送模块忙闲指示信号,存在的问题是用户把udp发送使能信号拉高后,udp发送模块忙闲指示信号会滞后一个时钟周期才能拉低,并不能马上拉低。

  如下图所示,udp_tx_en是提供给用户的udp发送使能信号,拉高该信号后,udp发送模块忙闲指示信号udp_tx_rdy会延迟一个时钟才会被拉低。这对于我这种喜欢通过计数rdy拉高时钟个数来记录发送报文个数的人来说,很不方便。

  tx_rdy信号是以太网发送模块的忙闲指示信号,该模块最初的设计就是两个信号复用,eth_tx_start是以太网发送模块的发送使能信号。

在这里插入图片描述

图1 rdy信号问题

  造成上述延时的原因是因为该以太网模块在发送用户数据的同时,可能需要发送来自PC端的ARP请求和回显请求的应答数据报文,所以需要进行调度,eth_tx_start至少会滞后eth_tx_en两个时钟周期。

在这里插入图片描述

图2 信号联系

在这里插入图片描述

图3 信号联系

  修改方式其实很简单,只需要在以太网控制模块中重新生成udp_tx_rdy信号即可,如下图所示。

在这里插入图片描述

图4 修改代码

  修改之后,使用ila抓取信号如下所示,当udp_tx_en拉高时,udp_tx_rdy会立即拉低,不会有延时,用户就可以通过udp_tx_rdy的状态判断能不能发送udp使能信号了。

在这里插入图片描述

图5 忙闲指示信号修改后时序

  问题二:前文可知,在udp_tx_en拉高后,需要至少延时两个时钟eth_tx_start才会被拉高,但是有一个信号udp_tx_data_num没有进行寄存,会出现数据丢失。造成用户发送数据包的长度错乱,因此在控制模块中增加对需要发送报文长度的寄存器,对应代码如下所示:

在这里插入图片描述

图6 寄存udp数据长度

  由于udp_tx_en与udp_tx_data_num对齐,而eth_tx_start滞后eth_tx_en至少两个时钟,所以不需要修改其余代码。

  然后综合工程,进行arp应答和回显请求测试,结果如下所示,证明以太网数据链路没有问题。

在这里插入图片描述

图7 回显应答

  然后通过网络调试助手进行回环测试,进行循环发送测试,最后网络调试助手接收和发送的数据报文保持一致,由于这上位机发送报文间隔最小为1ms,就只能测试这么多了。

在这里插入图片描述

图8 UDP回环测试

  上述两个问题会在特定的时候影响发送数据,所以做出了修改,在移植该工程的时候,还是需要把时钟简单约束一下,不然可能会有一些奇怪的问题。

  修改后的工程依旧可以在公众号后台回复“基于FPGA实用UDP设计”(不包括引号)获取,只不过版本变为1。如果后续出现问题依旧会在该文件夹下更新工程。


  如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!

  如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!

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

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

相关文章

Mysql与StarRocks语法上的不同

🐓 序言 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,可以用StarRocks 来支持多种数据分析场景的极速分析。 🐓 语法…

Rust学习笔记:深度解析内存管理(二)

在这个信息爆炸的时代,学习一门新的编程语言不仅仅是为了找到一份好工作,更是为了打开思维的新窗口。Rust,作为一门注重安全、速度和并发的系统编程语言,正吸引着越来越多的年轻开发者的目光。今天,我们将一起深入探讨…

IDEA开发环境热部署

开发环境热部署 在实际的项目开发调试过程中会频繁地修改后台类文件,导致需要重新编译重新启动,整个过程非常麻烦,影响开发效率。Spring Boot提供了spring-boot-devtools组件,使得无须手动重启SpringBoot应用即可重新编译、启动项…

健身房预约系统开发 打造个性化训练计划

在快节奏的现代生活中,时间变得尤为宝贵。传统的健身房排队、等待不仅浪费了你的时间,还可能让你错过宝贵的锻炼机会。通过预约系统,你可以提前规划自己的健身时间,避免排队等待的烦恼。只需简单几步操作,就能预约到心…

2024最新算法:河马优化算法(HO)求解23个基准函数

一、河马优化算法 河马优化算法(Hippopotamus optimization algorithm,HO)由Amiri等人于2024年提出,该算法模拟了河马在河流或池塘中的位置更新、针对捕食者的防御策略以及规避方法。河马优化算法的灵感来自河马生活中观察到的三…

2.模拟问题——2.使用二维数组输出图形

用二维数组描述图形 首先要计算出整个输出的方框大小&#xff0c;从而判定相应关键循环点 #include <cstdio> char arr[1000][3000]; int main() {int h;//初始化&#xff0c;全部内部填空格while(scanf("%d",&h) ! EOF){for (int i 0; i < h; i) {f…

如何设置从小程序跳转到其它小程序

​有的商家有多个小程序&#xff0c;希望能够通过一个小程序链接到所有其它小程序&#xff0c;用户可以通过点击跳转链接实现从一个小程序跳转到另一个小程序。要怎么才能实现这样的跳转呢。下面具体介绍。 1. 设置跳转。在小程序管理员后台->分类管理&#xff0c;添加一个…

数据结构测试题

目录 1.闰年判断 2.志愿者选拔 3.单词接龙 4.对称二叉树 5.英雄南昌欢迎您 6.时间转换 7.矩阵乘法 8. Huffuman树 1.闰年判断 题目描述&#xff1a; 给定一个年份&#xff0c;判断这一年是不是闰年。 当以下情况之一满足时&#xff0c;这一年是闰年&#xff1a; 1. 年…

ubuntu20.04设置docker容器开机自启动

ubuntu20.04设置docker容器开机自启动 1 docker自动启动2 容器设置自动启动3 容器自启动失败处理 1 docker自动启动 &#xff08;1&#xff09;查看已启动的服务 $ sudo systemctl list-units --typeservice此命令会列出所有当前加载的服务单元。默认情况下&#xff0c;此命令…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法&#xff0c;这种方法通常只在平面视图中适用&#xff0c;在三维视图中也是无法创建的&#xff08;目前研究的是这样的&#xff0c;如果有其他方法&#xff0c;请赐教&#xff09;。 本片文章介绍一个下在立面视图中创建FilledRegio…

《Spring Security 简易速速上手小册》第6章 Web 安全性(2024 最新版)

文章目录 6.1 CSRF 防护6.1.1 基础知识详解CSRF 攻击原理CSRF 防护机制最佳实践 6.1.2 重点案例&#xff1a;Spring Security 中的 CSRF 防护案例 Demo测试 CSRF 防护 6.1.3 拓展案例 1&#xff1a;自定义 CSRF 令牌仓库案例 Demo测试自定义 CSRF 令牌仓库 6.1.4 拓展案例 2&am…

跨域引起的两个接口的session_id不是同一个

来源场景&#xff1a; RequestMapping(“/captcha”)接口设置了SESSION_KEY&#xff0c;也能获取到&#xff0c;但是到了PostMapping(“/login”)接口就是空的&#xff0c;由于跨域导致的两个session_id不是同一个 /*** 系统用户 前端控制器*/ Controller CrossOrigin(origins…