基于ZCU106例程,准备将例程中的代码重新设计为module,包括UDP-IP-MAC module和UDP NET PHY module。主要可设置参数为PHY层以上参数,即UDP-IP-MAC的参数:
MAC地址,包括source mac和destination mac。
IP地址,包括source IP和destination IP。
端口号,包括source port和destination port。
网关IP,默认为192.168.1.1。
子网掩码,默认为255.255.255.0。
UDP数据包长度暂不作为设置参数,因为考虑到实际发送数据时以一个slice为单位,最后一个slice的长度不一定与之前的slice长度一致,因为需要作为一个变量进行设置。
由于UDP NET PHY使用了Zynq ultrascale内部的UltraScale FPGAs Transceivers Wizard,因此还需要将例程中与该IP有关的文件全部复制到工程文件下。原有工程必须在Linux下使用make命令进行生成,而在cygwin中无法通过make命令生成。现有工程可以直接在windows下运行。
完成工程生成后进行行为仿真,发现该网络协议栈的发送流程如下:
tx_udp_hdr_ready 与 tx_udp_hdr_valid同时为高时,首先发送一个ARP请求包,如下。在目标电脑收到ARP包并进行ARP回复后,后续才能进行UDP数据包的发送。后续除非电脑端更换IP地址等设置,否则FPGA端不需要进行ARP请求 。

ICMP报文的处理,因为该机制的存在,在UDP协议栈成功收到ARP回复包后,电脑端用ARP -a指令即可看到FPGA上的网络栈,即192.168.1.28, MAC:02 00 00 00 00 00。该机制可一定程度上代替Ping功能,即以ARP报文代替ICMP报文。

根据以上流程,发送流程可以为:首先发送ARP请求包,当收到电脑端ARP回复包后,表示整个网路通畅,可以进行后续操作,即slice数据发送。
本文章使用limfx的vscode插件快速发布