為了快速實現算法板級驗證,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的初始化
GpioConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED /n/r");
//--EMIO的輸入輸出操作
XGpioPs_SetDirectionPin(&psGpioInstancePtr, ETH_NRST_BASE,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_MOSI_BASE,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_CSN_BASE,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_SCLK_BASE,1);
XGpioPs_SetDirectionPin(&psGpioInstancePtr, USER_SPI_MISO_BASE,0);
//使能輸出端口
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, ETH_NRST_BASE,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, USER_SPI_MOSI_BASE,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, USER_SPI_CSN_BASE,1);
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, USER_SPI_SCLK_BASE,1);
return xStatus;
}
void writePin(u32 pinNum,u32 value)
{
XGpioPs_WritePin(&psGpioInstancePtr, pinNum, value);
}
u32 readPin(u32 pinNum)
{
return XGpioPs_ReadPin(&psGpioInstancePtr,pinNum);
}
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描述。不同的方案適合不同的需求,能靈活在開發周期和性能 功耗等方面取舍,做到簡單實用,應該是各個行業技術人員的所追求的終極目標。
-
FPGA
+關注
關注
1630文章
21797瀏覽量
606016 -
soc
+關注
關注
38文章
4204瀏覽量
219098 -
Xilinx
+關注
關注
71文章
2171瀏覽量
122142
發布評論請先 登錄
相關推薦
Xilinx ZYNQ開發GPIO的三種方式:MIO、EMIO、AXI_GPIO
![Xilinx <b class='flag-5'>ZYNQ</b>開發GPIO的三種方式:MIO、<b class='flag-5'>EMIO</b>、AXI_GPIO](https://file.elecfans.com/web1/M00/C8/6A/pIYBAF9uIUGACO_GAAGEXyJbwdY370.png)
可重用機床編碼技術及重構算法研究
玩轉Zynq連載31——[ex53] 基于Zynq PS的EMIO控制
【正點原子FPGA連載】第三章EMIO按鍵控制LED實驗-領航者 ZYNQ 之嵌入式開發指南
分享!基于Zynq-7010/7020的多路千兆網口實現方案
ZYNQ的學習筆記分享
實現上位機與zynq7020開發板通信的方法
ZYNQ 的三種GPIO :MIO、EMIO、AXI
![<b class='flag-5'>ZYNQ</b> 的三種GPIO :MIO、<b class='flag-5'>EMIO</b>、AXI](https://file1.elecfans.com//web2/M00/A6/A7/wKgZomUMP2iAFCpEAAATSCyJ-dY438.png)
基于小樣本重用的混合盲均衡算法
基于可重用激勵發生機制的虛擬SoC驗證平臺
![基于可<b class='flag-5'>重用</b>激勵發生機制的虛擬SoC<b class='flag-5'>驗證</b>平臺](https://file.elecfans.com/web2/M00/49/6A/poYBAGKhwLCAF7zGAAASzffD9EI261.jpg)
zynq 串口引腳引到emio 無法進入接收中斷問題記錄
![<b class='flag-5'>zynq</b> 串口引腳引到<b class='flag-5'>emio</b> 無法進入接收中斷問題記錄](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
可重用的驗證組件中構建測試平臺的步驟
![可<b class='flag-5'>重用</b>的<b class='flag-5'>驗證</b>組件中構建測試平臺的步驟](https://file1.elecfans.com/web2/M00/89/8B/wKgZomSHwvCAMZd1AAA9F9tRAYU977.png)
評論