基于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插件快速发布