完成了RGMII接口和GMII接口转换的代码设计,接下来我们来设计以太网帧的报文解析模块,为了兼顾下一个例程中ICMP和UDP报文的解析,我们把ARP报文解析分成以太网首部解析和ARP数据解析两部分,这样以太网首部解析模块还可以再用到下一个例程当中提高了代码的复用性,同时大家想如果ICMP、UDP、ARP等不同报文的解析都放到一个模块里,代码也会非常杂乱,不容易调试定位问题。完成了RGMII接口和GMII接口转换的代码设计,接下来我们来设计以太网帧的报文解析模块,为了兼顾下一个例程中ICMP和UDP报文的解析,我们把ARP报文解析分成以太网首部解析和ARP数据解析两部分,这样以太网首部解析模块还可以再用到下一个例程当中提高了代码的复用性,同时大家想如果ICMP、UDP、ARP等不同报文的解析都放到一个模块里,代码也会非常杂乱,不容易调试定位问题。
先来看以太网首部解析模块,如图1所示是ARP帧的报文格式,其中包括了14字节的以太网首部和28字节的ARP请求应答数据,在这个模块中我们来实现以太网首部的解析,注意到以太网的帧前端含8个字节前导码,即64'h55_55_55_55_55_55_55_55_d5,所以在这个模块中也需要去判断前导码是否正确,如表1所示是mac_receive_analy模块信号列表。
整个模块代码设计中没有过多复杂的功能,按照流程来判断即可,用一个状态机来实现。先判断以太网帧的前导码是否正确,再依次接收以太网目的地址即开发板的MAC地址,以太网源地址即PC的MAC地址,最后接收2字节的帧类型,在这里ARP帧类型为16'h08_06,如图2所示是以太网首部解析模块的代码设计。
图1 ARP帧的报文格式
信号列表 | ||
信号名 | I/O | 位宽 |
clk | I | 1 |
rst_n | I | 1 |
local_mac_addr | I | 48 |
pc_mac_addr | I | 48 |
gmii_rxd | I | 8 |
gmii_rx_dv | I | 1 |
arp_analy_en | O | 1 |
表1 mac_receive_analy模块信号列表
图2 以太网首部解析模块的代码设计
然后我们再来思考下ARP数据解析模块的代码实现,其实和以太网首部解析模块大同小异,静下心来想想ARP数据报文无外乎只有两种情况,即请求报文和应答报文。
当以太网首部解析模块判断该帧的前导码正确,接收以太网目的地址是开发板的MAC地址或者是广播地址,且帧类型是ARP帧后会拉高一个时钟周期的arp_analy_en使能信号触发本模块工作,在本模块中继续解析ARP帧的数据部分。
如表2所示arp_receive_analy模块信号列表,在这个模块中首先需要判断接收到的ARP帧中的源IP地址是否是PC端IP地址,目的IP地址是否是开发板IP地址,然后需要进一步判断是请求还是应答报文。
如果是请求报文,那么需要在判断报文正确的情况下,拉高一个时钟周期的arp_reply_en使能信号,触发下游arp_transfer发送模块向PC端发送ARP应答报文;如果是应答报文,那么需要在判断报文正确的情况下,把报文中PC端的MAC地址赋值给get_pc_mac_addr信号,没有太多复杂的东西想清楚逻辑很快就能还原出代码,如图3所示是ARP数据解析模块的代码设计。
信号列表 | ||
信号名 | I/O | 位宽 |
clk | I | 1 |
rst_n | I | 1 |
arp_analy_en | I | 1 |
gmii_rxd | I | 8 |
gmii_rx_dv | I | 1 |
local_ip_addr | I | 32 |
pc_ip_addr | I | 32 |
get_pc_mac_addr | O | 48 |
arp_reply_en | O | 1 |
表2 arp_receive_analy模块信号列表
图3 ARP数据解析模块的代码设计
完成了ARP帧的解析模块代码设计,下面我们再来看一看ARP帧的发送模块代码设计,当然在此之前需要补充CRC校验模块的代码设计,这里和前面例程“USB2.0接收并回复CRC16位校验”都是一样的,直接通过网站http://www.easics.com/webtools/crctool即可生成Verilog代码,这里不做过多赘述,笔者只不过重新规范了一下信号名称,如表3所示eth_crc32模块的信号列表,如图4所示是以太网CRC32校验的代码设计。
在这个模块中,有输入信号crc_clr作为复位信号,所以FPGA每次计算校验完一包完整的CRC数据后拉高一个时钟周期的crc_clr即可再次校验下一包数据,crc_din是需要校验报文的字节输入数据信号,而crc_dout则是计算校准后的输出数据,即CRC校验后的结果。
信号列表 | ||
信号名 | I/O | 位宽 |
clk | I | 1 |
rst_n | I | 1 |
crc_din | I | 8 |
crc_en | I | 1 |
crc_clr | I | 1 |
crc_dout | O | 32 |
表3 eth_crc32模块信号列表
图4 以太网CRC32校验的代码设计
如表4所示是arp_transfer模块信号列表,在这个模块中我们需要按照ARP帧的报文定义向PC端发送ARP应答或者ARP请求报文,所以这个模块当中需要arp_ask_en和arp_reply_en两个输入使能信号,按照报文顺序首先发送前导码,然后发送以太网首部,接着发送ARP数据报文,最后发送CRC32校验和依次打包发送到GMII上的gmii_txd总线即可。
这个模块的设计中需要注意对于ARP应答和请求报文,报文的具体内容是有一点区别的,注意前导码不需要代入以太网CRC32校验模块中计算CRC,一包报文发送完毕后需要拉高一个时钟周期的crc_clr信号以复位CRC32校验模块,如图5所示是ARP帧的发送模块的代码设计。
信号列表 | ||
信号名 | I/O | 位宽 |
clk | I | 1 |
rst_n | I | 1 |
arp_ask_en | I | 1 |
arp_reply_en | I | 1 |
local_mac_addr | I | 48 |
local_ip_addr | I | 32 |
pc_mac_addr | I | 48 |
pc_ip_addr | I | 32 |
crc_data | I | 32 |
gmii_txd | O | 8 |
gmii_tx_en | O | 1 |
crc_en | O | 1 |
crc_clr | O | 1 |
表4 arp_transfer模块信号列表
图5 ARP帧的发送模块的代码设计
最后我们需要把这些模块都通过顶层模块例化到一起,即用户按下开发板按键,开发板会向PC端发送ARP请求报文,在收到PC端的ARP应答报文后,会把PC端的MAC地址及时更新,另外如果接收到PC端发来的ARP请求报文,会立刻回复PC端ARP应答报文,如图6所示是千兆网口实现ARP通信协议顶层文件的例化。
图6 千兆网口实现ARP通信协议顶层文件的例化
因为在顶层文件中把PC端的IP地址设置为192.168.0.3,而把开发板的IP地址设置为192.168.0.2,同时把开发板的MAC地址设置为00_11_22_33_44_55,所以如图7所示,我们先在PC端把IP地址设置为192.168.0.3。
图7 设置PC端的IP地址为192.168.0.3
在这个例程中我们需要安装一个以太网抓包软件叫做“Wireshark”,安装包笔者已经提供给大家,安装过程很简单一路Next即可,用这个软件可以抓包到本地网络和无线网络的以太网帧,感兴趣的同学也可以下载一个叫做“小兵以太网测试仪”的软件,该软件可以自定义以太网报文发送,对于以太网的开发和测试有很大的帮助。
当然在不安装“小兵以太网测试仪”的情况下,我们仍可以通过PC端的DOS命令来测试以太网的ARP协议,如图8所示,我们在DOS命令下首先输入arp –d,这条命令代表删除PC端的所有以太网ARP缓存表,接着输入ping 192.168.0.2,在这里是通过ping命令来间接发起ARP请求,因为在这个例程中并没有实现 ICMP 协议,所以在ping时会请 求超时,但是在ping的过程中会发起ARP请求,开发板响应后会返回ARP应答报文。
图8 PC端发起ARP请求
如图9所示在DOS命令下首先输入arp –a,即可查询PC端的所有以太网ARP缓存表,大家可以清楚地看到PC端已成功通过ARP协议获取到开发板MAC地址。
图9 PC端获取开发板MAC地址成功
如图10所示,大家打开Wireshark软件,并选择抓包本地连接,按下开发板的按键,如图11所示在Wireshark下即可抓取到开发板向PC端发送的ARP请求报文,在输入ping 192.168.0.2时,如图如图12所示在Wireshark下即可抓取到PC端向开发板发送的ARP请求报文,感兴趣的同学双击该报文,即可显示报文中的详细信息。
图10 Wireshark界面下选择抓包本地连接
图11 Wireshark下抓取到开发板向PC端发送的ARP请求报文
图12 Wireshark下抓取到PC端向开发板发送的ARP请求报文
同时笔者在mac_receive_analy、arp_receive_analy、arp_transfer三个核心模块下都添加了ILA IP核,如图13到图15所示是分别是在线调试下的波以太网首部解析的ILA波形图、ARP数据解析的ILA波形图和ARP报文发送的ILA波形图。
图13 以太网首部解析的ILA波形图
图14 ARP数据解析的ILA波形图
图15 ARP报文发送的ILA波形图