W5500

ZYNQ EMIO使用及可重用封装

为了快速实现算法板级验证,PC端需要通过JTAG或以太网与FPGA形成通路。最简单便捷的方案是利用协议栈芯片,用户可以无视底层,利用简单的SPI协议读写寄存器实现复杂的TCP UDP等网络协议。当然带宽会受限于SPI接口有效速率,本文采用芯片为W5500,支持10M/100M自适应,其理论值高达80Mbps,基本达到算法验证的要求。

  ZYNQ可以通过灵活的EMIO模拟SPI接口,从而在最少改动官方demo的前提下移植C语言驱动程序。本文着重讲述EMIO的C语言软件驱动方式及可重用封装,封装后可以接口方式被其他应用程序直接调用,非常方便。直接上代码,再加以说明。
/*
* EMIO_ope.c
*
*/

#include "xgpiops.h"
#include "xparameters.h"
#include "xstatus.h"
#include "W5500.h"
#include "EMIO_ope.h"

static XGpioPs psGpioInstancePtr;

int EMIO_init()
{
XGpioPs_Config* GpioConfigPtr;
int xStatus;

//--EMIO的初始化

 上篇该系列博文中讲述W5500接收到上位机传输的数据,此后需要将数据缓存起来。当数据量较大或者其他数据带宽较高的情况下,片上缓存(OCM)已无法满足需求,这时需要将大量数据保存在外挂的DDR SDRAM中。

  最简单的方式是使用Xilinx的读写地址库函数Xil_In32()和Xil_Out32(),当然不仅支持32bit位宽,还包括8 16和64bit。但这种方式每次读写都要占用CPU,无法在读写的同时接收后续数据或者对之前的数据进一步处理,也就无法形成类似FPGA逻辑设计中的“流水线结构”,此时前段数据缓存过程中,后段数据会被丢弃。所以,需要利用PS端CPU子系统内的专用硬件DMA完成高速的批量数据搬移工作。

在Xilinx SDK的system.mss页面下直接导入ps_dma示例工程。
#include
#include
#include "sleep.h"

在上一篇该系列博文中讲解了MATLAB待处理数据写入.bin二进制数据文件的过程,接下来需要将数据通过以太网发送到ZYNQ验证平台。之前了解过Xilinx公司面向DSP开发的System Generator可以通过硬件协仿真的方式,进行算法板级验证。一个是本人不熟悉这种方式,再一个缺乏通用性,也无法在系统层面进行硬件验证。当然方案有很多,熟悉上位机的朋友完全可以自己写个软件完成数据传输和算法结果对比等功能。

  这里选择最简单的方案:在上位机通过网络调试助手将数据打包并发送至以太网端口,ZYNQ端利用W5500硬件协议栈芯片解析数据。有人可能会说用ZYNQ这么高端的设备还使用外接协议栈芯片连接以太网真是浪费,这里就算是开个头吧,只能说根据能力和现有条件选择传输方案。如果数据量较大的场合,可考虑用LWIP开源协议栈或直接利用verilogHDL编写UDP/IP协议和MAC控制器的方式实现1000Mbps速率传输。

  本文主要总结内容包括:TCP协议基础 网络调试助手应用事项,以及W5500的驱动移植。为了保证数据正确性,选用TCP这一可靠传输协议。以下介绍两个比较浅显易懂的博文,供没有网络和TCP协议基础的朋友参考。(见参考链接1 2)

  有了以上基础知识,我们就可以正确配置网络参数了。查看W5500驱动中网络参数配置部分代码:

同步内容