千兆UDP学习调试记录(五)

千兆UDP学习调试记录(五)

——千兆UDP设计实战

到此全部完成基于FPGA的UDP发送接收功能全部实现,这是该系列的第五篇文章。

UDP设计实战记录

△GMII的接口管理芯片,圈出的引脚是需要控制的引脚。

千兆UDP学习调试记录(五)

 

△20181011 周四 开始编写UDP发送模块

1、完成UDP发送模块的程序编写。GMII 千兆UDP数据包发送模块,即这层是包含MAC帧的全部以太网协议发送模块。程序接口如下。

千兆UDP学习调试记录(五)

其对应的RTL图如下。

千兆UDP学习调试记录(五)

2、对该模块进行仿真,最终的仿真结果如下。

2.1 仿真测试代码如下。

千兆UDP学习调试记录(五)

2.2仿真设计中,每隔0.1ms发送一次数据,且数据是模拟好的,得到如下整体仿真图。

千兆UDP学习调试记录(五)

2.3 虽发送数据进行对比验证,看是否,满足MAC帧格式要求。

千兆UDP学习调试记录(五)

继续展开:如图注释,正确的。

千兆UDP学习调试记录(五)

数据部分的观测:

千兆UDP学习调试记录(五)

数据发送结束部分的观测:

千兆UDP学习调试记录(五)

综上仿真,全都正确。便可以到下一步,UDP数据接收部分的程序设计了!

 

△20191012 周五  UDP接收模块设计。

代码写完了,但是遇到这个奇葩问题,看了几小时,还是一点点不对的地方都没找到。

千兆UDP学习调试记录(五)

现在的方案是,直接仿真测试,看看是什么原因。我很怀疑是ISE软件的BUG。而不是我的程序问题。

1、完成的IPRecieve模块

代码接口

千兆UDP学习调试记录(五)

其内部图(局部)。

千兆UDP学习调试记录(五)

2、下面进行仿真测试。

2.1 首先,产生以太网帧的数据,用于模拟输入。

为此,调用ipsend模块,添加数据保存功能。啊,弄了一早上,才把数据保存出来,这进度真的太慢了。不过好的是,学会了数据保存功能,测试代码如下。

可参见博文:https://blog.****.net/u013793399/article/details/53487596

千兆UDP学习调试记录(五)

仿真后的输出,如下。

千兆UDP学习调试记录(五)

2.2 接下来,终于可以仿真验证IPrecieve模块了。

废了九牛二虎之力,终于仿真成功了。期间之艰辛啊,因为一个“<=”写成了“=”,造成数据错位1字节,找了半天原因,才解决。

下面是仿真代码,因为输出数据是一个个“填”的,很长,这里只截取其中一段。仿真真是一个费心的事儿。

千兆UDP学习调试记录(五)

好了,下面就是仿真结果了。

千兆UDP学习调试记录(五)

详细的展开:

千兆UDP学习调试记录(五)

接收完成部分:

千兆UDP学习调试记录(五)

有图中可知,完全提取了接收数据的信息。到此,ipRecieve模块仿真完成。

 

△20181012 周五 UDP传输整体整合与设计。

千兆UDP学习调试记录(五)

千兆UDP学习调试记录(五)

千兆UDP学习调试记录(五)

Udp最大长度:

千兆UDP学习调试记录(五)

详细见博文,https://blog.****.net/baidu_32452525/article/details/69808572

 

 

△20181016 周二 综合测试

几经周折,在不断调试后,终于完成UDP程序的全部设计,这期间,特别加深了对Verilog编程的理解,感触很多。

好了,下面直接进入主题吧。

顶层设计接口如下:

千兆UDP学习调试记录(五)

综合后得到的RTL图如下:

千兆UDP学习调试记录(五)

接下来是仿真结果,仿真很重要,就是通过仿真,我一步步步找到问题,然后修改,最终得到正确的结果。

下面是测试代码的部分截图:

千兆UDP学习调试记录(五)

仿真结果如下:

千兆UDP学习调试记录(五)

展开

千兆UDP学习调试记录(五)

仿真正确后,开始板级验证。

采用网络调试助手测试,成功实现,UDP的数据发送和接收功能。

千兆UDP学习调试记录(五)

千兆以太网验证。

千兆UDP学习调试记录(五)

最后进行wireshark软件进行数据抓取,测试全部正确。

千兆UDP学习调试记录(五)

 

欢迎留言,交流,本人扣扣1021100382 ~