Zynq mio总结

ZYNQ的IO:
Zynq的IO包括对外连接的GPIO和内部PS与PL通信的AXIO。其中对外的GPIO又分为两种:MIO和EMIO。MIO直连到PSEMIO则是PS扩展到PL,从PL接出的IO。所以MIO不需要管脚约束,而EMIO需要管脚约束。

1.MIO寄存器:
在这里插入图片描述

上图为MIO内部构造,对MIO操作即是对以下寄存器进行配置:
DATA_RO: 此寄存器使软件能观察 PIN 脚情况,当 GPIO 被配置成输出的时候,这个寄存器的值会反应输出的 PIN 脚情况。

DATA:此寄存器控制输出到GPIO 的值,读这个寄存器的值可以读到最后一次写入该寄存器的值。

MASK_DATA_LSW:位操作寄存器,写入 GPIO 低 16bit 其他没有改变的位置保存原先的状态

MASK_DATA_MSW:位操作寄存器,写入 GPIO 高 16bit 其他没有改变的位置保存原先的状态(按笔者的理解应该是偏移量操作,通过bank的基地址+偏移量操作,寻找到相应的MIO,最后向DATA寄存器赋值,程序编写中暂时也用不上,可以先不管)。

DIRM:方向控制,此寄存器控制输入输出的开关,当 DIRM[x]==0 时候,禁止输出。

OEN: 输出使能,当 OEN[x]==0 的时候输出关闭,PIN 脚处于三态,因此,如果要读 IO 状态就得读 DATA_RO 的值,如果是对某一位进行操作就是写MASK_DATA_LSW/MASK_DATA_MSW。

2.EMIO寄存器:
与 MIO 大部分类似但是需要注意以下几点:
EMIO 在 PL 部分,输入与 OEN 寄存器无关,当 DIRM 设置为 0 的时候设置为输入,可以读 DATA_RO寄存器获取数据。

输出不能设置成三态,当 DIRM 设置为 1 的时候为输出,写入 DATA 寄存器或者MASK_DATA_LSW/MASK_DATA_MSW寄存器。

EMIOGPIOTN[x]=DIRM[x] & OEN[x],实现输出的控制。

3.硬件搭建:
基于vivado搭建下图所示IP。
在这里插入图片描述

此次通过PS控制zturn 7z020的开发板上的两个用户灯的亮灭,因此只需用到DDR和MIO,所以只需要配置好DDR以及相应的MIO(MIO0和MIO9使能)。

### ZynqMIO 和 GPIO 的配置与用法 Zynq-7000 All Programmable SoC 提供了多种外设接口,其中 **MIO (Multiplexed I/O)** 和 **GPIO (General Purpose Input/Output)** 是两个重要的功能模块。以下是关于它们的详细介绍: #### 1. MIO 配置 MIO 是一种多路复用 IO 资源,在 Zynq-7000 AP SoC 中用于连接 PS(Processing System)中的固定功能外设到外部硬件。这些外设包括 UART、I2C、SPI、CAN 等。 - MIO 引脚的数量有限,通常为 54 个[^1]。 - 每个 MIO 引脚可以被分配给不同的外设功能,具体取决于设计需求。 - 在 Vivado 或 SDK 工具中完成硬件配置时,可以通过 Xilinx Tools 设置每个 MIO 引脚的功能映射[^3]。 #### 2. GPIO 使用 除了固定的外设功能之外,PS 还提供了通用 GPIO 功能,允许用户通过软件控制额外的引脚。 - GPIO 可分为两组:`EMIO (Extended MIO)` 和 `Dedicated GPIO`。 - EMIO 是通过 PL(Programmable Logic)实现的扩展 GPIO,数量不受限于固定的 MIO 数量。 - Dedicated GPIO 则直接由 PS 控制,无需经过 PL 层级。 #### 3. 配置方法 在实际应用中,MIO 和 GPIO 的配置主要依赖以下工具和流程: - **Vivado**: 完成初始硬件设置,定义哪些引脚作为 MIO 或 GPIO 使用。 - **SDK**: 编写驱动程序来初始化并操作选定的 GPIO 或 MIO 外设。 对于 GPIO 初始化,可以在 U-Boot 或 Linux 内核启动过程中完成基本配置[^2]。例如,启用某个 GPIO 输出高电平的操作如下所示: ```c #include <stdio.h> #include "xgpio.h" int main() { int Status; XGpio Gpio; /* Initialize the GPIO driver */ Status = XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID); if (Status != XST_SUCCESS) { printf("Failed to initialize GPIO\r\n"); return XST_FAILURE; } /* Set direction as output */ XGpio_SetDataDirection(&Gpio, CHANNEL, 0); /* Output high level on selected pin */ XGpio_DiscreteWrite(&Gpio, CHANNEL, BIT_MASK); return XST_SUCCESS; } ``` 上述代码片段展示了如何利用 Xilinx 提供的库函数对 GPIO 进行方向设定以及数据输出操作。 #### 4. 注意事项 当涉及 USB 控制器或其他复杂外设时需要注意特定约束条件。例如,如果使用 ChipIDEA IP 实现 USB 设备模式,则需特别关注信号时序匹配问题,因为某些 PHY 器件可能不完全兼容目标平台的要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值