ZYNQ_SDK EMIO

简介: ZYNQ_SDK EMIO

ZYNQ_SDK EMIO

PS 和外部设备之间的通信主要是通过复用的输入/输出(Multiplexed Input/Output,MIO)实现的。除此之外,PS 还可以通过扩展的 MIO(Extended MIO,EMIO)来实现与外部设备的连接。

EMIO 使用了 PL 的I/O 资源,可以用来扩展PS引脚,也可以用来连接PL中实现的IP模块。

简介

ZYNQ GPIO 接口信号被分成四组,分别是从 BANK0 到 BANK3。

  • 其中 BANK0 和 BANK1 中共计 54个信号通过 MIO 连接到 ZYNQ 器件的引脚上,这些引脚属于 PS 端
  • BANK2 和 BANK3 中共计 64 个信号则通过 EMIO 连接到了 ZYNQ 器件的 PL 端

PS 端经由 EMIO 引出的接口会直接连接到 PL 端的器件引脚上,通过 IO 管脚约束来指定所连接 PL 引脚的位置。( MIO 不需要手动指定引脚约束 )

通过这种方式,EMIO 可以为 PS 端实现额外的 64 个输入引脚64 个带有输出使能的输出引脚

输入引脚 和 带输出使能的输出引脚

EMIO 还有一种使用方式,就是用于连接 PL 内实现的功能模块(IP 核),此时 PL 端的 IP 作为 PS 端的一个外部设备

硬件设计

框图

因为 EMIO 使用了 PL 端的 IO 资源,所以增加了 PL 部分PL 端与按键 KEY和LED相连的引脚直接通过 EMIO 连接到 PS 端。

步骤
step1: 配置EMIO

MIO Configuration -> GPIO -> 勾选EMIO GPIO -> 位宽 2

将 EMIO 扩展一个 2 位的 GPIO 接口信号,此信号将用于连接 PL 端的引脚

在 Diagram 窗口中可以看到 ZYNQ7 Processing System多了一个 GPIO_0 端口

点击选中该端口,然后点击鼠标右键,在弹出的列表中选择"Make External"( 引出 ),可以看到ZYNQ7 Processing System 引出了一个名为GPIO_0_0的接口

点击选中该接口,在左侧 External Interface Properties一栏中将该接口的名称修改

step2: 生成顶层HDL

在 Sources 窗口中展开 Design Sources,然后右键点击 sysetm_wrapper 下的 system.bd,在弹出的菜

单中选择 Generate Output Products

step3: 创建顶层HDL Wrapper

step4: 生成Bitstream文件导出到SDK

Flow Navigator 导航栏中找到 RTL ANALYSIS,点击该选项中的"Open Elaborated Design"

I/O Planning:在 I/O Ports 窗口中对 PL 部分的接口进行管脚分配

如果是MIO的输入/输出接口不需要手动进行管脚分配,选择"Generate Output Products"之后,Vivado 工具会自动创建 PS 端的管

脚约束文件。

自行扩展的GPIO的接口信号,需要手动将其分配引脚,要与原理图对应。

按键SW :

LED:

引脚绑定:

step5: 导出硬件

File -> Export -> Export Hardware

在弹出的对话框中,勾选“Include bitstream”

如果设计使用了 PL 的资源,比如使用了 PL 的引脚,或者在 PL 内实现了部分功能模块,那么就需要生成 Bitstream 文件,并在导出硬件的时候包含该文件。

资源消耗

在 IMPLEMENTED DESIGN 界面可以查看设计对 PL 资源的使用情况。

在左侧 Flow Navigator 导航栏中找到 IMPLEMENTATION,点击该选项中的"Report Utilization"

软件设计

导出的为硬件设计文件

步骤
step1: 在SDK中创建应用工程

File > New > Application Project,新建一个 SDK 应用工程

  • Project name : 指定项目名称
  • Hardware Platform 指定硬件设计文件
  • Board Support Package : BSP 板级支持包,可以指定名称
step2: 应用程序编写
/**
 * Create by wkk 2023.3.20
 * read sw state to control led
 */
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#define GPIOPS_ID XPAR_XGPIOPS_0_DEVICE_ID //PS 端 GPIO 器件 ID
#define EMIO_LED 54 //PL_LED 连接到 EMIO0
#define EMIO_KEY 55 //PL_KEY 连接到 EMIO1
int main()
{
  XGpioPs gpiops_inst; //PS 端 GPIO 驱动实例
  XGpioPs_Config *gpiops_cfg_ptr; //PS 端 GPIO 配置信息
  //根据器件 ID 查找配置信息
  gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);
  //初始化器件驱动
  XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
  //设置 LED 为输出
  XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_LED, 1);
  //使能 LED 输出
  XGpioPs_SetOutputEnablePin(&gpiops_inst, EMIO_LED, 1);
  //设置 KEY 为输入
  XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY, 0);
  //读取按键状态,用于控制 LED 亮灭
  while(1){ // 按键按下与抬起是不同的状态
    XGpioPs_WritePin(&gpiops_inst, EMIO_LED,~XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY));
  }
  return 0;
}

说明:

  1. 引脚编号
#define EMIO_LED 54 //PL_LED 连接到 EMIO0
#define EMIO_KEY 55 //PL_KEY 连接到 EMIO1
  1. 引脚编号可以在xgpiops.h头文件中查找, 0-53为MIO, 后面为EMIO,依次编号
  2. 下载说明
    使用了PL内的资源,在下载软件编译生成的elf文件之前,需要先下载硬件设计生成的bitstream文件,对PL部分进行配置。


也可以在Run Configuration 中配置,先进行系统复位,然后Program FPGA, 然后再Run as

点击Run 后,SDK软件首先会复位整个系统,清除FPGA逻辑,重新下载bitstream 和 elf 文件。

总结

通过 EMIO 扩展的 GPIO 接口的使用方法和 MIO 没有任何区别。

头文件说明:

  • xparameters.h 定义了 设备地址、参数等等信息
  • xgpiops.h 包含了 ps操作gpio相关的操作

基本操作流程:

  • 根据器件 ID 查找配置信息
XGpioPs_Config *gpiops_cfg_ptr; //PS 端 GPIO 配置信息
//根据器件 ID 查找配置信息
gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);
  • 初始化器件驱动
XGpioPs gpiops_inst; //PS 端 GPIO 驱动实例
//初始化器件驱动
XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
  • 设置输入输出模式
// 0 for Input Direction, 1 for Output Direction.
XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_LED, 1);
  • 读写操作
XGpioPs_WritePin(&gpiops_inst, EMIO_LED,0x01)
XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY));
相关文章
|
存储 缓存 测试技术
ZYNQ-AXI Interconnect IP介绍
ZYNQ-AXI Interconnect IP介绍
2809 0
ZYNQ-AXI Interconnect IP介绍
|
开发工具 芯片 Perl
ZYNQ_SDK MIO控制LED
ZYNQ_SDK MIO控制LED
|
网络协议 测试技术 开发工具
【ZYNQ】裸机 PS + PL 双网口实现之 LWIP 库文件修改
【ZYNQ】裸机 PS + PL 双网口实现之 LWIP 库文件修改
1444 0
【ZYNQ】IIC 简介及 EMIO 模拟 IIC 驱动示例
【ZYNQ】IIC 简介及 EMIO 模拟 IIC 驱动示例
571 0
|
Linux 开发工具 异构计算
【ZYNQ】QSPI Flash 固化程序全攻略
【ZYNQ】QSPI Flash 固化程序全攻略
3439 0
|
缓存 网络性能优化 SoC
ZYNQ-AXI_GP接口和AXI_HP接口的异同
ZYNQ-AXI_GP接口和AXI_HP接口的异同
1379 0
ZYNQ-AXI_GP接口和AXI_HP接口的异同
【ZYNQ】SPI 简介及 EMIO 模拟 SPI 驱动示例
【ZYNQ】SPI 简介及 EMIO 模拟 SPI 驱动示例
1520 0
|
存储 Linux API
ZYNQ裸板:串口篇
使用 PS 的时候,通常会添加 UART 控制器,用于打印信息和调试代码。除此之外, PS 在和外部设备通信时,也会经常使用串口进行通信。先从UART控制器开始讲起吧,从简单的测试再到工程实例。
1327 0
ZYNQ裸板:串口篇
|
Linux 内存技术 Perl
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
1815 0
|
缓存 开发工具 芯片
ZYNQ-AXI GPIO使用(一)
ZYNQ-AXI GPIO使用
1790 1
ZYNQ-AXI GPIO使用(一)