如何查询到某网站开发商,鞍山发布,什么网站广告做多,怎样做网络推广甄选广州豪升网络在之前章节中#xff0c;笔者就IP层之分片包的整合处理进行了概念介绍#xff0c;以及代码编写和仿真#xff0c;在整体代码调试环节#xff0c;笔者发现了一个问题#xff0c;在本文中#xff0c;笔者将就这个BUG进行说明#xff0c;以及进行修复#xff0c;讲解代码实…在之前章节中笔者就IP层之分片包的整合处理进行了概念介绍以及代码编写和仿真在整体代码调试环节笔者发现了一个问题在本文中笔者将就这个BUG进行说明以及进行修复讲解代码实现思路验证代码逻辑正确性 注意看图片中的框选文字这里说明如何确定这是一个单帧包这里的确定单帧包逻辑是不存在问题但是直接将UDP报文输出是存在问题的因为即使确定了当前输入进来的数据报文不是分片包但该报文的的上一帧报文可能是分片包而由于分片包要进行巨型帧组合后输出其报文长度可能为9000字节以上假设,那么当前帧报文传输来时巨型帧报文可能尚未传输完成此时的输出数据总线是被巨型帧报文占用的。而根据输出赋值的优先级会出现巨型帧输出不完全被新一帧数据报文顶替输出以及当前报文优先级低无法获得总线使用权报文丢失所谓的优先级即是在一个时序控制逻辑内else if的上下级当两个else if语句满足时总是先执行最上面的else if语句单纯的文字解释这个问题可能会给读者的理解造成混乱笔者接下来就流程示意框图、代码仿真波形两方面展现这类情况使得读者更加清晰的理解这些逻辑 上图所示便是一种情况在RAM中整合了三包分片数据包之后进行数据帧输出此时接连来了两包单包 此时这两个单包按照之前的逻辑是会顶替当前包输出的造成数据混乱代码仿真如下图所示 图片一模拟了流程图中的情况而图片二中则显示了这样的数据流动出现的问题接下来将就这种现象进行解决方案的思考。 显然为了避免这种情况需要判断此时的数据输出总线是否被占用如果数据输出总线被占用则应该缓存本帧数据待到数据输出总线空闲再进行数据的读取同时若是数据到来时数据输出总线是空闲的则不需要缓存数据直接进行输出减少不必要的时间浪费。 那么还有一个问题数据输出总线被占用期间可能有多帧数据到来都需要被缓存那么数据长度同样应该被缓存在本处理模块中不涉及数据类型因为其下一级在本设计中一定属于UDP报文所以不考虑数据类型的缓存当涉及TCP/UDP两种报文时会就IP_RX模块中的输出信号进行添加这在之后讲解的TCP协议栈实现中会进行具体介绍大家可以点个关注后续会有更多文章分享。 对于这些单帧数据包使用FIFO进行数据缓存使得逻辑处理简单同时还需要注意一个问题每次读取指定长度后还需要暂缓下一帧数据的输出避免背靠背传输对数据总线处理的压力。
代码的主要难点是以下几方面
缓存分片数据包并在缓存完成后进行输出在分片数据包输出过程中多个单包数据包到来缓存至FIFO在单包数据包输出过程中再次到来单包数据包因为分片包导致的数据堆积缓存至FIFO两个单包从FIFO中读出时输出间隔问题保证输出间隔大于10个周期减轻后续处理压力以及背靠背传输导致数据包输出长度计算错误问题评定各种情况优先级合理规划缓存以及读取针对以上难点应该多进行代码仿真找出时序存在问题中进行对应修改多仿真是写出好代码的关键
整体仿真测试时序
首先发送3472字节的巨型帧分三次发送1480–1480–512之后发送512字节单包多次128字节单包–在巨型帧尚未缓存完毕以及巨型帧尚未输出完成之后发送128字节单包–在输出总线输出单包数据时最后发送128字节单包-在输出总线空闲时候
initial begin#200/*ip frag*/(posedge i_udp_clk)ip_frag_send(0,d1480,1,0);#400(posedge i_udp_clk)ip_frag_send(d0,d1480,1,185);#400(posedge i_udp_clk)ip_frag_send(d0,d512,0,370);#400(posedge i_udp_clk)ip_frag_send(d0,d512,0,0);#400(posedge i_udp_clk)ip_frag_send(d0,d128,0,0);#400(posedge i_udp_clk)ip_frag_send(d0,d128,0,0);#400(posedge i_udp_clk)ip_frag_send(d0,d128,0,0);#400(posedge i_udp_clk)ip_frag_send(d0,d128,0,0);#20000(posedge i_udp_clk)ip_frag_send(d0,d128,0,0);#20000(posedge i_udp_clk)ip_frag_send(d0,d128,0,0);
end情况一对应仿真情况如下可以看出分片包成功组合数据长度3472字节输出时序正确。 情况二对应仿真情况如下可以看出在巨型帧缓存输出完成后被缓存的单帧数据包成功进行输出。 情况三对应仿真情况如下可以看出在输出单包数据完成后在单包数据输出期间被缓存的单帧数据包成功进行输出。 情况四对应仿真情况如下可以看出在总线空闲期间到的数据包被直接输出不需经过缓存。 经过上述仿真模拟各种可能出现的情况经验证后输出时序正确不会出现数据错误、覆盖、丢失等现象。 关于本次代码的实现、调试思路。大家有什么问题欢迎在评论区中进行讨论有哪些考虑不到的地方也请大家批评指正可以关注下作者后续会进行更多技术文章分享。 在下一章节中笔者会将之前介绍的模块进行整合组合成最终的UDP协议栈当然还不包括PHY层的处理关于PHY层的处理笔者也会在之后的章节进行介绍以及UDP的上层及应用层协议如IEEE1588笔者也会进行介绍。