zoukankan      html  css  js  c++  java
  • ZYNQ EMIO使用及可重用封装

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

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

     1 /*
     2  * EMIO_ope.c
     3  *
     4  */
     5 
     6 
     7 #include "xgpiops.h"
     8 #include "xparameters.h"
     9 #include "xstatus.h"
    10 #include "W5500.h"
    11 #include "EMIO_ope.h"
    12 
    13 
    14 static XGpioPs psGpioInstancePtr;
    15 
    16 int EMIO_init()
    17 {
    18     XGpioPs_Config* GpioConfigPtr;
    19     int xStatus;
    20 
    21     //--EMIO的初始化
    22     GpioConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
    23     if(GpioConfigPtr == NULL)
    24         return XST_FAILURE;
    25 
    26     xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);
    27     if(XST_SUCCESS != xStatus)
    28         print(" PS GPIO INIT FAILED 
    
    ");
    29 
    30     //--EMIO的输入输出操作
    31     XGpioPs_SetDirectionPin(&psGpioInstancePtr, ETH_NRST_BASE,1);
    32     XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_MOSI_BASE,1);
    33     XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_CSN_BASE,1);
    34     XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_SCLK_BASE,1);
    35     XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_MISO_BASE,0);
    36 
    37     //使能输出端口
    38     XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, ETH_NRST_BASE,1);
    39     XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, USER_SPI_MOSI_BASE,1);
    40     XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, USER_SPI_CSN_BASE,1);
    41     XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, USER_SPI_SCLK_BASE,1);
    42 
    43     return xStatus;
    44 }
    45 
    46 
    47 void writePin(u32 pinNum,u32 value)
    48 {
    49     XGpioPs_WritePin(&psGpioInstancePtr, pinNum, value);
    50 }
    51 
    52 u32 readPin(u32 pinNum)
    53 {
    54     return XGpioPs_ReadPin(&psGpioInstancePtr,pinNum);
    55 }

       Xilinx封住的库函数有其固定的“套路”。首先查找设备配置,初始化。之后设置EMIO的方向,如果是输出方向还要使能输出。这里将上述预处理部分封装到EMIO_Init()函数中。之后再编写两个函数分别实现EMIO寄存器的读和写,也就是读取输入接口数据以及输出数值,两者内部均调用Xilinx官方提供的API函数。将实现细节隐藏最重要的步骤:将函数声明统一放置.h文件。

    /*
     * EMIO_ope.h
     *
     */
    
    #ifndef SRC_EMIO_OPE_H_
    #define SRC_EMIO_OPE_H_
    
    #define GPIO_DEVICE_ID XPAR_PS7_GPIO_0_DEVICE_ID
    
    int EMIO_init();
    void writePin(u32 pinNum,u32 value);
    u32 readPin(u32 pinNum);
    
    #endif /* SRC_EMIO_OPE_H_ */

      此处总结下利用FPGA/SOC连接以太网从简单到难的设计方案是:协议栈芯片 --> LWIP开源库 --> 基于以太网MAC的网络协议逻辑设计--> 从上层网络协议到MAC全部用HDL描述。不同的方案适合不同的需求,能灵活在开发周期和性能 功耗等方面取舍,做到简单实用,应该是各个行业技术人员的所追求的终极目标。

  • 相关阅读:
    React页面插入script
    Node Sass does not yet support your current environment解决办法
    ReactNative项目结构目录详解
    Android Studio模拟器磁盘空间不足(Not enough disk space to run AVD)
    React Native在window下的环境搭建(二):创建新项目
    React Native在window下的环境搭建(一)
    转:解决AndroidStudio连不上Android设备真机的问题
    ios中设置input为readonly后,解决弹起软键盘的问题
    转: rem与px的转换
    Python中模块之collections系列
  • 原文地址:https://www.cnblogs.com/moluoqishi/p/9198772.html
Copyright © 2011-2022 走看看