野火以太网回路实验代码的bug
如果你使用过野火FPGA以太网回路实验的范例代码(目前笔者见过两种版本的),且发现实际上板后有如下问题:
1.板子的以太网物理接口指示灯正常闪烁。
2.使用WireShark观察发现可以顺利向板子发送正确的IP与MAC地址的数据包,但没办法接收到以太网实验所要求的返回包。
那么,你很有可能是野火以太网回路实验代码bug的受害者(一般野火会把以太网回路实验代码命名为第60个范例,“60_ethernet_udp_rmii"或者"60_eth_udp_loop”)。
快速解决方案
版本1:找到RTL目录下"ip_receive.v"文件,在第214行与215行之间(图1)加上代码变成图2的样子:
版本2:找到RTL目录下"ip_receive.v"文件,在第159行与160行之间(图3)加上代码变成图4的样子:
BUG描述
这个BUG出现的原因是,如果以太网模块接收到一个来自网线的UDP包,那么它会先进入前导、帧头、IP首部与UDP首部等状态后才能判断是否接收这个UDP包。任意的UDP数据包至少要走到IP首部状态才能判断是否丢弃。在数据包完成丢弃后,状态机会回到IDLE模式,注意此时字节记数器并没有归零,也即上述解决方案中两变量没归零。
如果字节计数器不是以0的初始值进入前导或者包头的话,就无法准确的读出第6个字节的前导符号d5,自然也进不了以太网头部,可以说,以太网的正常接收功能在收到以一份IP、UDP对不上的数据包后就失效了。
如果你使用的网卡的数据包全部都是老老实实的,不存在IP、UDP对不上的情况,那么以太网回路实验是可行的,你也可以通过modelsim的仿真验证。但实际的网卡中往往会有各种各样的包在网线上广播,原来的代码就不灵了。