udp协议收/发模块

1.udp协议:(以下只解释关键的信息,后面后用到的)

图1 udp协议包格式

图2 物理连接图

        其中ip首部长度里的总长度(ip首部长度(20byte)+udp首部长度(8byte)+数据(字节为单位)一共是多少byte)是十分重要的。udp首部的upd长度指的是:udp首部的长度(8byte)+数据长度一共多少byte.   有效数据量最少是:46-8-20=18byte(上位机制作者必须满足这个要求,)

       假如总长度为60:那么相对应的:用户数据量为:60-20-8=32byte的数据,因此可以推断出udp长度为40 !  这些信息在一包数据里都会有提供,直接解析即可!

      对于物理连接图(RGMII):125Mhz对应的就是千兆网(这里不进行计算了)!

2.基于udp的接收模块使用(FPGA接收电脑发送的数据包):

图3 FPGA接收数据模块信息

        接收模块处理思路:  提取电脑发送过来的目的MAC地址,看是否和板卡一致(或者等于公共的mac地址48‘ff_ff_ff_ff_ff_ff),检查是否是IPV4协议,然后状态机才会进行跳转,到达ip首部检测状态,首先检测发过来的数据的ip首部是否是20字节,再判断目的ip地址是否正确。之后再进入udp首部状态进行判断,提取udp长度是多少(假如是40),那么40-8(udp首部长度)=32(byte)就是有效的数据量,那么有效的数据的长度data_len(32字节)就可以被计算出来:32byte(这里是进行举例,代码里会直接算出来的,因为你目前不知道值是多少),然后有效数据计数器(cnt_data)开始计数,根据计数到31之后,根据data_len的值然后停止!然后拉高一个时钟周期的单包数据提取完成信号(rec_pkt_done)。最后还会输出一包数据的有效的数据量(rec_byte_num)信号。

         再来说一下cnt_rec_data计数器的作用:目的是为了进行32位数据的拼接:从1开始计数每次到0的位置代表着提取完成,然后拉高rec_en,把提取的32bit数据存入到fifo中。 

        从图5这里可以看出   rec_data的数据量一直在转换只有在计数器到3时候的32bit数据才是用户需要的,因此用户可以再写一路输出信号:当rec_en拉高的时候把当前rec_data的数据赋值给user_rec_data,这样就避免了数据乱的问题。

        还有个问题也来了。举个例子:假如电脑上位机发送了0x123456(数据发送顺序0x12.0x34.0x56)这个数据给FPGA,因为最少发18字节的数据,因此上位机可能会补0(0x12.34.56.(15字节的0)),rec_en需要拉高4次,最后剩两个字节的数据,不足以打开rec_en的拉高条件(最后都是0,没必要拉高)。转化如图m所示

图m 转化图

图4 

图5 rec_data相关的代码(先接收到的数放高位)

 3.基于udp的发送模块使用(FPGA接收电脑发送的数据包):

图6 udp发送模块

先说一下,这个模块怎么使用:

         拉高一个时钟周期的 tx_start_en信号,FPGA就会把这一包数据下所对应的一个不变的数据发出去。然后传给上位机显示即可!

       假如FPGA作为发送端,发送的数据不足18字节怎么办呢?如图7所示,假设:38=ip_len(ip首部中的总长度)=udp首部长度(8字节)+ip首部长度(20)+数据长度(10),说明数据长度为10(不够18byte),不够的话直接补0.比如我要发送数据(0x12345678,那么我的代码就会发送(0x12345678(15个0)),因为我的数据本身就是32bit的,不存在0x123456这种的(但是会存在这种0x00123456),然后后面补0就变为了0x123456 (15个0就不对了)),这种的话电脑端都没法解析了(32bit的数据下)。

图7

图8

        最终发送的数据如图8所示,tx_done结束信号没必要考虑了,因为发送的数据非常快,没有必要设定结束后才能拉高(tx_start_en,用户自己考虑tx_start_en拉高时间即可)。gmii_tx_en使能信号是发送给芯片的。都请求信号是为了读取存入fifo中的数据,这个信号会根据有效的data_len而拉高,假如data_len等于10(需要读取10个字节的数据),那么它会拉高3次(前2两次读取4字节数据,最后一次将fifo中的数据读来后,取出fifo的32bit数据中的[31:16],根据图9代码。然后填入gmii_txd)然后其余的往后全部填0!!!当然也可以不适用fifo读取数据,直接在这一包数据下,输入你要的数据就行,也就是图9的tx_data(这里的数据可以从fifo读取)。

图9

           怎么实现数据的回环呢!如图10所示:我手写的做了总结:

图10

为了验证我的想法,如图11所示,别人的上位机给我们的fpga发数据,发现他的上位机是在前面补0,而我们的FPGA发送则是在后面补0。

图11

野火的源码中:回环是这样的:接收多少个字节的数据,就发送多少个字节的数据。接收完毕后,触发接收结束信号,结束信号从而触发 发送1包数据信号,再发送出去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值