以太网,FPGA就一定能搞定系列之IPRAW模式通信
0赞以太网,FPGA就一定能搞定系列之IPRAW模式通信
本系列博文节选自特权同学的FPGA开发电子书《SF-CY3 FPGA套件开发指南》。
最新设计文档下载地址:http://pan.baidu.com/s/1em79m
1 概述
本实例的硬件系统和上一个实例一样,只是在CH395芯片的应用上使用了不同的传输模式。本实例要传输的是一个不折不扣的IP包,我们知道IP包也有很多不同的分类协议,而本实例不深入探讨各种IP包协议,而只是简单的使用CH395的IPRAW模式收发一个最简单的IP包,借此大家也可以认识最简单最基本的IP包协议格式。
2 IPRAW模式介绍
如图所示,FPGA向CH395写入若干字节数据流后,CH395将此socket的协议字段封装在IP首部,并将数据流封装在IPRAW数据部分进行发送。
IPRAW一包允许发送的最大长度为1480字节,如果FPGA写入的数据流长度大于1480字节,CH395会将数据流封装成若干个IP包进行发送且每包成功发送后都会产生SINT_STAT_SEND_OK中断。FPGA每次写入的字节长度不得大于发送缓冲区长度(2KB),且收到SINT_STAT_SENBUF_FREE中断后才可以进行下一次写数据。如果产生SINT_STAT_TIM_OUT中断表示数据发送失败,导致发送数据失败一般有以下两个原因:
① 如果目的IP地址和CH395在同一个子网,则可能目的IP地址的网络设备不在线。
② 如果目的IP地址和CH395不在同一个子网,则可能CH395的网关不在线。
当CH395收到IP数据包后,首先检测协议字段和Socket设置的协议字段是否相同,如果相同则将IPRAW数据包复制到接收缓冲区中并产生SINT_STAT_RECV中断,FPGA收到此中断后,可以发送命令CMD_GET_RECV_LEN_SN来获取接收缓冲区数据的长度,然后发送命令CMD_READ_RECV_SN来读取缓冲区的数据。FPGA可以一次将所有数据读出也可以分多次读取,由于IPRAW模式下CH395无法进行流控,建议FPGA查询到接收数据中断口后应立即将所有数据读出,以免被后续的数据覆盖。
关于协议字段设置的注意事项 :CH395处理IPRAW的优先级高于UDP和TCP,如果IP协议字段设置为17(UDP)或者6(TCP),则可能存在和其他socket冲突的可能性,在使用时应当注意避免,下面列举两种情况进行说明:
①Socket0设置为IPRAW模式,IP协议字段为17,Socket1为UDP模式。在UDP模式下,IP包的协议字段也是17,这样就会导致Socket1通讯的数据会被Socket0拦截,无法接收到数据。
② Socket0设置为IPRAW模式,IP协议字段为6,Socket1为TCP模式。在TCP模式下,IP包的协议字段也是6,这样就会导致Socket1通讯的数据会被Socket0拦截,无法接收到数据。3 IP协议解析
IP帧的格式如图所示,与ARP或RARP帧不同的是,IP帧的帧类型数据位0x0800,其后是20字节的IP首部,接着是IP数据报。当然了,IP数据报中如果继续做文章,那么诸如TCP和UDP协议就应运而生了,不用急,这在后面会继续深入探讨。
IP不能保证数据传输的可靠性。然而,这些并不意味着分组将被毫无规则的忽略,而是仅在网络出现故障时才会发生数据丢失。
下面我们来介绍一下IP数据报的格式、IP数据报格式,如下所示。
版本 |
头部长度 |
服务类型 |
总长度 |
|
标识 |
分段标志 |
分段偏移量 |
||
生存时间 |
协议 |
校验和 |
||
源地址 |
||||
目标地址 |
||||
选项 |
填充 |
|||
数据 |
● 版本:用于传输数据的IP版本,大小为4位;
● 头部长度:用于规定报头长度;
● 服务类型:用于设置数据传输的优先权或者优先级,其大小为8位;
● 总长度:指出数据报的总长,数据报总长=报头长度+数据长度,大小为16位;
● 标识:用于标识所有的分段,大小为16位;
● 分段标志:确定一个数据报是否可以分段,同时也指出当前分段后面是否还有更多分段,大小为3位;
● 分段偏移量:由目标计算机用于查找分段在整个数据报中的位置,大小位13位;
● 生存时间:设置数据报可以经过的最多路由器数。长度为8位;
● 协议:指定用于创建数据字段中的数据的上层协议,大小为8位,常见的协议如TCP取值6,UDP取值17,ICMP取值1;
● 校验和:检查所传输数据的完整性,大小为16位;
● 源地址:源IP地址,字段长度为32位;
● 目标地址:目标IP地址,字段长度为32位;
● 选项:不上一个必须的字段,字段长度具体取决于所选择的IP选项;
● 数据:包含网络中传输的数据,IP数据报还包括上层协议的报头信息。
4 软件设计
本实例软件流程如图所示。IPRAW模式设置中需要设置目的主机的IP地址,即PC机的IP地址192.168.1.103;并且设置协议字段为0xff。随后在主循环中不断的发送已经准备好的一个IP帧,直到接收到PC端来的一个IP帧,则FPGA打印接收帧数据并且停止运行。由此,我们既可以在PC端观察FPGA发送出来的IP帧,也可以在FPGA上验证接收功能的正确性。
5 板级调试
下载硬件工程产生的sof文件到目标板中,同时在线运行软件工程。接着我们便可以在EDS的Nios II Console窗口上看到如图所示的打印数据。
同时我们打开“科来网络分析系统”软件,点击Start进行全面分析。如图所示,在“节点浏览器”下选择“IP”分析项。
如图所示,查看“数据包”解析,选择源主机IP地址为192.168.1.101发送出来的IP帧,其后便是对该帧IP包的解析,可以比对FPGA中发出来的IP帧,完全一致。
OK,FPGA往PC端发送IP包已经确认是成功的,那么我接着在PC端发送一个IP包给FPGA。如图所示,选择科来软件菜单栏的“工具”项,单机“数据包生成器”。
接着如图所示,点击“添加”创建一个IP包。
接着弹出窗口如图所示,选择“IP数据报”,时间差可以设置为“1”秒,完成后点击“确定”。
如图所示,可以手动更改IP帧的各个参数,这里我们设置好本地(PC机)的MAC地址和IP地址;目的主机(FPGA端)的MAC地址和IP地址;总长度为84,即20个字节的IP首部加上64个字节的数据;上层协议,即协议字段设置为0xff;在最后可以编辑64个数据,我们设置它们为0x50-0x8f。
完成IP包的编辑后,我们再“数据报列表”中选择新建的IP包,右键单击弹出菜单,点击“发送选择的数据包”。
弹出了如图所示的“发送选择数据包”的窗口,确认网卡信息(可以单击“选择”查看),点击“开始”即发送IP包。
如图所示,此时我们回到EDS中,Niso II Console里打印出了刚刚接收到的PC端发送来的IP包。这里打印了收到的64个数据为0x50-0x8f,和PC端发送的IP包完全一致。