以太网UDP测试实验

目录

一.UDP简介

1.1UDP概述

1.2UDP协议

二.实验任务

三.模块设计

3.1总体模块设计

3.2UDP模块设计

3.2.1udp_rx模块设计

3.2.2udp_tx模块设计

四.板级验证 


一.UDP简介

1.1UDP概述

           UDP (User Datagram Protocol)用户数据协议 是一种面向无连接的传输层协议,属于 TCP/IP 协议簇的一种。 UDP 具有消耗资源少、通信效率高等优点,通常用来传输音频、视频等对实时性要求高的场合。
           UDP TCP 是传输层中非常重要的两个协议,以下是两者的区别。

1.2UDP协议

        可以看出UDP和ICMP在以太网帧里面的位置一样。

        UDP 首部共 8 个字节,同 IP 首部一样,也是一行以 32 位( 4 个字节)为单位。
        源端口号 16 位发送端端口号,用于区分不同服务的端口,端口号的范围从 0 65535
目的端口号: 16 位接收端端口号。
        UDP 长度 16 UDP 长度,包含 UDP 首部长度 + 数据长度,单位是字节( byte )。
        UDP 校验和 16 UDP 校验和。 UDP 计算校验和的方法和计算 IP 数据报首部校验和的方法相似,但不同的是 IP 数据报的校验和只检验 IP 数据报的首部,而 UDP 校验和包含三个部分: UDP 伪首部, UDP 首部和 UDP 的数据部分。伪首部的数据是从 IP 数据报头和 UDP 数据报头获取的,包括源 IP 地址,目的 IP地址,协议类型和 UDP 长度,其目的是让 UDP 两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。

二.实验任务

         本节实验任务是上位机通过网口调试助手发送数据给 FPGAFPGA 通过以太网接口接收数据并将接收到的数据发送给上位机,完成以太网 UDP 数据的环回。同时电脑可以通过命令行窗口发送 ping 命令给 FPGA,FPGA 通过以太网接口接收数据并将接收到的数据发送给电脑,完成以电脑 ping 开发板的实验测试。

三.模块设计

3.1总体模块设计

PLL模块:因为gmii_to_rgmii模块中的输入延时控制IDELAYCTRL中需要用到PLL倍频输出的200MHZ时钟。

FIFO模块:以太网单次会接收到大量数据,因此本次实验需要一个 FIFO 模块用来缓存数据,由于本次实验所使用的 GMII 接收时钟和 GMII 发送时钟实际上为同一个时钟,但是为了方便后面实验因此这里使用的是异步 FIFO。 

arp模块:根据arp协议对接收数据进行解析,并按照arp协议格式发送报文。

icmp模块:根据icmp协议对接收数据进行解析,并按照icmp协议格式发送报文。

udp模块:根据udp协议对接收数据进行解析,并按照udp协议格式发送报文。

rth_ctrl模块:因为arp、icmp、udp模块的数据不能同时进入FIFO缓存,因此该模块控制选择此3个模块中的某一个缓存进入FIFO。

3.2UDP模块设计

         这里模块设计思路和ICMP实验中一样。

3.2.1udp_rx模块设计

3.2.1.1整体模块设计图

 3.2.1.2波形图

               gmii_rx_dv:当复位信号rst_n拉高后,该信号在下一个脉冲来临时也拉高,代表GMII 输入数据有效信号,然后gmii_rxd[7:0]开始输入以太网报文。

               rec_en:当接收数据到下图中的蓝色数据段时,rec_en开始拉高,rec_data就是下图中的蓝色用户数据。

            rec_byte_num : 为以太网接收的有效字数,主要用于统计以太网接收的有效字数,在当数据接收完成后,将该信号的数据传递到发送模块。
 3.2.1.3状态转换图

           整体与icmp实验完全一样。注意:在中间状态如前导码错误、MAC 地址错误、协议类型错

误、不是 UDP 协议错误以及 IP 地址错误时跳转到 st_rx_end 状态而不是跳转到 st_idle 状态。因为中间状态在解析到数据错误时,单包数据的接收还没有结束,如果此时跳转到 st_idle 状态,此时eth_rxdv为1,会误把有效数据当成前导码来解析,所以状态跳转到 st_rx_end 。而 eth_rxdv 信号为 0 时,单包数据才算接收结束,所以 st_rx_end 跳转到 st_idle 的条件是 eth_rxdv=0 ,准备接收下一包数据。
3.2.1.4代码+仿真波形解析
3.2.1.4.1空闲状态

         空闲状态下,gmii_rx_dv为高电平,并且gmii_rxd传入一个8位55信号,代表要开始接收以太网报文,因此跳转至下一状态。

         仿真时,将gmii_tx_en赋值给gmii_tx_en,代表仿真时udp模块中的接收数据和发送数据是同步进行的。

         下图中的仿真波形的红色代表该空闲状态下的波形。

    

3.2.1.4.2接收前导码状态

           根据以太网帧报文格式,接收7个8‘h55+1个18'hd5。因为空闲状态下已经接收一个8’h55,因此这里只接收 6个8‘h55+18'hd5即可。只要任何一个8位数据出错,就发出error信号,停止接收。

           仿真时 发送的数据就是接收的数据。

3.2.1.4.3接收以太网帧头状态

                该状态下接收6Byte目的MAC地址+6Byte源MAC地址+2Byte以太网协议类型。并判断目的MAC地址和以太网类型协议是否有误,因为该实验是UDP测试(UDP位于IP协议中)实验,若协议类型例如 0x0800 代表 IP 协议(网际协议)、0x0806 代表 ARP 协议(地址解析协议)。

               由仿真波形可知,接收的目的MAC地址为ffffff(广播类型),接收的以太网协议为0800,均无误。 

3.2.1.4.4 接收IP首部状态

         该段代码作用有二,第一判断协议类型是icmp还是udp, ICMP 为 1 , TCP 为6, UDP 为 17 ,若不是则发出error信号。第二是判断目的IP地址是否为开发板的IP,若不是则发出error信号,终止接收数据。

       结合前面状态整合下来就是判断报文是不是IP协议,是进一步判断是不是UDP协议,还有目的MAC地址和IP地址。

      当仿真位于cnt=0时,5X4=20,故gmii_rxd=20。

     当仿真位于cnt=9时,gmii_rxd=17,结合icmp实验中的 ICMP 为 1 , TCP 为6, UDP 为 17,可知该报文数据是UDP协议。 

 由仿真图可知,发送的目的IP地址为192.168.1.10和开发板的IP保持一致,des_ip是16进制的目的IP。

 3.2.1.4.5接收UDP首部状态

               该状态主要是获取 蓝色数据段的长度,根据仿真波形图可以看出,接收到的UDP长度为18,而UDP首部长度为8,18-8=10.

3.2.1.4.6接收数据段状态

         该状态的作用有二,第一将接收到的数据暂存起来,第二暂存接收的数据段长度

         由仿真波形可知,一共接收了10个数据,故长度为10.当接收完毕后,代表一包以太网数据接收完,故rec_pkt_done拉高。 

 3.2.1.4.7终止状态

            该状态作用是接收填充数据段和crc校验码,因为上面数据段共10个,还需填充8个,紧接着是crc校验码,以上全部接收完毕则跳转至空闲状态。 

3.2.2udp_tx模块设计

3.2.2.1整体模块设计图

 3.2.2.2波形图

              tx_start_en:当复位信号拉高后,该信号持续一个脉冲,表示可以开始发送以太网数据 。

              gmii_tx_en:为 GMII 输出数据有效信号,gmii_txd GMII 输出数据,当 gmii_tx_en 信号拉高,GMII 开始发送数据,当 gmii_tx_en 信号拉低表示数据发送完成。

              tx_req:表示从fifo中读数据请求。

              tx_done: 为以太网发送完成信号,当一包数据发送完成后且 CRC 校验完成后,tx_done 会拉高一个时钟周期,表示 UDP 发送完成。

3.2.2.3状态转换图

          同ICMP实验中的一样,只不过少了DCP首部和数据校验状态。 

3.2.2.4代码+仿真波形分析
3.2.2.4.1起始信号

           因为tx_start_en是异步信号,它来自udp_rx模块中的rec_pkt_done信号,这里捕捉它的上升沿变信号,因此需要对其打三拍。

 仿真文件中激励信号如下,代表清零信号消失后将tx_start_en拉高,并设置发送数据的字节数为10.

仿真波形如下。

3.2.2.4.2寄存各段长度

                以上代码的作用是依次计算出下图中的蓝色模块长度、绿色模块长度、紫色模块长度。

                         由下面仿真模型可知,10+28=38,10+8=18,仿真正确。 

3.2.2.4.3空闲状态

                         

                           该段代码作用有三。第一:按照上面两个表格将IP首部和UDP首部更新到变量ip_head中。第二:若arp包发来的目的ip地址有更新,则将IP更新到ip_head[4]中。第三:若目的MAC地址有更新,则将MAC新值更新到eth_head值中。若无更新,则采用默认值。

                          由于以上两个变量是中间变量,并非该模块的输入输出信号,故无仿真波形。

3.2.2.4.4IP首部校验模块

                       以上代码作用,将IP首部数据累加,累加和有进位继续累加,直至没有进位,将和按位取反,即可得校验值。

 3.2.2.4.5发送前导码

3.2.2.4.6发送MAC帧头

     包含6Byte目的MAC地址+6Byte源MAC地址+2Byte以太网协议类型。

      仿真波形中1是目的MAC,2是源MAC,3是IP协议类型。

3.2.2.4.7发送IP首部+UDP首部

             该状态作用有二。第一发送IP首部+UDP首部。第二提前两个clk将向FIFO中读数据请求信号拉高。因为有时序延迟。

 仿真波形中的1相当于发送了上面表格的第一行;2相当于发送了表格中第二行数据;3相当于发送表格中第三行数据,4相当于发送了表格中第四行数据。

 

上面仿真波形中的1、2、3相当于依次发送了上面两个表格中的数据。

注意3中的tx_req,只有提前将该信号拉高,下面一个状态才能准时从FIFO中读取数据发送出去。

 3.2.2.4.8发送数据段

              该状态下,gmii_txd一直等于tx_data,只不过赋值区间在由别的计数器控制。当实际发送数据个数<18,则由real_tx_data_num=18控制,当实际发送个数大于18,则由data_cnt计数器控制。

       有下面仿真波形图可知,当发送完10个数据时,提前将tx_req拉低。并且剩余8个数据填充aa。

四.板级验证 

            首先设置PC端的IP地址如下。

   然后打开抓包工具wireshark,用于捕捉PC端和开发板发送的以太网报文。

      紧接着打开正点原子的网口调试工具,向开发板发送10个字节的数据。

         上图中1是第一次发送的报文,只发送了01.

         2是第二次发送的报文,发送了10个数据。

         3表示发送的报文包数。

         4表示总共发送的数据个数。

         5表示总共接收的数据个数。

         此时打开抓包工具,找到ARP协议

            1中代表电脑向开发板发送的ARP请求,2表示开发板向电脑回馈的ARP应答包含开发板自身的MAC地址。

1中代表电脑向开发板发送UDP协议报文,2表示开发板向电脑环回UDP协议报文。

3中表示端口号和校验码,4中表示发送的10个数据分别是01 02 03 04 05 06 07 08 09 10 

            上图展示的是开发板返回电脑端的报文数据,可以看出还回数据中 不足18字节,这里自动补充了8个数据。

          再次发送报文,只不过这次发送20个数据。

  上图中显示当发送数据大于18个,则不会再填充额外的数据。 

         上图显示ICMP通信正常。 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值