用FPGA实现UDP通讯

调试基于FPGA的UDP通讯可以说是一波三折,满眼都是泪。

1,首先根据网上的AN8211开发板原理图,做自己的开发板;

调试硬件的过程中,由于焊接或者其他的原因,导致晶振不起振;首先怀疑是自己的板子设计问题,仔细比较原理图,PCB图,查找数据手册,管脚信息…………考虑是否是匹配电容问题,查找各种数据手册,计算匹配电容,更换为30pF电容,发现还是无法起振。脑袋炸了!

灵光一闪,换块板子试一下。示波器测试,哈哈,起振了!

2,然后开始调试FPGA驱动程序;

根据网上例程,改写驱动程序;

怎么都无法连上电脑,什么问题???分析代码,一行一行的比较,查看,没有问题啊?

然后逼着自己又看了UDP传输协议,IP包头格式,以太网帧格式,UDP包头格式……,没有问题;

后来不知道怎么搞的,把计算机网络设置中更改了一下,呵呵o(* ̄︶ ̄*)o,网路端的灯闪烁了。高兴啊!

3,开始调试FPGA程序,先自己模拟数据发送给计算机端,通过wireshark能抓到FPGA发送的数据包了。这是以为网络通讯已经成功了。哎,年轻啊?

4,计算机端编写Qt程序,接收FPGA通过UDP传过来的数据包,wireshark可以收到,但是Qt程序接收不到;

怀疑Qt程序问题;通过网络查找,编写最简单的Qt接收UDP包程序,connect(uSocket,SIGNAL(readyRead()),this,SLOT(recvData()));就是无法触发readyRead()。啊啊啊!!!!!!

通过一周的查找,调试,看FPGA端代码,看Qt端代码,计算机防火墙关闭,无果,崩溃,泪奔,无法言语形容……脑袋里始终在想到底是什么原因导致的?

一个偶然的机会,看到一篇文章,说windows10系统的防火墙的防护机制,仔细拜读完,然后试一下,果然通了。

添加编写的程序进入到“允许的程序和功能”中,才可以,不然防火墙把数据包拦截了。wireshark默认开启了网卡的混乱模式,但是计算机没有开启,把程序添加进“允许的程序和功能”中就可以了。

前后经历了1个多月,终于把UDP的通讯搞定了,目前可以把我的FPGA板子接收相机传输过来的数据,通过UDP上传给计算机,进行通讯了。可以实现了UDP的发送数据和接收数据。

下面把我自己整理的UDP包格式贴出来,

//---------------------------------------------------------------------------------------------------
// 整体报文:
//                用户数据:                                              |-----------------------------------|
//                                                                          |        hello word!                      |
//                                                                         |-----------------------------------|
//                UDP 层                                    |--------                                                |
//                                                            |UDP包头 |           数据段                   |
//                                                            |--------------------------------------------|
//                IP 层                        |-----------                                                            |
//                                            |IP包头        |                        数据段                                |
//                                            |--------------------------------------------------------|---------|
//                MAC 层    |-----------|                                                                            |             |
//                            |MAC帧头        |                            数据段                                            |  FCS校验 |
//                            |--------------------------------------------------------------------|---------|
//
//    注:最后的mac层就是要传给phy芯片的数据。FCS采用crc32,注意计算的时序,MAC帧头为7个0x55和一个0xD5
//
//
// 所以在网络上发送的数据为前导码:7个0x55,和一个0xD5 ;
//        然后发送MAC帧头:目的MAC地址,源MAC地址,以及上一层使用的协议类型
//        然后发送的是IP层的IP包头:版本号:4,包头长度5:标识4*5=20个字节长度;UDP长度
//                                        包序列号,以及片偏移量
//                                        生存时间,协议类型,首部校验和
//                                        源IP地址
//                                        目的IP地址
//                                        选项:(此处没有)
//
//     然后是UDP包头:
//                    源端口号,目的端口号
//                    数据包长度,检查校验和
//
//    然后就是实际的数据了;
//
//
//-------------------------------------------------------------------------------------------------------

// 百兆以太网UDP发送;
// 此处使用的时钟为25MHZ;
//
 

总结,基本功能实现,下一步开始调试相机到FPGA开发板的传输,尽可能提高传输的速度和稳定性;

发布了11 篇原创文章 · 获赞 10 · 访问量 5710

猜你喜欢

转载自blog.csdn.net/bxlover007/article/details/104791769