目录
一.UDP简介
1.1UDP概述
1.2UDP协议
二.实验任务
三.模块设计
3.1总体模块设计
3.2UDP模块设计
3.2.1udp_rx模块设计
3.2.2udp_tx模块设计
四.板级验证
一.UDP简介
1.1UDP概述
1.2UDP协议
可以看出UDP和ICMP在以太网帧里面的位置一样。
二.实验任务
本节实验任务是上位机通过网口调试助手发送数据给 FPGA,FPGA 通过以太网接口接收数据并将接收到的数据发送给上位机,完成以太网 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就是下图中的蓝色用户数据。
3.2.1.3状态转换图
整体与icmp实验完全一样。注意:在中间状态如前导码错误、MAC 地址错误、协议类型错
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通信正常。