1.简介
ARP(Address Resolution Protocol),即地址解析协议,是根据 IP 地址(逻辑地址)获取 MAC 地址的一种 TCP/IP 协议。在以太网通信中,数据是以“帧”的格式进行传输的,帧格式里面包含目的主机的 MAC地址。源主机的应用程序知道目的主机的 IP 地址,却不知道目的主机的 MAC 地址。而目的主机的 MAC 地址直接被网卡接收和解析,当解析到目的 MAC 地址非本地 MAC 地址时,则直接丢弃该包数据,因此在通信前需要先获得目的的 MAC 地址,而 ARP 协议正是实现了此功能。
以太网通信前,已知发送方的IP地址、MAC地址和接收方的IP地址,不知道接收方的MAC地址。通过发送方发送请求包(采用广播的方式),接收方收到请求给出响应包(响应包中包含接收方的MAC地址),发送方收到响应包就可以将接收方的MAC地址解析出来。在获取到目的 MAC 地址之后,将目的 MAC 地址更新至 ARP 缓存表中,称为 ARP 映射,下次通信时,可以直接从 ARP 缓存表中获取,而不用重新通过 ARP 获取 MAC 地址。但一般 ARP 缓存表会有过期时间,过期后需要重新通过 ARP协议进行获取。
ARP 映射
ARP 映射是指将 IP 地址和 MAC 地址映射起来,分为静态映射和动态映射。
静态映射指手动创建一张 ARP 表,把 IP 地址和 MAC 地址关联起来。手动绑定之后,源主机在通信之前,就可以直接从 ARP 表中直接找到 IP 地址对应的 MAC 地址,但这样做有一定的局限性,因为 MAC 地址可能会变化,比如:
- 机器可能更换 NIC(网络适配器),结果变成一个新的物理地址;
- 在某些局域网中,每当计算机加电时,他的物理地址都要改变一次;
- 移动电脑可以从一个物理网络转移到另一个物理网络,这样会改变物理地址
要避免这些问题出现,必须定期维护更新 ARP 表,此类比较麻烦而且会影响网络性能。
动态映射指使用ARP协议来获取相对应的物理地址,之所以用动态这个词是因为这个过程是自动完成的。ARP 协议分为 ARP 请求和 ARP 应答,源主机发起查询目的 MAC 地址的报文称为 ARP 请求,目的主
机响应源主机并发送包含本地 MAC 地址的报文称为 ARP 应答。
当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个 ARP 请求报文,这个报文包含了发送方的 MAC 地址和 IP 地址以及接收方的 IP 地址。因为发送方不知道接收方的物理地址,所以这个 查 询 分 组 会 在 网 络 层 中 进 行 广 播 , 即 ARP 请 求 时 发 送 的 接 收 方 物 理 地 址 为 广 播 地 址 , 用48’hff_ff_ff_ff_ff_ff 表示。 ARP 请求的示意图如下图所示:

2.ARP协议帧格式
ARP协议是通过以太网进行传输的,因此他首先要遵从以太网数据的帧格式。
以太网 MAC 帧格式
以太网技术的正式标准是 IEEE 802.3,它规定了以太网传输数据的帧结构,如下图:

以太网传输数据时按照上面的顺序从头到尾依次被发送和接收,我们下面进一步解释各个区域。
- 前导码(Preamble) : 为了实现底层数据的正确阐述,物理层使用 7 个字节同步码(0 和 1 交替(55-55-55-55-55-55-55))实现数据的同步。
- 帧起始界定符(SFD, Start Frame Delimiter):使用 1 个字节的 SFD(固定值为 0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
- 目的 MAC 地址: 即接收端物理 MAC 地址,占用 6 个字节。 MAC 地址从应用上可分为单播地址、组播地址和广播地址。单播地址:第一个字节的最低位为 0,比如 00-00-00-11-11-11,一般用于标志唯一的设备;组播地址:第一个字节的最低位为 1,比如 01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有 48bit 全为 1,即 FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。
- 源 MAC 地址:即发送端物理 MAC 地址,占用 6 个字节。
- 长度/类型: 上图中的长度/类型具有两个意义,当这两个字节的值小于 1536(十六进制为 0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于 1536,则表示该以太网中的数据属于哪个上层协议,例如 0x0800 代表 IP 协议(网际协议) 、 0x0806 代表 ARP 协议(地址解析协议)等。
- 数据:以太网中的数据段长度最小 46 个字节, 最大 1500 个字节。最大值 1500 称为以太网的最大传输单元(MTU, Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络 I/O 控制器缓存区资源以及网络最大的承载能力等因素, 因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置, 通常以太网的有效数据字段小于 1500 个字节。
- 帧检验序列(FCS, Frame Check Sequence) : 为了确保数据的正确传输, 在数据的尾部加入了 4 个字节的循环冗余校验码(CRC 校验) 来检测数据是否传输错误。 CRC 数据校验从以太网帧头开始即不包含前导码和帧起始界定符。 通用的 CRC 标准有 CRC-8、 CRC-16、 CRC-32、CRC-CCIT,其中在网络通信系统中应用最广泛的是 CRC-32 标准。
在这里还有一个要注意的地方就是以太网相邻两帧之间的时间间隔, 即帧间隙(IFG, Interpacket Gap) 。帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG 的最小值是 96 bit time,即在媒介中发送 96 位原始数据所需要的时间,在不同媒介中 IFG 的最小值是不一样的。 不管10M/100M/1000M 的以太网,两帧之间最少要有 96bit time, IFG 的最少间隔时间计算方法如下:
- 10Mbit/s 最小时间为: 96*100ns = 9600ns;
- 100Mbit/s 最小时间为: 96*10ns = 960ns;
- 1000Mbit/s 最小时间为: 96*1ns = 96ns。
ARP协议是在以太网的数据段进行传输的,如下图:

ARP协议一共传输28字节的数据,但是以太网的帧格式数据段最低要求46个字节,因此需要在末尾填充18字节的数据,一般为0。
ARP协议帧格式
ARP 协议属于 TCP/IP 协议簇的一种,ARP 协议位于以太网 MAC 帧
格式的数据段, ARP 数据包格式如下图所示:

- 硬件类型(Hardware type):硬件地址的类型, 1 表示以太网地址。
- 协议类型(Protocol type):要映射的协议地址类型, ARP 协议的上层协议为 IP 协议,因此该协议类型为 IP 协议,其值为 0x0800。
- 硬件地址长度(Hardware size):硬件地址(MAC 地址)的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或者应答来说,该值为 6。
- 协议地址长度(Protocol size): IP 地址的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或者应答来说,该值为 4。
- OP(Opcode):操作码,用于表示该数据包为 ARP 请求或者 ARP 应答。 1 表示 ARP 请求, 2 表示 ARP应答。
- 源 MAC 地址:发送端的硬件地址。
- 源 IP 地址:发送端的协议(IP)地址,如 192.168.1.102。
- 目的 MAC 地址:接收端的硬件地址,在 ARP 请求时由于不知道接收端 MAC 地址,因此该字段为广播地址,即 48’hff_ff_ff_ff_ff_ff。
- 目的 IP 地址:接收端的协议(IP)地址,如 192.168.1.10。
3.RGMII接口
RGMII 接口的 优 势 是同 时 适 用 于10M/100M/1000Mbps 通信速率,同时占用的引脚数较少。但 RGMII 接口也有其缺点,就是在 PCB 布线时需要尽可能对时钟、控制和数据线进行等长处理,且时序约束相对也更为严格。

- ETH_RXC:接收数据参考时钟, 1000Mbps 速率下,时钟频率125MHz,时钟为上下沿同时采样;100Mbps 速率下,时钟频率为 25MHz; 10Mbps 速率下,时钟频率为 2.5MHz, ETH_RXC 由 PHY 侧提供。
- ETH_RXCTL(ETH_RX_DV):接收数据控制信号。
- ETH_RXD:四位并行的接收数据线。
- ETH_TXC:发送参考时钟, 1000Mbps 速率下,时钟频率为 125MHz,时钟为上下沿同时采样; 100Mbps速率下,时钟频率为 25MHz; 10Mbps 速率下,时钟频率为 2.5MHz, ETH_TXC 由 MAC 侧提供。
- ETH_TXCTL(ETH_TXEN):发送数据控制信号。
- ETH_TXD:四位并行的发送数据线。
- ETH_RESET_N:芯片复位信号,低电平有效。
- ETH_MDC:数据管理时钟(Management Data Clock),该引脚对 ETH_MDIO 信号提供了一个同步的时钟。
- ETH_MDIO:数据输入/输出管理(Management Data Input/Output),该引脚提供了一个双向信号用于传递管理信息。
其中 ETH_RXC、ETH_RXCTL 和 ETH_RXD 为 MAC接收侧引脚; ETH_TXC、ETH_TXCTL 和 ETH_TXD为 MAC 发送侧引脚; ETH_MDC 和 ETH_MDIO 为 MDIO 接口引脚,用于配置 PHY 芯片内部寄存器;ETH_RST_N 为 PHY 芯片硬件复位信号。由于 PHY 芯片的内部寄存器在默认配置下也可以正常工作,因此本次实验没有对 MDIO 接口进行读写操作,只用到了以太网的 RGMII 接口信号和复位信号。
RGMII 使用 4bit 数据接口,在 1000Mbps 通信速率下, ETH_TXC 和 ETH_RXC 的时钟频率为 125Mhz,采用上下沿 DDR(Double Data Rate)的方式在一个时钟周期内传输 8 位数据信号,即上升沿发送/接收低 4位数据,下降沿发送/接收高 4 位数据。 ETH_TXCTL 和 ETH_RXCTL 控制信号同样采用 DDR 的方式在一个时钟周期内传输两位控制信号,即上升沿发送/接收数据使能(TX_EN/RX_ DV)信号,下降沿发送/接收使能信号与错误信号的异或值(TX_ERR xor TX_EN、 RX_ERR xor RX_DV)。当 RX_DV 为高电平(表示数据有效), RX_ERR 为低电平(表示数据无错误),则异或的结果值为高电平,因此只有当ETH_RXCTL和 ETH_TXCTL 信号的上下沿同时为高电平时,发送和接收的数据有效且正确。
4.FPGA实现ARP协议
实验任务:使用开发板上的以太网接口,和上位机实现 ARP 请求和应答的功能。当上位机发送 ARP 请求时,开发板返回 ARP 应答数据。当按下开发板的触摸按键时,开发板发送 ARP请求,此时上位机返回应答数据。总体设计如下图:

- arp_ctrl模块:完成触摸按键的处理,收到按键信号后驱动arp模块产生请求;
- arp模块:arp模块完成要发送和接收数据的封包处理和CRC校验的实现;
- PLL:产生200MHZ的时钟;
- gmii_to_rgmii模块:完成gmii接口形式的数据和rgmii接口形式的数据的相互转换。
arp_ctrl模块
arp_ctrl捕捉输入的按键信号,同时输出arp请求信号,实现代码如下:
module (
input clk , //输入时钟
input rst_n , //复位信号,低电平有效
input touch_key , //触摸按键,用于触发开发板发出ARP请求
input arp_rx_done, //ARP接收完成信号
input arp_rx_type, //ARP接收类型 0:请求 1:应答
output reg arp_tx_en , //ARP发送使能信号
output reg arp_tx_type //ARP发送类型 0:请求 1:应答
);
//reg define
reg touch_key_d0;
reg touch_key_d1;
reg touch_key_d2;
//wire define
wire pos_touch_key; //touch_key信号上升沿
//*****************************************************
//** main code
//*****************************************************
assign pos_touch_key = ~touch_key_d2 & touch_key_d1;
//对arp_tx_en信号延时打拍三次,用于采touch_key的上升沿
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
touch_key_d0 <= 1'b0;
touch_key_d1 <= 1'b0;
touch_key_d2 <= 1'b0;
end
else begin
touch_key_d0 <= touch_key;
touch_key_d1 <= touch_key_d0;
touch_key_d2 <= touch_key_d1;
end
end
//为arp_tx_en和arp_tx_type赋值
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
arp_tx_en <= 1'b0;
arp_tx_type <= 1'b0;
end
else begin
if(pos_touch_key == 1'b1) begin //检测到输入触摸按键上升沿
arp_tx_en <= 1'b1;
arp_tx_type <= 1'b0;
end
//接收到ARP请求,开始控制ARP发送模块应答
else if((arp_rx_done == 1'b1) && (arp_rx_type == 1'b0)) begin
arp_tx_en <= 1'b1;
arp_tx_type <= 1'b1;
end
else
arp_tx_en <= 1'b0;
end
end
endmodule
arp模块
arp模块包括三个部分,如下图所示,从左到右依次为:CRC-32校验编码模块、arp封包发送模块、arp解析接受模块。

CRC-32校验编码模块完成CRC校验码的并行生成,原理可以参考我的另一篇博客
循环冗余校验(CRC)和FPGA实现
gmii_to_rgmii模块
gmii_to_rgmii模块完成数据信号的RGMII格式(4bit)与GMII格式(8bit)之间的转换,原因是MAC(FPGA)和PHY芯片之间使用的是RGMII接口,但在FPGA内部是处理的8bit信号,所以需要一个转换模块。gmii_to_rgmii模块的如下图所示,包含两个部分:rgmii_rx模块和rgmii_tx模块。

rgmii_rx模块的实现:先将输入数据进行延迟,使采样时钟位于数据中间,防止误采,使用的使XILINX 原语IDELAYE2。之后使用XILINX 原语IDDR对双边沿数据进行采样,合为一路数据。因此,4路双沿采样的RGMII数据需要例化四路的IDELAYE2+IDDR,原理图如下:

rgmii_tx模块的实现:这一部分比较简单,使用XILINX原语ODDR可以将2bit数据变成1bit双沿采样的数据,实现原理图如下:

声明:来自正点原子FPGA学习。
3218

被折叠的 条评论
为什么被折叠?



