最近在使用带有网络通信功能的FPGA做实验,在整个实验过程中出现了一些小问题,在此记录。本片博客主要想记录我尝试去解决问题的思路。
实验环境
FPGA方面:我使用的是带有两个千兆网口的实验板,其它配置不过多赘述
硬件程序方面:我是在Windows环境下使用vivado编程和烧写程序
网络通信的另一端:有一台带有百兆网口的笔记本和一台有千兆网口的台式机
实验的流程
简单来说实验流程是FPGA需要封装UDP包发往另一端。此次实验主要目的是想要正确配置搭建好这个可通信的环境,为之后的实验打好基础。
1、在硬件程序中,我们直接写死了本端(FPGA)和对端的IP与MAC。
2、然后按照vivado的使用流程正确下载到了FPGA中
3、将我们的FPGA和笔记本通过网线直连
4、打开笔记本的设置,设置成硬件程序中设置的地址,并添加路由
5、在笔记本的命令行中pingFPGA
问题的出现
在这个时候,我原本以为这个简单的实验应该以ping通作为完美结束了,结果出现的现象是:
1、此时我的第一反应是:在笔记本上看看之前关于IP、MAC、路由的设置是否正确。结果发现是正确的。
2、然后我就想是不是物理层面上出了问题,比如说:网线坏了,FPGA的网口坏了,整个FPGA都坏了,硬件程序没有正确下载到板上(严格来说这不算物理层面)。
接着就经历了:换网线,换FPGA接口,重做以上实验流程,运行其它实验以查看能否正确下载硬件程序,换一块板子等等操作。这一系列的操作完成之后,结果并没有发生改变。
3、这个时候我就打开了笔记本上的wireshark尝试抓包。结果发现我在ping FPGA的时候,所有的包都是从PC到FPGA,而没有从FPGA到PC的返回包(这也是我之后询问过导师,他让我首先查看的内容)。这里多嘴一句,这里我的情况是:arp包无应答。还有一种情况是,对面回了arp包,但是命令行还是显示了超时,这个时候是因为你的防火墙把这些应答包墙掉了。
4、以上操作尝试过之后,我有点失去了冷静。我在想是不是我的包不是从这个百兆网口出去的?然后就把笔记本的网络配置重配了一下,还特意指定了去FPGA的IP的包从特定端口出去。结果还是没什么改变。
这个时候你可能会问,你为什么从没考虑过是你的硬件程序写错了呢?按照常理来说,第一个该排查的确实应该是这里。但是因为我这个程序是在前人工作基础上少量修改的,而我改动的内容不会导致ping不通的情况。
5、此时我开始怀疑,是不是FPGA的IP和MAC因为什么原因没有设置成程序中写的那样啊?这样的话,我在另一端和物理层面上搞来搞去确实结果应该不变。搜了许多资料无果之后,我只能去询问我的导师有没有什么办法通过FPGA的上位机查看它的IP和MAC。然后他除了给我一些如何检查ping不通的建议之外,他告诉我:我们之所以能通过通过命令行查看IP和MAC,是因为驱动为操作系统提供了接口。所以除非你的驱动去配合,否则这是做不到的。
6、在问题出现的当晚,我冷静地思考了一下,还有哪里的问题没有排查呢?这时我想到,我换过FPGA,换过网线,不如把我的笔记本换一下?第二天我就尝试把FPGA连接的另一端换成了一台有千兆网卡的台式机,结果就成功了。
疑惑与反思
我开始思考我的笔记本和这台台式机有什么区别呢?我的笔记本连网线可以上网的,所以应该不是什么网卡、插口的问题。唯一的区别就是:我的笔记本是百兆网口的,台式机是千兆网口的。
我之前没有考虑过这个问题是因为按道理来说,两种速度不匹配的网卡互发应该是没问题的,高速的那个会适应低速的那个。就结果来说,我猜测,应该是FPGA的这个千兆网卡无法适应笔记本的百兆网卡,如果FPGA的另一端是一个10G的网卡,那么应该是可以适应的。