TCP/IP协议栈设计—UDP/IP协议栈设计与实现(接收部分)
TCP/IP协议栈设计—UDP/IP协议栈设计与实现(接收部分)
前言:要实现基于FPGA的TCP硬件协议栈,需要充分了解以太网通信协议,因此先展开对UDPIP的实现。经过一年来不断的探索,最近从新设计并优化了UDPIP协议栈,内容较多,因此分为接收、发送两个部分2篇文章,来介绍UDPIP的调试与实现过程。
文中主要目录:
一、对MAC层数据进行解析;二,对ARP数据层进行解析;三、IP协议的解析;四、UDP协议的解析;五、UDP数据的发送组帧;六、IP数据的发送组帧
20191031 周四
一、对MAC层数据进行解析
子模块为:mac_rx_parsing.v 测试文件为:tb_mac_rx_parsing.v
代码顶层接口:
解析ARP帧时,结果如下2图,仿真正确。
接收IP帧时的解析如下:
二,对ARP数据层进行解析
子模块为:arp_rx_parsing.v 测试文件为:tb_arp_rx_parsing.v
代码顶层接口:
针对ARP协议的分析代码如下:
ARP仿真结果如下:图中可见,各个参数均提取正确。
三、IP协议的解析
子模块为:ip_rx_parsing.v 测试文件为:tb_ip_rx_parsing.v
代码顶层接口:
仿真结果如下::当接收到ICMP数据时,成功解析
继续接收UDP数据时,成功解析:
当收到TCP数据时,成功解析:
四、UDP协议的解析
继续往下层解析,先对UDP协议解析。
子模块为:udp_rx_parsing.v 测试文件为:tb_udp_rx_parsing.v代码顶层接口:
仿真结果如下:
UDP接收解析的开始部分,以及第一个UDP数据存入RAM,均正确。
接收尾部如下,见图中注释:
五、UDP数据的发送
本计划是,继续完成ICMP和TCP数据的解析。但做到现在,考虑到测试完整性。就是,针对某个功能,要做实际的完成测试,才能真正地确保设计的正确性。而且老绿道TCP解析的复杂性。因此,先有必要先把ARP和UDP的发送功能做了。在此,先做UDP数据的发送部分设计。
子模块为:udp_tx_framing.v 测试文件为:tb_udp_tx_framing.v
模块代码顶层接口:
UDP组帧的核心代码部分如下:
在接收部分的校验和数据段预处理代码如下:
校验和计算,UDP首部给出仿真如下:执行正确。
对此UDP帧,全帧的校验和计算值为 8ED3。
小结:设计中,针对整个接收的UDP帧计算了校验和,考虑过用户自定义发送时的情形,留出了接口,但在程序中暂未实现。目前,首要考虑的是,实现UDP接收与回传。
在本次分层设计中,UDP_TX解析层给出了计算好的UDP首部,但发送控制和UDP数据提取,交由上层(即IP)来控制。在此UDP层中,不做UDP数据的传输。正是出于分层简化的考虑,进行了如此的设计。
当上一层,检测到 udp_tx_ready = 1 的时候,就可以直接加上UDP首部+接收的UDP数据,再打包就可以发送了。
UDP接收端的校验和计算:
奇数字节时,会多计算一次:
数据个数偶与奇前后校验和的值:
经过WireShark和仿真计算的结果做对比,计算值一致。
六、IP数据的发送
将准备好的UDP首部,继续往上层封装,完善IP首部,并给出IP首部,交给MAC层启动发送。
子模块为:ip_tx_framing.v 测试文件为:tb_ip_tx_framing.v
IP层子模块接口:
IP首部仿真如下,校验和计算正确,首部给出正确。
在IP层进行整个数据的发送组帧,此部分(接收解析),实现对接收数据的解析、分类、提取,完成校验和计算,并准备好回环发送的数据帧头信息。
欢迎交流、分享,笔者扣扣:1021100382