目录
开发环境
- 小梅哥AC6102开发板(内含RTL8211E千兆以太网phy芯片)
- quartus prime17.1
- win10
- 千兆网卡 这个需要电脑支持,不支持就玩不了了
- 本教程是根据小梅哥的百兆网arp教程改编过来的
GMII接口介绍
- gmii_tx_clk是由fpga输出给phy的,注意方向,gmii_rx_clk则是phy输出给fpga,所以我们系统时钟就采用了gmii_rx_clk即可
- 由于系统时钟采用了gmii_rx_clk,这个引脚并没有连接到全局时钟上,所以我们可以使用altclkctrl ip核,使该时钟连接到全局时钟上,即便这样,系统时钟到了125Mhz,频率比较高,最好是要做一下时钟的约束,我们只需要简单了写个clk的时序约束就可以了,告诉fpga我们的系统时钟是125Mhz,然后他就会按这个频率去优化时序的
- 绑定引脚时,可以写个引脚的配置文件,但是要注意总线也是要一个一个绑定的,如gmii_tx_data[0],gmii_tx_data[1]…千万不要写成了gmii_tx_data0,gmii_tx_data1…
- 异步释放,同步复位,避免复位引起亚稳态
//异步释放,同步复位
always @(posedge clk or negedge s_rst_n)begin
if(s_rst_n==1'b0)begin
rst_n_r <= 0;
end
else begin
rst_n_r <= {rst_n_r[0],1'b1};
end
end
assign rst_n = rst_n_r[1];
- 以上是我自己遇到过的部分bug,如果实验失败了,首先要检查时钟是否有效,引脚是否绑定正确,时序是否违规。
以太网帧介绍
ARP帧介绍
ARP帧存在的目的
在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址,
而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
因此在通讯前必须获得目的主机的硬件地址。 ARP 协议就起到这个作用。
ARP 帧工作原理
源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这
个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播),目的主机
接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源
主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间
(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP
请求来获得目的主机的硬件地址。想一想,为什么表项要有过期时间而不是一直有效?
ARP 数据报的格式如下图所示(该图出自[TCPIP]):
ARP数据报格式
使用以太网发包工具组ARP包
注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况
是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型, 1 为以太网,
协议类型指要转换的地址类型, 0x0800 为 IP 地址,后面两个地址长度对于以太网地址和 IP 地址分别为
6 和 4(字节), op 字段为 1 表示 ARP 请求, op字段为 2 表示 ARP 应答。
用wireshark软件抓包
用CRC计算软件计算CRC校验值
手动计算CRC
完整的以太网数据包结尾是帧校验(FCS), 即 CRC32 值, 由于整个过程中都没有出现
CRC 校验字段的内容,而我们使用 FPGA 发包需要计算 CRC 校验字段, CRC 校验字段的产生
可以使用软件或硬件的形式产生,本节实验,为了降低难度, 使用 CRC 计算软件手动计算出
数据报的 CRC 值, 因此使用专用 CRC 校验工具对数据内容进行计算以得到校验字:
CRC 校验软件计算校验内容
第一次发的时候,我将arp中的des_mac默认为00_00_00_00_00_00的,后面通过arp应答包,解析出des_mac的值后,crc就要做相应的更新,为了方便,我是直接用crc计算校正值的,不同的电脑mac不一样,所以需要自己计算一下。
always @(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)begin
crc_value <= 32'h967d1d69;
end
else begin
crc_value <= 32'h24495d2f; //这个值要根据你们自己电脑的mac来计算
end
end
自动计算CRC
自己看代码研究一下吧,关键点是要时序对齐,注意下降沿采集的技巧(可提前半拍把crc送走,否则时序会出问题!!!),这个crc算法倒是不用过于深究,直接用就可以了。
/************************************************************************
* Author : Wen Chunyang
* Email : 1494640955@qq.com
* Create time : 2018-11-19 22:27
* Last modified : 2018-11-19 22:27
* Filename : crc.v
* Description :
* *********************************************************************/
module crc(
input clk ,
input rst_n ,
input [ 7: 0] din ,
input en ,
input init ,
output reg [31: 0] crc
);
//=============================&