FPGA控制W5500完成UDP环回测试
1 前言
本文针对已经对W5500有一定了解,并且数据手册已经通读一遍的人群,因为博主目前只完成了UDP环回测试,因此在后文可能只介绍有关UDP部分。
2 前期准备
1.FPGA核心板或者开发板;
2.W5500模块。下图是博主使用的模块;
3.网络调试助手,网上随便找一个就行;
3 W5500寄存器描述
主机与W5500通信有固定协议(数据帧),主机先发两个字节的寄存器地址,然后一个字节的控制字,最后是数据,这个数据可以是一个字节,也可以是N的字节,但是W5000为了方便操作,可以将这个N分为1、2、4和可变长度,这些都可以配置。下图是数据帧格式。
下图是控制字段寄存器,BSB4~BSB0选择寄存器,RWB是读写选择位(1:写 0:读),OM选择数据段中N的字节数。
W5500的寄存器分为两种,一是通用寄存器,二是socket寄存器。这两种寄存器通过数据帧中的地址段来选择,如下图所示。例如,当寄存器地址为16’h0000时,如果BSB是5‘h00000,那么此时选择的是通用寄存器中的MR寄存器;如果BSB是5‘h00001,那么此时选择的是socket0寄存器中的Sn_MR寄存器。
4 W5500 环回测试
4.1 W5500初始化
4.1.1 通用寄存器初始化
通用寄存器的初始化就是配置源网关、子网掩码、MAC地址,IP地址、PHY寄存器,然后清中断。
always@(posedge clk,negedge rst_n)
if(!rst_n)
o_dat<='d0;
else begin
case(state)
WR_MR://WRMR_CMD,
o_dat<=8'h00;
WRGAR_CMD,WR_GAR:
if(rdreq)
case(cnt_byte)
'd00:o_dat<=GAR[31:24];
'd01:o_dat<=GAR[23:16];
'd02:o_dat<=GAR[15:08];
'd03:o_dat<=GAR[07:00];
default:;
endcase
else
o_dat<=o_dat;
WR_SUBR://WRSUBR_CMD,
if(rdreq)
case(cnt_byte)
'd00:o_dat<=SUBR[31:24];
'd01:o_dat<=SUBR[23:16];
'd02:o_dat<=SUBR[15:08];
'd03:o_dat<=SUBR[07:00];
default:;
endcase
else
o_dat<=o_dat;
WR_SHAR://WRSHAR_CMD,
if(rdreq)
case(cnt_byte)
'd00:o_dat<=SHAR[47:40];
'd01:o_dat<=<