0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AXI_GPIO簡介與使用指南

FPGA之家 ? 來源:CSDN技術(shù)社區(qū) ? 作者:Vuko-wxh ? 2022-07-19 17:36 ? 次閱讀

學(xué)習(xí)內(nèi)容

前面簡單學(xué)習(xí)了關(guān)于GPIO的操作,本次將使用PL 端調(diào)用 AXI GPIO IP 核, 并通過 AXI4-Lite 接口實(shí)現(xiàn) PS 與 PL 中 AXI GPIO 模塊的通信。

開發(fā)環(huán)境

vivado 18.3SDKPYNQ-Z2

AXI_GPIO簡介


AXI GPIO IP 核為 AXI 接口提供了一個(gè)通用的輸入/輸出接口。與 PS 端的 GPIO 不同, AXI GPIO 是一個(gè)軟核( Soft IP),即 ZYNQ 芯片在出廠時(shí)并不存在這樣的一個(gè)硬件電路, 而是由用戶通過配置 PL 端的邏輯資源來實(shí)現(xiàn)的一個(gè)功能模塊。而 PS 端的 GPIO 是一個(gè)硬核( Hard IP) ,它是一個(gè)生產(chǎn)時(shí)在硅片中實(shí)現(xiàn)的功能電路。我們之前驅(qū)動(dòng)的MIO接口,他屬于PS端口的一個(gè)搭載好的硬件資源,而對(duì)于AXI_GPIO這樣一個(gè)IP核來說他就相當(dāng)于與在PL的邏輯端口實(shí)現(xiàn)了一個(gè)軟核IP的GPIO接口。AXI 接口作為 ZYNQ PS 和 PL 之間的橋梁, 能夠使兩者協(xié)同工作,進(jìn)而形成一個(gè)完整的、 高度集成的系統(tǒng)。AXI GPIO 可以配置成單通道或者雙通道, 每個(gè)通道的位寬可以單獨(dú)設(shè)置。另外通過打開或者關(guān)閉三態(tài)緩沖器, AXI GPIO 的端口還可以被動(dòng)態(tài)地配置成輸入或者輸出接口。其頂層模塊的框圖如下所示:


a0e999e8-06f8-11ed-ba43-dac502259ad0.png


模塊的左側(cè)實(shí)現(xiàn)了一個(gè) 32 位的 AXI4-Lite 從接口, 用于主機(jī)訪問 AXI GPIO 內(nèi)部各通道的寄存器。當(dāng)右側(cè)接口輸入的信號(hào)發(fā)生變化時(shí),模塊還能向主機(jī)產(chǎn)生中斷信號(hào)。不過只有在配置 IP核時(shí)選擇“ 使能中斷” , 才會(huì)啟用模塊的中斷控制功能。

我們可以在xilinx的一個(gè)說明書(UG144)中詳細(xì)的看到關(guān)于AXI_GPIO IP的具體的寄存器,對(duì)于不同功能的配置我們只需要像在ARM開發(fā)中進(jìn)行寄存器的配置即可,但寄存器的操作過于繁瑣,在一般的開發(fā)過程中我們通常進(jìn)行的都是庫函數(shù)的使用調(diào)用。

在文檔中我們可以看到IP的以下特點(diǎn),基本包含了硬件GPIO的所有功能。設(shè)置輸入輸出模式,設(shè)置中斷等。

a0f801b8-06f8-11ed-ba43-dac502259ad0.png

引腳說明表如下,在這個(gè)表中,大致分為了兩類,第一類s_axi接口的相關(guān)引腳,用于配置掛載到AXI總線,s_axi_*這是一組信號(hào)接口,用于進(jìn)行數(shù)據(jù)的交互和配置;第二類是和GPIO有關(guān)的信號(hào)接口,這里的IP中有兩組gpio,每組輸出三個(gè)信號(hào)經(jīng)過一個(gè)三態(tài)緩存器實(shí)現(xiàn)三態(tài)輸出。為了實(shí)現(xiàn)中斷功能,這里的ip2intc_irpt是中斷的敏感信號(hào)。


a108f2e8-06f8-11ed-ba43-dac502259ad0.png


編程指南

同樣在UG144中我們可以找到對(duì)于AXI_GPIO IP在應(yīng)用開發(fā)的時(shí)候的一個(gè)編程指南

設(shè)置帶中斷的INPUT

  1. 將端口配置為輸入,將相應(yīng)的位寫入GPIOx_TRI寄存器,值為1。
  2. 通過設(shè)置IP中斷使能中相應(yīng)的位使能通道中斷注冊(cè);也可以通過設(shè)置全局中斷的第31位來啟用全局中斷注冊(cè)為1。
  3. 當(dāng)接收到中斷時(shí),讀取GPIOx_DATA寄存器中相應(yīng)的位。通過寫入值為1的對(duì)應(yīng)位來清除IP中斷狀態(tài)寄存器中的狀態(tài)。

這里的編程指南描述的是寄存器的配置流程,在我們的實(shí)際應(yīng)用中簡單來說就是調(diào)用庫函數(shù)配置端口為輸入,然后進(jìn)行中斷功能的注冊(cè)(類似前文的GPIO的按鍵中斷)。

配置為普通的INPUT

  1. 將端口配置為輸入,將相應(yīng)的位寫入GPIOx_TRI寄存器,值為1。
  2. 讀取GPIOx_DATA寄存器中相應(yīng)的位。

配置為普通的OUTPUT

  1. 通過在GPIOx_TRI寄存器中寫入值為0的對(duì)應(yīng)位,將端口配置為輸出。
  2. 將相應(yīng)的位寫入GPIOx_DATA寄存器。

工程系統(tǒng)框圖

實(shí)現(xiàn)功能為使用EMIO的引腳驅(qū)動(dòng)LED,使用AXI_GPIO的IP進(jìn)行按鍵控制,當(dāng)我們按鍵按下時(shí),我們的LED進(jìn)行一次反轉(zhuǎn)。
a114b36c-06f8-11ed-ba43-dac502259ad0.png

硬件平臺(tái)搭建

同樣重復(fù)前面的步驟,打開vivado工具的block design 添加ZYNQ的IP核,完成基礎(chǔ)配置。

a11dd014-06f8-11ed-ba43-dac502259ad0.png


然后打開MIO configuration,對(duì)EMIO引腳的LED進(jìn)行配置

a12c8f8c-06f8-11ed-ba43-dac502259ad0.png


因?yàn)檫@里我們要使用AXI_GPIO的中斷功能,所以我們打開中斷界面進(jìn)行配置,開啟中斷后,勾選PL到PS的中斷功能。這里的中斷標(biāo)號(hào)有16個(gè),對(duì)應(yīng)原則是[15:0]對(duì)應(yīng)的是[91:84]:[68:61],這里我們只使用了一個(gè)中斷,所以我們的中斷標(biāo)號(hào)是61。

a13b3b68-06f8-11ed-ba43-dac502259ad0.png

配置完成后添加AXI_GPIO的IP核。配置使能中斷,GPIO的位寬選擇為1即可。

a14bb9b6-06f8-11ed-ba43-dac502259ad0.png

完成配置后得到下圖點(diǎn)擊運(yùn)行自動(dòng)連接,可以進(jìn)行幫助我們進(jìn)行對(duì)應(yīng)端口的自動(dòng)連接:

a157c8c8-06f8-11ed-ba43-dac502259ad0.png自動(dòng)連接完成后如圖所示:a16447b0-06f8-11ed-ba43-dac502259ad0.png



這里工具幫助我們完成了大部分的連接,但是沒有幫助我們進(jìn)行中斷功能的連線,我們需要手動(dòng)進(jìn)行連接。

a16f7ae0-06f8-11ed-ba43-dac502259ad0.png

手動(dòng)連接完成:

a17a4c40-06f8-11ed-ba43-dac502259ad0.png


完成設(shè)計(jì)后,我們進(jìn)行g(shù)enerate output product 然后生成HDL封裝。接著就對(duì)應(yīng)引腳進(jìn)行引腳約束即可(PYNQ的粉色開發(fā)板可以直接引用這個(gè)約束):

set_property -dict { PACKAGE_PIN R14   IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_tri_io[0] }]; #IO_L6N_T0_VREF_34 Sch=led[0]
set_property -dict { PACKAGE_PIN D19   IOSTANDARD LVCMOS33 } [get_ports { axi_gpio0_tri_io[0] }]; #IO_L4P_T0_35 Sch=btn[0]

完成約束后進(jìn)行綜合布局布線,等待生成bit流文件。bit文件生成后在FILE處,點(diǎn)擊導(dǎo)出硬件資源(包含bit流文件),接著launch SDK。

軟件部分編寫

這里引用的AXI GPIO的資源對(duì)應(yīng)的是gpio的部分,配置相應(yīng)的功能函數(shù)可以參考相應(yīng)的文件和對(duì)應(yīng)的例程。

a186df82-06f8-11ed-ba43-dac502259ad0.png


首先給出我本次的工程代碼,在后面進(jìn)行簡要的說明:

#include 
#include "platform.h"
#include "xil_printf.h"
#include "xgpiops.h"
#include "xgpio.h"
#include "xparameters.h"
#include "xparameters_ps.h"
#include "xscugic.h"
#include "sleep.h"
//設(shè)置設(shè)備id和io編號(hào)
#define GPIO_ID XPAR_XGPIOPS_0_DEVICE_ID //PS GPIO的器件ID
#define AXI_GPIO_ID XPAR_GPIO_0_DEVICE_ID//AXIGPIO的器件ID
#define SCUGIC_ID XPAR_PS7_SCUGIC_0_DEVICE_ID//中斷的ID
//axi gpio的中斷號(hào)
#define AXI_GPIO_INTR_ID XPAR_FABRIC_GPIO_0_VEC_ID
#define LED0 54
//axi gpio通道1
#define AXI_GPIO_CHANNEL 1
//定義調(diào)用GpioPs的結(jié)構(gòu)體
XGpioPs gpiops;
XGpioPs_Config *gpio_cfg;
//定義調(diào)用中斷的結(jié)構(gòu)體
XScuGic gpio_gic;
XScuGic_Config *gpio_gic_cfg;
//定義調(diào)用Gpio的結(jié)構(gòu)體
XGpio axi_Gpio;
//變量聲明
u32 key_value=0;
//函數(shù)聲明
void Init_gpio();
void IntrHandler();
int main()
{
u32 led_status=0;
    init_platform();
    Init_gpio();
    Init_interrupt();
    print("axi_gpio TEST

");
    while(1)
    {
    if(key_value==1){
    //清除中斷狀態(tài)
    if(XGpio_DiscreteRead(&axi_Gpio, AXI_GPIO_CHANNEL)==1){
    led_status=~led_status;
    }
    XGpio_InterruptClear(&axi_Gpio, 0x0000001);
    key_value=0;

    XGpioPs_WritePin(&gpiops,LED0,led_status);
    usleep(200000);
    //打開中斷使能
    XGpio_InterruptEnable(&axi_Gpio, 0x0000001);//使能中斷
    }
    }
    cleanup_platform();
    return 0;
}
//初始化gpio
void Init_gpio(){
//查找設(shè)備ID,gpio初始化操作
gpio_cfg=XGpioPs_LookupConfig(GPIO_ID);
XGpioPs_CfgInitialize(&gpiops,gpio_cfg,gpio_cfg->BaseAddr);
//設(shè)置gpio為輸出,開啟使能
XGpioPs_SetDirectionPin(&gpiops,LED0,1);
XGpioPs_SetOutputEnablePin(&gpiops,LED0,1);
//對(duì)PL端的gpio進(jìn)行初始化
XGpio_Initialize(&axi_Gpio,AXI_GPIO_ID);
//對(duì)AXI設(shè)置方向
XGpio_SetDataDirection(&axi_Gpio,AXI_GPIO_CHANNEL,0x0000001);//設(shè)置為輸入

}
void Init_interrupt(){
//初始化gic
gpio_gic_cfg = XScuGic_LookupConfig(SCUGIC_ID);
XScuGic_CfgInitialize(&gpio_gic,gpio_gic_cfg,gpio_gic_cfg->CpuBaseAddress);

//初始化異常處理
Xil_ExceptionInit();
//CPU中斷異常注冊(cè)
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&gpio_gic);
//使能處理器中斷
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

//鏈接中斷信號(hào)
XScuGic_Connect(&gpio_gic,AXI_GPIO_INTR_ID,(Xil_InterruptHandler)IntrHandler,&axi_Gpio);
//使能中斷
XScuGic_Enable(&gpio_gic,AXI_GPIO_INTR_ID);
//0xa0中斷優(yōu)先級(jí)
XScuGic_SetPriorityTriggerType(&gpio_gic,AXI_GPIO_INTR_ID,0xA0, 0x3);
//axi gpio使能中斷
XGpio_InterruptGlobalEnable(&axi_Gpio);//打開全局中斷
XGpio_InterruptEnable(&axi_Gpio, 0x0000001);//使能中斷
}
void IntrHandler(){
printf("interrupt~~

");
key_value=1;
//關(guān)閉中斷使能
XGpio_InterruptDisable(&axi_Gpio, 0x0000000);

}

部分代碼講解

代碼很類似上次的GPIO的中斷功能的代碼,這里只是更改了部分函數(shù)對(duì)axi gpio的ip進(jìn)行ip的配置,實(shí)現(xiàn)帶中斷的輸入功能的KEY。axi的初始化只需要一行代碼即可完成,然后根據(jù)編程指南設(shè)置下方向即可完成輸入的配置XGpio_Initialize(&axi_Gpio,AXI_GPIO_ID);//對(duì)PL端的gpio進(jìn)行初始化XGpio_SetDataDirection(&axi_Gpio,AXI_GPIO_CHANNEL,0x0000001);//對(duì)AXI設(shè)置方向設(shè)置為輸入對(duì)于這里的AXI_GPIO中斷的標(biāo)號(hào)就是我們前面提到的61,在這里我們可以進(jìn)行define一下,方便我們進(jìn)行引用。#define AXI_GPIO_INTR_ID XPAR_FABRIC_GPIO_0_VEC_ID//axi gpio的中斷號(hào)在SDK中尋一下這個(gè)參數(shù)的數(shù)據(jù)也可以驗(yàn)證我們的標(biāo)號(hào)數(shù)值:

a19152b4-06f8-11ed-ba43-dac502259ad0.png

對(duì)于axi _gpio,我們配置的時(shí)候可以看到,每個(gè)IP核有兩路GPIO,這里我們只用了通道1,所以我們的通道編號(hào)定義為1 #define AXI_GPIO_CHANNEL 1//axi gpio通道1在配置axi gpio的中斷功能時(shí),用的了XScuGic_SetPriorityTriggerType(&gpio_gic,AXI_GPIO_INTR_ID,0xA0, 0x3);在尋到該函數(shù)定義時(shí)候,可以簡要了解下參數(shù)的配置功能。

a19dd516-06f8-11ed-ba43-dac502259ad0.png

0xa0配置了中斷優(yōu)先級(jí),這里我們不進(jìn)行中斷優(yōu)先級(jí)的配置,所以引用的是示例里面的默認(rèn)值,中斷編號(hào)就是我們AXI GPIO的編號(hào),0x03這個(gè)值用于配置中斷的方式。這里我們的中斷有高電平觸發(fā)和邊沿觸發(fā)模式。我們?cè)O(shè)置邊沿觸發(fā)后,在我們按下按鍵會(huì)滿足兩次邊沿觸發(fā)的條件(這里我感覺注釋和實(shí)際操作不相符),然后回看我們的編程指南,在中斷配置時(shí)候是也是要求我們:當(dāng)接收到中斷時(shí),讀取GPIOx_DATA寄存器中相應(yīng)的位。通過寫入值為1的對(duì)應(yīng)位來清除IP中斷狀態(tài)寄存器中的狀態(tài)。所以我們就引用了XGpio_DiscreteRead(&axi_Gpio, AXI_GPIO_CHANNEL) 對(duì)中斷的狀態(tài)進(jìn)行讀取。對(duì)應(yīng)編程指南代碼編寫如下:

//清除中斷狀態(tài)
    if(XGpio_DiscreteRead(&axi_Gpio, AXI_GPIO_CHANNEL)==1){
   led_status=~led_status;
    }
    XGpio_InterruptClear(&axi_Gpio, 0x0000001);

完成代碼編寫后下載到我們的PYNQ的開發(fā)板即可完成本次實(shí)驗(yàn)。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52098
  • Zynq
    +關(guān)注

    關(guān)注

    10

    文章

    609

    瀏覽量

    47181
  • AXI
    AXI
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    16631

原文標(biāo)題:軟件部分編寫

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ARM+FPGA開發(fā):基于AXI總線的GPIO IP創(chuàng)建

    FPGA+ARM是ZYNQ的特點(diǎn),那么PL部分怎么和ARM通信呢,依靠的就是AXI總線。這個(gè)實(shí)驗(yàn)是創(chuàng)建一個(gè)基于AXI總線的GPIO IP,利用PL的資源來擴(kuò)充GPIO資源。通過這個(gè)實(shí)驗(yàn)
    的頭像 發(fā)表于 12-25 14:07 ?5694次閱讀
    ARM+FPGA開發(fā):基于<b class='flag-5'>AXI</b>總線的<b class='flag-5'>GPIO</b> IP創(chuàng)建

    Xilinx ZYNQ開發(fā)GPIO的三種方式:MIO、EMIO、AXI_GPIO

    前言: ZYNQ 7000有三種GPIO:MIO,EMIO,AXI_GPIO MIO是固定管腳的,屬于PS,使用時(shí)不消耗PL資源;EMIO通過PL擴(kuò)展,使用時(shí)需要分配管腳,使用時(shí)消耗PL管腳資源
    的頭像 發(fā)表于 12-26 10:12 ?3939次閱讀
    Xilinx ZYNQ開發(fā)<b class='flag-5'>GPIO</b>的三種方式:MIO、EMIO、<b class='flag-5'>AXI_GPIO</b>

    GPIO2接口上添加三態(tài)GPIO端口時(shí)會(huì)導(dǎo)致錯(cuò)誤

    AXI_GPIO中存在一個(gè)小錯(cuò)誤,可以防止使用電路板文件。在Vivado / 2016.2 / data / ip / xilinx / axi_gpio_v2_0 / xgui
    發(fā)表于 04-19 10:32

    MIO/EMIO/AXI_GPIO接口詳解

    ZYNQ-7000系列MIO/EMIO/AXI_GPIO接口
    發(fā)表于 02-02 07:30

    PWM使用指南

    日期作者版本說明2020.09.26TaoV0.0撰寫中目錄簡要介紹常用配置設(shè)置更新中斷輸出PWM脈沖捕獲輸出帶死區(qū)控制的互補(bǔ)PWM使用指南簡要介紹常用配置設(shè)置更新中斷輸出PWM脈沖捕獲輸出帶死區(qū)控制的互補(bǔ)PWM使用指南...
    發(fā)表于 08-09 08:54

    HPM6700/6400系列微控制器GPIO模塊使用指南

    HPM6700_6400_GPIO使用指南
    發(fā)表于 06-02 06:30

    學(xué)習(xí)架構(gòu)-AMBA AXI簡介

    指南介紹了高級(jí)微控制器總線體系結(jié)構(gòu)(AMBA)AXI的主要功能。 該指南解釋了幫助您實(shí)現(xiàn)AXI協(xié)議的關(guān)鍵概念和細(xì)節(jié)。 在本指南中,我們介紹
    發(fā)表于 08-09 07:37

    AT32F421 GPIO使用指南

    AT32F421 GPIO 使用指南AT32F421系列的GPIO還提供了豐富I/O復(fù)用功能,能夠使得多個(gè)外設(shè)可以同時(shí)工作,并且保證每個(gè)引腳在某一時(shí)刻只會(huì)連接到一個(gè)外設(shè),從而避免了外設(shè)沖突的產(chǎn)生。
    發(fā)表于 10-24 07:53

    AT32F413/415 GPIO使用指南

    AT32F413/415 GPIO使用指南介紹AT32F413/415 的GPIO 功能及固件驅(qū)動(dòng)程序API 的配置和使用,并對(duì)BSP 例程的軟件設(shè)計(jì)加以說明,同時(shí)演示使用方法并展示實(shí)驗(yàn)效果,供用戶參考。
    發(fā)表于 10-25 08:24

    ZYNQ 的三種GPIO :MIO、EMIO、AXI

    GPIO的博客說的有一些不一樣呢。 我們先看有哪三種GPIO:MIO、EMIO、AXI_GPIO。其中MIO和EMIO是直接掛在PS上的GPIO。而
    發(fā)表于 02-08 10:23 ?3325次閱讀
    ZYNQ 的三種<b class='flag-5'>GPIO</b> :MIO、EMIO、<b class='flag-5'>AXI</b>

    FreeRTOS 使用指南

    FreeRTOS 使用指南
    發(fā)表于 10-24 13:37 ?25次下載
    FreeRTOS <b class='flag-5'>使用指南</b>

    被zynq的GPIO唬住,告訴你zynq的3種GPIO

    我們先看有哪三種GPIO:MIO、EMIO、AXI_GPIO。其中MIO和EMIO是直接掛在PS上的GPIO。而AXI_GPIO是通過AXI
    發(fā)表于 07-07 08:23 ?5227次閱讀

    電子票使用指南免費(fèi)下載

    電子票使用指南電子票使用指南電子票使用指南電子票使用指南電子票使用指南電子票使用指南
    發(fā)表于 11-24 14:02 ?3次下載

    ZYNQ-7000系列MIO、EMIO、AXI_GPIO接口

    ZYNQ-7000系列MIO/EMIO/AXI_GPIO接口
    發(fā)表于 07-25 17:41 ?2770次閱讀
    ZYNQ-7000系列MIO、EMIO、<b class='flag-5'>AXI_GPIO</b>接口

    ZYNQ-7000系列MIO/EMIO/AXI_GPIO接口

    ZYNQ-7000系列MIO/EMIO/AXI_GPIO接口
    發(fā)表于 01-31 06:50 ?12次下載
    ZYNQ-7000系列MIO/EMIO/<b class='flag-5'>AXI_GPIO</b>接口