吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

zynq中三種實現GPIO的方式

FPGA學習交流 ? 2018-08-07 10:16 ? 次閱讀

MIO和EMIO方式是使用PS部分的GPIO模塊來實現GPIO功能的,支持54個MIO(可輸出三態)、64個輸入和128個輸出(64個輸出和64個輸出使能)EMIO

而IP方式是在PL部分實現 GPIO功能,PS部分通過M_AXI_GP接口來控制該GPIO IP模塊;另外EMIO模塊雖然使用PS部分GPIO但也使用了PL部分的管腳資源。

MIO方式實現GPIO
vivado中zynq設置如下圖
113328zpphwrh3spmt0rdt.png



由圖中可見要選中打開GPIO,其下自動顯示可用于GPIO的MIO(當MIO作為其他功能時就不能作為GPIO使用了),其中MIO 7、MIO 8只能作為輸出使用,因為它們用于VMODE管腳

軟件部分如下
#include
#include "platform.h"
#include "xgpiops.h"

#define LED1 0
#define LED2 9

static void delay(int dly)
{
int i, j;
for (i = 0; i < dly; i++) {
for (j = 0; j < 0xffff; j++) {
;
}
}
}

int main()
{
int Status;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio;

init_platform();

ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS){
return XST_FAILURE;
}

XGpioPs_SetDirectionPin(&Gpio, LED1, 1);
XGpioPs_SetDirectionPin(&Gpio, LED2, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED1, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED2, 1);

while (1) {
XGpioPs_WritePin(&Gpio, LED1, 0);
XGpioPs_WritePin(&Gpio, LED2, 1);
delay(1000);
XGpioPs_WritePin(&Gpio, LED1, 1);
XGpioPs_WritePin(&Gpio, LED2, 0);
delay(1000);
}
cleanup_platform();
}


EMIO方式實現GPIO
vivado中zynq設置如下圖
113329qq6qz904j5hv54w5.png



圖中可知GPIO中選擇使用EMIO,并選擇位寬(這里例子中選擇3);其vivado中連接如下圖



上圖可知除了FIXED IO和DDR接口外,還多了3個3對(一個輸入,一個輸出和一個輸出使能)GPIO管腳。

不同于MIO,這里三個IO管腳(一個輸入,一個輸出和一個輸出使能在自動生成的頂層模塊中合并為一個IO)要綁定到芯片對應管腳上

軟件部分如下
#include
#include "platform.h"
#include "xgpiops.h"

#define LED_R 54
#define LED_G 55
#define LED_B 56
#define LED_ON 0
#define LED_OFF 1

static void delay(int dly)
{
int i, j;
for (i = 0; i < dly; i++) {
for (j = 0; j < 0xffff; j++) {
;
}
}
}

int main()
{
int Status;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio;

init_platform();

ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
print("cfg init err\n");
return XST_FAILURE;
}
XGpioPs_SetDirectionPin(&Gpio, LED_R, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_R, 1);
XGpioPs_SetDirectionPin(&Gpio, LED_G, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_G, 1);
XGpioPs_SetDirectionPin(&Gpio, LED_B, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED_B, 1);

while (1) {
XGpioPs_WritePin(&Gpio, LED_R, LED_ON);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_G, LED_ON);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_B, LED_ON);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_R, LED_OFF);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_G, LED_OFF);
delay(1000);
XGpioPs_WritePin(&Gpio, LED_B, LED_OFF);
delay(1000);
}
cleanup_platform();
}

類似MIO方式(都為PS部分GPIO操作),設置為輸出并設置輸出使能,但要注意這里的GPIO號是從54開始的3個。

IP方式實現GPIO
vivado中zynq設置如下圖
113329xl44rer7g49f2apg.png



圖中可知GPIO中MIO和EMIO都不選擇,但要打開M_AXI_GP接口(這里選擇M_AXI_GP0)和復位管腳,如下圖
113330hbyhktpyaayy6kvv.png



當然用到了PL部分邏輯則至少需要一個時鐘輸出到PL部分,這里選擇FCLK_CLK0輸出50MHz,如下圖


推薦加入zynq后,不要自動連接,再加入gpio并位寬設置為3,具體設置如下圖



GPIO設置好后,再點擊上面的藍色字體的自動連接,即可得到上面的連接,這樣可以減少手動連接量。

最后vivado中連接如下圖


與EMIO類似需要將頂層三個GPIO管腳要綁定到芯片對應管腳上。

軟件部分如下
#include
#include "platform.h"
#include "xgpio.h"

#define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
#define XGPIO_BANK1 1
#define XGPIO_BANK2 2

#define LED34_R_PIN 0x01
#define LED34_G_PIN 0x02
#define LED34_B_PIN 0x04

static void delay(int dly)
{
int i, j;
for (i = 0; i < dly; i++) {
for (j = 0; j < 0xffff; j++) {
;
}
}
}

int main()
{
XGpio_Config *XGpioCfg;
XGpio XGpio;
int Status;

init_platform();

XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
Status = XGpio_CfgInitialize(&XGpio, XGpioCfg, XGpioCfg->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}

XGpio_SetDataDirection(&XGpio, XGPIO_BANK1, ~(LED34_R_PIN | LED34_G_PIN | LED34_B_PIN));
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, LED34_R_PIN | LED34_G_PIN | LED34_B_PIN);
while (1) {
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~LED34_R_PIN);
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_R_PIN | LED34_G_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_R_PIN | LED34_G_PIN | LED34_B_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_G_PIN | LED34_B_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, ~(LED34_B_PIN));
delay(1000);
XGpio_DiscreteWrite(&XGpio, XGPIO_BANK1, LED34_R_PIN | LED34_G_PIN | LED34_B_PIN);
delay(1000);
}
cleanup_platform();
return 0;
}

這里實現的功能與EMIO方式中功能相同,當時IP方式中為PL部分實現的GPIO,所以調用的函數與前面兩種GPIO實現函數不同,注意包含的GPIO頭文件,前兩種是#include "xgpiops.h"而這最后一種為#include "xgpio.h"

總結
MIO和EMIO方式使用PS部分的GPIO模塊,其中MIO方式不占用PL部分資源,其輸出管腳只能為固定的54個(而且要在未被其它外設使用的情況下),EMIO方式會占用PL的管腳資源,其管腳可在PL部分任意選擇(除特殊功能管腳),IP方式除了占用PL部分管腳資源外還會占用PL部分邏輯資源,所以其GPIO功能在PL部分實現其調用函數也和前兩種不同,最后EMIO和IP方式在vivado都需要綁定管腳。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關推薦

    示波器的三種觸發模式

    示波器的觸發方式不僅影響波形捕捉的時機,還決定了顯示的波形是否穩定。 常見的觸發模式有三種: 單次觸發 (Single)、 正常觸發 (Normal)和 自動觸發 (Auto)。下面將對這三種觸發
    的頭像 發表于 01-07 11:04 ?359次閱讀
    示波器的<b class='flag-5'>三種</b>觸發模式

    systemd journal收集日志的三種方式

    隨著 systemd 成了主流的 init 系統,systemd 的功能也在不斷的增加,比如對系統日志的管理。Systemd 設計的日志系統好處多多,這里筆者就不再贅述了,本文筆者主要介紹 systemd journal 收集日志的三種方式
    的頭像 發表于 10-23 11:50 ?362次閱讀
    systemd journal收集日志的<b class='flag-5'>三種</b><b class='flag-5'>方式</b>

    I2S有左對齊,右對齊跟標準的I2S三種格式,那么這三種格式各有什么優點呢?

    大家好,關于I2S格式,有兩個疑問請教一下 我們知道I2S有左對齊,右對齊跟標準的I2S三種格式,那么這三種格式各有什么優點呢? 而且對于標準的I2S格式,32FS傳輸16bit的數據,48fs傳輸24bit的數據,最低位會移動到右聲道,是否意味著該數據被丟棄了?還是有
    發表于 10-21 08:23

    Windows管理內存的三種主要方式

    Windows操作系統提供了多種方式來管理內存,以確保系統資源的有效利用和性能的優化。以下是關于Windows管理內存的三種主要方式的詳細闡述,包括堆內存管理、虛擬內存管理以及共享內存管理,每種
    的頭像 發表于 10-12 17:09 ?1337次閱讀

    如何利用三種 SOT-563 封裝實現共同布局

    電子發燒友網站提供《如何利用三種 SOT-563 封裝實現共同布局.pdf》資料免費下載
    發表于 09-10 14:25 ?0次下載
    如何利用<b class='flag-5'>三種</b> SOT-563 封裝<b class='flag-5'>實現</b>共同布局

    shell腳本執行的三種方式及區別

    在Linux系統中,Shell腳本是一非常實用的工具,用于自動化執行一系列命令。Shell腳本可以大大提高工作效率,簡化復雜的任務。在這篇文章中,我們將介紹Shell腳本執行的三種方式及其區別
    的頭像 發表于 08-30 15:24 ?1402次閱讀

    簡述三種esp32的開發方式是什么

    ESP32是一款由樂鑫(Espressif)推出的低功耗、高性能的Wi-Fi和藍牙雙模無線通信芯片,廣泛應用于物聯網、智能家居、智能硬件等領域。本文將詳細介紹三種ESP32的開發方式:Arduino
    的頭像 發表于 08-20 09:11 ?4020次閱讀

    常用的pwm跟蹤控制方式是哪三種

    PWM(脈寬調制)跟蹤控制是一廣泛應用于電機控制、電源管理、通信等領域的技術。它通過調整脈沖的寬度來控制輸出信號的占空比,從而實現對系統的精確控制。常用的PWM跟蹤控制方式主要有三種
    的頭像 發表于 08-14 10:34 ?1558次閱讀

    計算機網絡中的三種通信方式

    計算機網絡中的三種通信方式,即單工通信、半雙工通信和全雙工通信,是理解和設計高效網絡架構的基礎。每種通信方式都有其獨特的特性、應用場景及優缺點。以下是對這三種通信
    的頭像 發表于 08-07 15:00 ?3181次閱讀

    逆變電路的三種調壓方式

    路的三種調壓方式:脈寬調制(PWM)調壓、相位控制調壓和頻率調制調壓。 1. 脈寬調制(PWM)調壓 脈寬調制是一通過改變脈沖寬度來調整輸出電壓的調壓方式。在PWM調壓中,逆變電路的
    的頭像 發表于 08-02 16:59 ?2612次閱讀

    交流電力控制電路三種控制方式

    三種控制方式的原理、特點和應用。 一、電壓控制 電壓控制原理 電壓控制是指通過改變交流電的電壓來實現對電路的控制。在交流電力系統中,電壓是電能傳輸和分配的關鍵因素。通過調整電壓,可以改變電路中的功率和電流,從
    的頭像 發表于 06-16 11:19 ?4067次閱讀

    在線視頻會議軟件有哪些?三種實現方式

    分類來進行解說。 視頻會議技術基本上可分為兩大類:基于硬件的編解碼和基于軟件的編解碼。以下是基于兩編碼的三種在線視頻會議實現方式。 一、基于硬件的視頻會議系統 硬件視頻會議系統主要通
    的頭像 發表于 05-21 17:43 ?681次閱讀
    在線視頻會議軟件有哪些?<b class='flag-5'>三種</b><b class='flag-5'>實現</b><b class='flag-5'>方式</b>

    簡述斬波電路的三種控制方式及其特點

    斬波電路是一通過控制開關管實現對直流電壓的調節的電路。在不同的工作條件下,我們可以采用不同的控制方式來控制斬波電路的輸出,以滿足不同的需求。本文將詳細介紹斬波電路的三種常見控制
    的頭像 發表于 03-14 16:23 ?4316次閱讀

    三種實現光模塊更高傳輸速率的技術

    本文介紹三種提高光模塊傳輸速率的技術:波分復用技術、多路并行傳輸技術和高階調制技術。波分復用技術利用光的波長特性將不同波長的信號同時傳輸在同一條光纖上,實現光纖的并行傳輸。多路并行傳輸技術利用多個通道同時傳輸數據,從而提高傳輸帶寬和速度。
    的頭像 發表于 03-11 15:31 ?857次閱讀

    簡述斬波電路的三種控制方式

    斬波電路是一常見的電力電子器件,廣泛應用于直流電壓調節、電壓變換、電流變換等領域。它可以實現對電流和電壓的控制,以滿足不同的電氣設備的需求。斬波電路的控制方式主要有三種:脈寬調制控制
    的頭像 發表于 03-11 15:22 ?4582次閱讀
    百家乐官网投注方法新版| 百家乐官网庄闲当哪个好| 百家乐官网管家| 金百家乐的玩法技巧和规则| 百家乐官网五子棋| 百家乐平注资讯| 百家乐官网押注最高是多少| 大发888娱乐城 建账号| 同乐城百家乐官网娱乐城| 威尼斯人娱乐场是真的吗| 伟博百家乐官网娱乐城| 开封市| 威尼斯人娱乐场积分| 百家乐官网投注技巧| 大发888老虎机下载| 七胜百家乐官网赌场娱乐网规则| 百家乐博彩网太阳城娱乐城| 新葡京百家乐现金网| 百家乐官网论坛代理合作| 六合彩彩图| 至尊百家乐年代| 作弊百家乐官网赌具| 明升国际网址| 十三张百家乐的玩法技巧和规则| 加州百家乐官网的玩法技巧和规则 | 永利高百家乐官网网址| 大发888官网官方下载| 澳门赌百家乐能赢钱吗| 风水做生意房漏水| 百家乐官网pc| 百家乐官网开闲几率| 百家乐官网游戏策略| 百加乐牌| 金凤凰平台| 天下足球网| 大发888分析| 大发888娱乐场电话| 百家乐技巧平注常赢法| 任我赢百家乐自动投注分析系统| 百家乐官网真人游戏娱乐平台| 百家乐官网现金网平台|