
ARP数据格式:
硬件类型:表示硬件地址的类型。它的值为1表示以太网地址
协议类型:表示要映射的协议地址类型。它的值为0x0800即表示IP地址
硬件地址长度和协议地址长度:分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的分别为6和4:
操作类型(OP):1表示ARP请求,2表示ARP应答
从 ARP 协议的数据包结构来看, 它的硬件类型和协议类型是可配置的, 因此它可以支持多种上层网络协议与下层硬件协议的映射, 写成一般形式, ARP 协议便是要解决 < Protocol, Address > 到硬件地址地址的映射, 目前我们使用的绝大多数局域网都是通过 WIFI (IEEE 802.11, 使用 CSMA/CA 做介质访问控制) 或有线连接 (IEEE 802.3, 使用 CSMA/CD 做介质访问控制) 进行连接, 它们都使用 48 位的 MAC 地址来进行通信, 因此我们只讨论 IP 地址映射为 MAC 地址的情形
当局域网的一台主机需要和另一台主机进行通信时, 假定已知道对方的 IP 地址, 但它没有该 IP 地址对应的 MAC 地址, 此时它需要在该局域网内广播发送 ARP 请求包, ARP 请求包里携带发送者自身的 MAC 地址, 自身的 IP 地址, 希望请求的目标主机的 IP 地址, 目标主机的 MAC 地址字段置为 0, 当 ARP 请求包发出以后, 局域网内的所有主机都将收到这个 ARP 请求。
收到 ARP 数据包的主机执行如下的步骤:
上面的 ARP 处理环节有几点需要注意:
模块接口:
module ARP_RX#(
parameter P_SRC_IP_ADDR = {8'd192,8'd168,8'd100,8'd99},
parameter P_SRC_MAC_ADDR = 48'h01_02_03_04_05_06
)(
input i_clk ,
input i_rst ,
output [47:0] o_recv_target_mac ,
output [31:0] o_recv_target_ip ,
output o_recv_target_valid ,
output o_arp_reply ,
input [31:0] i_dymanic_src_ip ,
input i_src_ip_valid ,
input [63:0] s_axis_mac_data ,
input [79:0] s_axis_mac_user ,
input [7 :0] s_axis_mac_keep ,
input s_axis_mac_last ,
input s_axis_mac_valid
);
模块接口:
module ARP_TX#(
parameter P_SRC_IP_ADDR = {8'd192,8'd168,8'd100,8'd99},
parameter P_SRC_MAC_ADDR = 48'h01_02_03_04_05_06
)(
input i_clk ,
input i_rst ,
input [31:0] i_dymanic_src_ip ,
input i_src_ip_valid ,
input [47:0] i_dymanic_src_mac ,
input i_src_mac_valid ,
input [47:0] i_recv_target_mac ,
input [31:0] i_recv_target_ip ,
input i_recv_target_valid ,
input i_arp_reply ,
input i_arp_active ,
input [31:0] i_arp_active_dst_ip ,
output [63:0] m_axis_arp_data ,
output [79:0] m_axis_arp_user ,
output [7 :0] m_axis_arp_keep ,
output m_axis_arp_last ,
output m_axis_arp_valid
);
模块接口:
module ARP_table(
input i_clk ,
input i_rst ,
input [47:0] i_recv_target_mac ,
input [31:0] i_recv_target_ip ,
input i_recv_target_valid ,
input [31:0] i_seek_ip ,
input i_seek_valid ,
output [47:0] o_seek_mac ,
output o_seek_mac_valid
);
仿真设计:
第一次发送的ARP报文是请求报文,由i_arp_active和i_arp_active_dst_ip 触发,第二次发送的是ARP reply报文,由i_arp_reply触发

第一次接受的是arp request报文,并且判断目的IP就是本机,于是产生了一个o_arp_reply信号通知发送端发送arp reply报文。
第二次接收到的是arp reply报文。

接收端接收到任何ARP报文都会产生对应的i_recv_target_ 信号通知ARP表进行缓存操作。
仿真当中一共收到俩此ARP报文,一次request一次reply,所以i_recv_target_valid拉高了俩次,但是arp表当中俩次操作后依旧只有一组IP和MAC地址,这是因为俩次arp报文当中对应的源IP地址都是一样的,所以只会更新重写,不会在新的地址当中写入。
