自学内容网 自学内容网

以太网模块问题及优化

  在使用以太网发送摄像头数据到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。如果后续出现问题依旧会在该文件夹下更新工程。


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

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


原文地址:https://blog.csdn.net/weixin_50810761/article/details/136413231

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!