ZYNQ-AXI GPIO使用(一)

简介: ZYNQ-AXI GPIO使用

学习内容


前面简单学习了关于GPIO的操作,本次将使用PL 端调用 AXI GPIO IP 核, 并通过 AXI4-Lite 接口实现 PS 与 PL 中 AXI GPIO 模块的通信。

开发环境


vivado 18.3

SDK

PYNQ-Z2

AXI_GPIO简介


AXI GPIO IP 核为 AXI 接口提供了一个通用的输入/输出接口。 与 PS 端的 GPIO 不同, AXI GPIO 是一个软核( Soft IP),即 ZYNQ 芯片在出厂时并不存在这样的一个硬件电路, 而是由用户通过配置 PL 端的逻辑资源来实现的一个功能模块。 而 PS 端的 GPIO 是一个硬核( Hard IP) ,它是一个生产时在硅片中实现的功能电路。

我们之前驱动的MIO接口,他属于PS端口的一个搭载好的硬件资源,而对于AXI_GPIO这样一个IP核来说他就相当于与在PL的逻辑端口实现了一个软核IP的GPIO接口。AXI 接口作为 ZYNQ PS 和 PL 之间的桥梁, 能够使两者协同工作,进而形成一个完整的、 高度集成的系统。

AXI GPIO 可以配置成单通道或者双通道, 每个通道的位宽可以单独设置。 另外通过打开或者关闭三态缓冲器, AXI GPIO 的端口还可以被动态地配置成输入或者输出接口。其顶层模块的框图如下所示:

image.png

模块的左侧实现了一个 32 位的 AXI4-Lite 从接口, 用于主机访问 AXI GPIO 内

部各通道的寄存器。 当右侧接口输入的信号发生变化时,模块还能向主机产生中断信号。不过只有在配置 IP核时选择“ 使能中断” , 才会启用模块的中断控制功能。

我们可以在xilinx的一个说明书(UG144)中详细的看到关于AXI_GPIO IP的具体的寄存器,对于不同功能的配置我们只需要像在ARM开发中进行寄存器的配置即可,但寄存器的操作过于繁琐,在一般的开发过程中我们通常进行的都是库函数的使用调用。

在文档中我们可以看到IP的以下特点,基本包含了硬件GPIO的所有功能。设置输入输出模式,设置中断等。

image.png

引脚说明表如下,在这个表中,大致分为了两类,第一类s_axi接口的相关引脚,用于配置挂载到AXI总线,s_axi_*这是一组信号接口,用于进行数据的交互和配置;第二类是和GPIO有关的信号接口,这里的IP中有两组gpio,每组输出三个信号经过一个三态缓存器实现三态输出。为了实现中断功能,这里的ip2intc_irpt是中断的敏感信号。

image.png

编程指南


同样在UG144中我们可以找到对于AXI_GPIO IP在应用开发的时候的一个编程指南

设置带中断的INPUT


将端口配置为输入,将相应的位写入GPIOx_TRI寄存器,值为1。

通过设置IP中断使能中相应的位使能通道中断注册;也可以通过设置全局中断的第31位来启用全局中断注册为1。

当接收到中断时,读取GPIOx_DATA寄存器中相应的位。通过写入值为1的对应位来清除IP中断状态寄存器中的状态。

这里的编程指南描述的是寄存器的配置流程,在我们的实际应用中简单来说就是调用库函数配置端口为输入,然后进行中断功能的注册(类似前文的GPIO的按键中断)。

配置为普通的INPUT


  1. 将端口配置为输入,将相应的位写入GPIOx_TRI寄存器,值为1。
  2. 读取GPIOx_DATA寄存器中相应的位。

配置为普通的OUTPUT


  1. 通过在GPIOx_TRI寄存器中写入值为0的对应位,将端口配置为输出。
  2. 将相应的位写入GPIOx_DATA寄存器。

工程系统框图


实现功能为使用EMIO的引脚驱动LED,使用AXI_GPIO的IP进行按键控制,当我们按键按下时,我们的LED进行一次反转。

image.png

硬件平台搭建


同样重复前面的步骤,打开vivado工具的block design 添加ZYNQ的IP核,完成基础配置。

image.png

然后打开MIO configuration,对EMIO引脚的LED进行配置

image.png

因为这里我们要使用AXI_GPIO的中断功能,所以我们打开中断界面进行配置,开启中断后,勾选PL到PS的中断功能。这里的中断标号有16个,对应原则是[15:0]对应的是[91:84]:[68:61],这里我们只使用了一个中断,所以我们的中断标号是61。

image.png

配置完成后添加AXI_GPIO的IP核。配置使能中断,GPIO的位宽选择为1即可。

image.png

完成配置后得到下图点击运行自动连接,可以进行帮助我们进行对应端口的自动连接:

image.png

自动连接完成后如图所示:

image.png

这里工具帮助我们完成了大部分的连接,但是没有帮助我们进行中断功能的连线,我们需要手动进行连接。

image.png

手动连接完成:

image.png

完成设计后,我们进行generate output product 然后生成HDL封装。接着就对应引脚进行引脚约束即可(PYNQ的粉色开发板可以直接引用这个约束):

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]

完成约束后进行综合布局布线,等待生成bit流文件。bit文件生成后在FILE处,点击导出硬件资源(包含bit流文件),接着launch SDK。

目录
相关文章
|
4月前
|
编解码 数据格式
IMX6ULL开发板spi OLED驱动
【8月更文挑战第24天】本文档介绍在IMX6ULL开发板上实现SPI接口OLED显示器驱动的步骤。首先需正确连接OLED至开发板的SPI接口,包括时钟(SCLK)、数据(MOSI)及片选(CS)等线路。理解SPI协议与OLED规格也很关键:SPI为同步串行通信,涉及主从设备交互;OLED参数如分辨率、颜色深度等须明确。接下来配置IMX6ULL的SPI控制器,通过设备树设定时钟频率、数据宽度等参数,并加载内核驱动。最后编写驱动程序,初始化SPI设备、发送控制命令与数据以完成OLED初始化,并实现文本或图像的显示功能。
|
7月前
|
传感器 存储 缓存
STM32--MPU6050与I2C外设
STM32--MPU6050与I2C外设
189 1
|
7月前
|
网络性能优化
4-1 51单片机GPIO介绍
4-1 51单片机GPIO介绍
128 0
|
7月前
|
Linux API 开发者
设备树知识小全(九):GPIO、时钟、pinmux连接
设备树知识小全(九):GPIO、时钟、pinmux连接
357 0
|
传感器 数据格式
STM32外设系列—DHT11
本文详细介绍了什么是DHT11,介绍了DHT11使用的单总线通信,并详细分析了与DHT11进行数据交互时的时序图。此外,给出了DHT11初始化,接收温湿度信息并校验的程序设计。
346 0
STM32外设系列—DHT11
|
存储 安全
深入理解AMBA总线(四)AHB-lite总线
深入理解AMBA总线(四)AHB-lite总线
1235 0
|
异构计算 SoC 内存技术
深入理解AMBA总线(九)AHB2SRAM设计
深入理解AMBA总线(九)AHB2SRAM设计
836 0
|
存储 安全 定位技术
串口,IIC,SPI,USB等总线叙述
串口,IIC,SPI,USB等总线叙述
216 0
|
芯片 SoC 内存技术
AMBA总线协议AHB
AMBA总线协议AHB、APB
156 0
|
存储 芯片
【STM32】Cortex_M4 GPIO口概述知识总结
GPIO口:简单而言,就是芯片用来控制或者采集外部器件的相关信息,这个又可以称之为输入输出的端口。
【STM32】Cortex_M4 GPIO口概述知识总结