FPGA控制W5500完成UDP环回测试
FPGA控制W5500完成UDP环回测试
- 1 前言
- 2 前期准备
- 3 W5500寄存器描述
- 4 W5500 环回测试
- 4.1 W5500初始化
- 4.1.1 通用寄存器初始化
- 4.1.2 socket寄存器初始化
- 4.2 W5500数据接收
- 4.3 W5500数据发送
- 4.4 数据环回
- 5 总结
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 begincase(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:;endcaseelseo_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:;endcaseelseo_dat<=o_dat;WR_SHAR://WRSHAR_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=SHAR[47:40];'d01:o_dat<=SHAR[39:32];'d02:o_dat<=SHAR[31:24];'d03:o_dat<=SHAR[23:16];'d04:o_dat<=SHAR[15:08];'d05:o_dat<=SHAR[07:00]; default:;endcaseelseo_dat<=o_dat; WR_IP://WRIP_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=SIPR[31:24];'d01:o_dat<=SIPR[23:16];'d02:o_dat<=SIPR[15:08];'d03:o_dat<=SIPR[07:00];default:;endcaseelseo_dat<=o_dat;WRIR_CMD,WR_IR,WRIMR_CMD,WR_IMR:o_dat<=8'hFF;WR_RTR://WRRTR_CMD,if(rdreq)case(cnt_byte)'d00:o_dat<=8'h07;'d01:o_dat<=8'hD0;default:;endcaseelseo_dat<=o_dat;WRRCR_CMD,WR_RCR:o_dat<=8'h08;WRPHY_CMD,WR_PHY:o_dat<=8'b11111111;default:o_dat<=8'h00;endcaseend
4.1.2 socket寄存器初始化
socket寄存器配置跟通用寄存器类似,先配置目的socket模式(TCP、UDP、MACRAW)、MAC地址、目的IP地址、目的端口、以及本地端口等寄存器,然后清中断等,最后配置Sn_CR寄存器打开端口,之后就是定时查询SN_SR寄存器,等待socket初始化成功(Sn_SR寄存器值为8’h22)。
always@(posedge clk,negedge rst_n)if(!rst_n)o_dat<='d0; else begincase(state)WR_MR:o_dat<=8'h02;WR_IR,WR_IMR:o_dat<=8'hFF;WR_PORT:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_PORT[15:08]; 'd01:o_dat<=SN_PORT[07:00];default:;endcaseelseo_dat<=o_dat;WR_DHAR:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_DSHAR[47:40]; 'd01:o_dat<=SN_DSHAR[39:32];'d02:o_dat<=SN_DSHAR[31:24]; 'd03:o_dat<=SN_DSHAR[23:16];'d04:o_dat<=SN_DSHAR[15:08]; 'd05:o_dat<=SN_DSHAR[07:00]; default:;endcaseelseo_dat<=o_dat;WR_DIPR:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_DIP[31:24]; 'd01:o_dat<=SN_DIP[23:16];'d02:o_dat<=SN_DIP[15:08]; 'd03:o_dat<=SN_DIP[07:00]; default:;endcaseelseo_dat<=o_dat;WR_DPORT:if(rdreq)case(cnt_byte)'d00:o_dat<=SN_DPORT[15:08]; 'd01:o_dat<=SN_DPORT[07:00];default:;endcaseelseo_dat<=o_dat;WR_MSSR:if(rdreq)case(cnt_byte)'d00:o_dat<=8'h05; 'd01:o_dat<=8'hB4;default:;endcaseelseo_dat<=o_dat; WR_CR:o_dat<=8'h01; default:;endcase end
4.2 W5500数据接收
软件一直在查询Sn_RX_RSR寄存器(Socket n 空闲接收缓存寄存器),显示了 Socket n 接收缓存中已接收和保存的数据大小,当其值大于0时,表明socket已经接收到数据,因此可以进行数据接收流程。W5500数据手册提供了一种数据读取的方法,如下图所示。
socket的接收缓存(RX_BUF)有两个指针,一是写指针(Sn_RX_WR)二是读指针(Sn_RX_RD),当外部将UDP数据发送给W5500时,Sn_RX_WR会自动增加,因此Sn_RX_WR是W5500芯片控制的。Sn_RX_RD由用户控制,控制流程如上图所示。
always@(posedge clk,negedge rst_n)if(!rst_n)o_dat<='d0;else begincase(state)WR_RXRD: if(rdreq)case(cnt_byte)'d00:o_dat<=rx_ptr[15:08]; 'd01:o_dat<=rx_ptr[07:00];default:;endcaseelseo_dat<=o_dat;WR_CR:o_dat<=8'h40; default:o_dat<=o_dat;endcaseendalways@(posedge clk,negedge rst_n)if(!rst_n)rx_ptr<='d0;else begincase(state)RD_RXRD:if(rdrxrd_vld)rx_ptr<=dinr;elserx_ptr<=rx_ptr;RD_RXBUF:if(den)rx_ptr<=rx_ptr+'d1;elserx_ptr<=rx_ptr;
// END:
// rx_ptr<='d0;default:rx_ptr<=rx_ptr;endcase end
4.3 W5500数据发送
软件进入数据发送流程时,先查询W5500的发送缓存剩余空间大小,如果剩余空间大于用户发送数据长度,那么继续后续流程,反之则拒绝发送用户数据。同样,手册也提供了一种数据发送的方法,如下图所示。
4.4 数据环回
软件例化例一个ram来存储收到的数据,接收完成后将数据读出然后发送,代码如下:
always@(posedge clk,negedge rst_n)if(!rst_n)state<='d0;else begincase(state)IDLE:if(rxdat_end && waddr>'d0)state<=RDDAT_PRE;elsestate<=IDLE;RDDAT_PRE:state<=RD_DAT;RD_DAT:if(dat_tx_end)state<=END;else state<=RD_DAT;END:state<=IDLE;default:state<=IDLE;endcaseendalways@(posedge clk,negedge rst_n)if(!rst_n)dat_len<='d0;else if(state==RDDAT_PRE)dat_len<=waddr;always@(posedge clk,negedge rst_n)if(!rst_n)o_dat_tx_req<='d0;else if(state==RDDAT_PRE)o_dat_tx_req<='d1;else if(state==END)o_dat_tx_req<='d0; elseo_dat_tx_req<=o_dat_tx_req;always@(posedge clk,negedge rst_n)if(!rst_n)waddr<='d0; else if(rxdat_vld)waddr<=waddr+'d1;else if(state==END) waddr<='d0; always@(posedge clk,negedge rst_n)if(!rst_n)raddr<='d0; else if(dat_tx_rden)raddr<=raddr+'d1;else if(state==END) raddr<='d0; my_ram my_ram_inst (.clock ( clk ),.wren ( rxdat_vld ),.wraddress ( waddr ),.data ( rxdat ),.rden ( dat_tx_rden ),.rdaddress ( raddr ),.q ( o_dat ));assign o_dat_len =dat_len;
最后测试结果如下图所示,包含wireshark抓包结果。
5 总结
W5500的UDP通信是不难的,只要初始化正确,然后在收发时正确读写socket寄存器,然后就没啥难度了,手册的话还是要多看几遍,博主是在官网下载中文手册, W5500官网(手册、参考电路、驱动固件、例程等),完整代码及工程放在评论区。
博主在完成UDP环回测试后还尝试进行TCP测试验证,W5500作为客户端,但是在配置完成后发现W5500都没有发出ARP包,后来就没有测了,暂时先放下。
FPGA控制W5500完成UDP环回测试相关推荐
- FPGA纯verilog实现UDP通信,三速网自协商仲裁,动态ARP和Ping功能,提供工程源码和技术支持
目录 1.前言 2.我这里已有的UDP方案 3.UDP详细设计方案 MAC层发送 MAC发送模式 ARP发送 IP层发送 IP发送模式 UDP发送 MAC层接收 ARP接收 IP层接收 UDP接收 S ...
- 基于Virtex-6 FPGA的三种串行通信协议测试及对比
在高性能雷达信号处理机研制中,高速串行总线正逐步取代并行总线.业界广泛使用的Xilinx公司Virtex-6系列FPGA支持多种高速串行通信协议,本文针对其中较为常用的Aurora 8B/10B和PC ...
- FD.io VPP利用iperf3进行UDP灌包测试-英特尔X520万兆网卡
FD.io VPP:用户文档 iperf3灌包测试 RToax 2020年9月 架构 1. VPP环境配置与启动 1.1. 安装VPP环境 略 1.2. VPP配置文件 启动配置文件startup-i ...
- FPGA控制TDC-GPX2时间间隔测量(一)
距离上一次使用FPGA控制TDC芯片测量时间间隔已经过去一年多了,当时采用的TDC芯片是TI的一款芯片TDC7200,最后测量结果所能达到的精度为百皮秒级别,最近使用入手了AMS生产的TDC-GPX2 ...
- FPGA控制TDC-GPX2时间间隔测量(三)
前两篇分别介绍了TDC-GPX2的使用详情以及FPGA控制代码,本文将会该处测量精度以及操作过程 测试平台 由于目前没有高精度时间间隔测量的仪器在身边(之前还有过一台SR620,现在没有了),所以将会 ...
- FPGA控制ADS1256的ADC采集(三)
前两篇分别详解了ADS1256的数据手册以及代码分析,这篇文章来介绍一下实际操作以及精准分析.附上上一篇文章的链接:FPGA控制ADS1256的ADC采集(二). 测试 (1)4.69V电压测试 实际 ...
- FPGA控制DDS_AD9850输出正弦波(“并行spi”)
本次介绍ADI公司的数字频率合成(DDS)芯片--AD9850以及如何使用FPGA控制其输出正弦波. 本文分三个部分讲解:一是AD9850芯片介绍,包括基本引脚功能.驱动时序以及相关注意事项:二是基于 ...
- python监听多个udp端口_用Python写一个UDP端口测试工具(一)
需求 最近有个运维需求,需要测试客户端的UDP端口与服务器的连通性. 需求也很简单:客户端测往服务端发UDP包,服务端收到包后响应客户端,当客户端能收到服务端的响应则可断定端口是可达的.但是客户端需要 ...
- 基于FPGA的简易数字频率计+上板测试(小梅哥AC620FPGA开发板)
基于FPGA的简易数字频率计+上板测试(小梅哥AC620FPGA开发板 目录 主要架构 1.计数模块 2.数码显示模块 3.控制信号模块 4.分频模块 例化模块 上板测试图 附:74HC595移位寄存 ...
最新文章
- 《我的Python之路V1.3.pdf》可以下载了,这版pdf更精美!
- freemarker配置
- JS通用窗口拖动函数
- JDK 5 ~ 10 新特性倾情整理
- 局域网内数据采集总结(三)
- git将本地仓库强制替换掉远程仓库
- 应届毕业生面试软件测试工程师时应注意什么?
- php基于纯真IP数据库实现IP地址信息查询
- XJOI一级五段题解(g++,即C++),也可视作C++算法竞赛教程
- 微型计算机的cpu分类,微处理器分类及组成
- Windows 10 修改文件夹图标
- 计算机网络战队名称大全,响亮的战队名字大全,吓到敌人了!
- 苹果手机3D-Touch这个功能,其实是吃鸡神器!
- 边缘风行视频采集软件V1.0
- Kalilinux2017.2安装搜狗拼音输入法
- Test on 12/01/2018
- C#结合天敏VC4000采集卡视频监控
- http请求报错SSLError: HTTPSConnectionPool:Max retries exceeded with url
- python正则表达式取中间字符串_正则表达式如何获取中间字符串
- freemap初学者教程_Jupyter初学者笔记本:教程
热门文章
- MySQL系列---数据库引擎
- mkdir命令(创建目录(文件夹))
- C语言求离散数学中析取合取等
- 机器学习之LSI:文本主题模型之潜在语义分析(LSI)
- linux的磁盘文件系统特点总结(ext2/ext3/ext4/xfs/tmpfs)
- Linux系统网速测速,Linux系统下的网络带宽测速
- 点焊机器人焊接超时_机器人点焊自动化—点焊焊接工艺详解
- vue 项目node服务器部署流程
- v12.2.8 released版本介绍--2019_7
- 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可