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 \n\r");
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描述。不同的方案適合不同的需求,能靈活在開發周期和性能 功耗等方面取舍,做到簡單實用,應該是各個行業技術人員的所追求的終極目標。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM