【技术分享】以太网,FPGA就一定能搞定系列之UDP传输实例
0赞以太网,FPGA就一定能搞定系列之UDP传输实例
本系列博文节选自特权同学的FPGA开发电子书《SF-CY3 FPGA套件开发指南》。
最新设计文档下载地址:http://pan.baidu.com/s/1em79m
1 概述
本实例的硬件系统和前面两个实例一样,只是在CH395芯片的应用上使用了不同的传输模式。本实例要传输的是UDP协议的IP包,只要设置CH395工作于UDP模式,设置好收发端口号,就可以收发UDP协议的IP包了。通过这个实例大家可以初步掌握UDP协议的传输和格式。
2 UDP协议解析
UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。UDP帧是IP帧的一种,它的协议格式如图所示。IP首部的协议字段数据必须为0x11(即10进制的17);在原有的IP数据报中,又分为了UDP首部和UDP数据两部分;UDP首部有2个字节的源端口号、2个字节的目的端口号、2个字节的UDP长度和2个字节的UDP校验和。
UDP是一个简单的,不可靠的,面向数据报文的运输层协议,传输速度较快,不能保证数据能达到目的地,必须由应用层来保证传输的可靠稳定。
如图所示,FPGA向CH395写入若干字节数据流后,CH395数据流封装在UDP数据部分进行发送。UDP一包可以发送的最大长度为1472字节,如果FPGA写入的数据流长度大于1472字节,CH395会将数据流封装成若干个UDP包进行发送且每包成功发送后都会产生SINT_STAT_SEND_OK中断。FPGA每次写入的字节长度不得大于发送缓冲区长度(2KB),且收到SINT_STAT_SENBUF_FREE中断后才可以进行下一次写数据。
当CH395接收到UDP报文后,将UDP数据复制到socket接收缓冲区中并产生SINT_STAT_RECV中断,FPGA收到此中断后,可以发送命令CMD_GET_RECV_LEN_SN来获取接收缓冲区数据的长度,然后发送命令CMD_READ_RECV_SN来读取缓冲区的数据。FPGA可以一次将所有数据读出也可以只读出部分数据,由于UDP模式下CH395无法提供流控,建议接收到的数据及时快速的读完,以免被后续的数据覆盖。
3 UDP模式介绍
UDP是一个简单的,不可靠的,面向数据报文的运输层协议,传输速度较快,不能保证数据能达到目的地,必须由应用层来保证传输的可靠稳定。
如图所示,FPGA向CH395写入若干字节数据流后,CH395数据流封装在UDP数据部分进行发送。UDP一包可以发送的最大长度为1472字节,如果FPGA写入的数据流长度大于1472字节,CH395会将数据流封装成若干个UDP包进行发送且每包成功发送后都会产生SINT_STAT_SEND_OK中断。FPGA每次写入的字节长度不得大于发送缓冲区长度(2KB),且收到SINT_STAT_SENBUF_FREE中断后才可以进行下一次写数据。
当CH395接收到UDP报文后,将UDP数据复制到socket接收缓冲区中并产生SINT_STAT_RECV中断,FPGA收到此中断后,可以发送命令CMD_GET_RECV_LEN_SN来获取接收缓冲区数据的长度,然后发送命令CMD_READ_RECV_SN来读取缓冲区的数据。FPGA可以一次将所有数据读出也可以只读出部分数据,由于UDP模式下CH395无法提供流控,建议接收到的数据及时快速的读完,以免被后续的数据覆盖。
4 TCP/UDP端口介绍
TCP和UDP服务通常有一个用户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet用户程序与服务进程建立一个连接。用户程序向服务进程写入信息,服务进程读出信息并发出响应,用户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。
TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:
● 源IP地址:发送包的IP地址。
● 目的IP地址:接收包的IP地址。
● 源端口:源系统上的连接的端口。
● 目的端口:目的系统上的连接的端口。
端口指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。它是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。
电脑一共有65535个端口,1-1024属于保留端口,是标准服务端口,是一些系统服务的端口,随便用的话,会起冲突,导致服务无法运行,如21,80端口。1024后面的就属于自由端口了,供后续开发的小程序使用。
上面的描述可能有些学术化了,不是很容易理解消化。我们可以简单的打个比方来说明TCP/UDP的端口为何物。如图所示,这是一个港口,布满了密密麻麻又井然有序的集装箱。我相信对于这样一个港口,对于集装箱的摆放一定划分了很多区域或者打上了很多标签,便于分类和管理。如果把以太网帧比喻为一个个装满货物的集装箱,那么港口的区域划分或者标签张贴就好比TCP/UDP的端口定义,端口的作用应该就是为了便于管理和分类,避免一个新的以太网帧到来时,所有的应用程序一拥而上。TCP/UDP端口保证了“一个萝卜一个坑“式的井然有序。
5 软件设计
本实例软件流程如图所示。UDP模式设置中需要设置目的主机的IP地址,即PC机的IP地址192.168.1.103;并且设置目的端口为8000(10进制),源端口为5000(10进制)。随后在主循环中等待PC端来的一个UDP帧,则FPGA打印接收帧数据,将所有数据取反后发回给PC机。那么随后的板级调试,我们需要率先在PC端制作一个端口号对应的UDP帧发给FPGA端,随后在PC端观察数据取反后的UDP帧是否返回了。
6 板级调试
下载sof文件,在线运行EDS软件工程。随后我们打开“科来软件分析系统”,按照前面一个实例新建一个IP包,如图所示,该IP包的源主机是PC端,目的主机是我们的FPGA端,因此我们需要相应的设定源主机和目的主机的MAC地址和IP地址。另外,这个IP包是UDP协议格式的,因此我们也需要设定上层协议值为17(10进制)。在FPGA端,我们设置源主机(FPGA)的端口号为5000,目标主机(PC)的端口号为8000;因此,在PC端则恰恰相反,我们设定源主机端口号为8000,目的主机端口号为5000。IP包的总数据长度为108个字节,包括8个字节的UDP首部和100个字节的用户数据,100个字节数据是我们自己输入的,随后FPGA端会对这些数据取反然后发送回PC端。
当我们在PC端发送UDP协议的IP包后,如图所示,Nios II Console窗口除了之前打印的版本和连接信息外,同时也打印除了新接收到的100个字节数据,随后取反并发送出去了。
我们可以回到“科来网络分析系统”,我们查看IPàUDP包的解析,这里有两个包,即以192.168.1.103和192.168.1.101为源IP地址互发的UDP包,即我们刚刚的实验中所产生的两个包。如图所示,我们可以分别查看这两个包的解析,尤其大家可以对照两个包的数据是取反的。这和我们的实验初衷是一致的,这两个UDP包都很好的完成了任务。
7 基于labview UDP调试助手的板级调试
首先我们需要安装SF-CY3配套光盘tools文件夹下的SF-NET UDP Tools.rar压缩包内的UDP调试助手工具,这个UDP调试助手是使用labview编写。双击压缩包内的setup.exe安装软件,弹出安装界面如图所示。
完成软件工具安装,和前面一样,在线运行实例工程。接着我们打开开始菜单的“程序àUDPà应用程序”。
随后就弹出如图所示的UDP调试助手主界面。第一次开启软件默认就运行了,在设置好远程目的IP地址和端口号后,若希望其能够生效,大家需要先点击停止运行,然后重新开始运行方可。
前面的实例我们已经知道,FPGA端的IP地址是192.168.1.101,PC端的本地端口是8000(即FPGA的目的端口号),PC端的远程端口号是5000(即FPGA的本地端口号)。
我们重新运行UDP调试助手,为了便于观察显示数据的收发情况,我们将“发送数据”和“接收数据”对应的“显示格式”都设置为“16进制”,在发送数据窗口中输入一长串的16进制数据,然点击右侧的“发送”按钮,随后我们便可以看到“接收数据”窗口中打印了一长串由FPGA端返回的数据,大家可以仔细看看,这些数据是否都是发送数据取反后的结果。
在EDS的Nios II Console中,我们也可以看到打印信息如图所示。
有兴趣的朋友也可以用科来网络分析系统来监控我们使用UDP调试助手收发数据的过程。