xilinx ZYNQ 7000 AXI GPIO

文章介绍了AXIGPIO在FPGA与处理器系统PS之间的通讯作用,它是基于AXI协议的GPIO接口。AXIGPIO允许PL(FPGA)和PS进行数据传输,包括GPIO的读写操作和中断功能。Xilinx提供了AXIGPIOIP核,简化了用户在设计中集成GPIO外设的过程。配置涉及AXI接口、中断设置和引脚分配,最终通过编程实现功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.0AXI GPIO
在这里插入图片描述
第一部分
PS 和 PL之间的通讯有一个接口称为AXI。AXI总线具体的内容这边不去深究,可以理解为一种特殊协议的通讯方式。
AXI GPIO是什么意思?
PL是FPGA它可以做成任何你想要的东西,做一个GPIO外设当然是可以的。
那么
如上图所示,假设我们用FPGA 设计了一个GPIO外设,它可以通过引脚进行电平的输入和输出。
这个时候PS端的APU需要使用GPIO,通常就是GPIO的读写操作。这个事件这个需要数据通信,上图所示有个connect的模块横跨PS,PL,用于数据的传输,没错AXI就是这个connect。这里我们把AXI单纯的看做一个有特殊协议的通信线路,暂时不去关系实现方式。

第二部分
什么是GPIO,这个问题好像非常简单,但是好像也不简单。为了寻求这个答案,可以看一下MCU的GPIO结构
打开STM32F407(Cortex M4)手册的GPIO章节
在这里插入图片描述
上图所示,最右边是最后芯片引出的物理引脚。最左边是GPIO模块对外的接口。提供读写操作。
那么我们如果要做一个GPIO外设就需要物理引脚和读写接口。
那么物理引脚可以想到FPGA开发中的引脚分配。这里会问不是有EMIO了吗为啥还要AXI GPIO
1.EMIO本质上是硬核
2.AXI GPIO是真正的软核FPGA开发

那么读写接口就是第一部分所说的AXI接口。
那么GPIO具体什么实现呢,xilinx 官方把GPIO如何实现已经做好了,封装成AXI GPIO IP。我们直接调用即可。
Create Block design->添加IP ->AXI GPIO
在这里插入图片描述
在AXI IP官方手册中
在这里插入图片描述
AXI GPIO de 构成如上图所示,
1.AXI Interface 用于AXI中线的通讯
2.interrupt Module 检测GPIO模块的Read信号,判断是否发生中断,送入专用的信号线IP2INTC.
3.GPIO Core 就是GPIO 外设了

GPIO 具体的结构
在这里插入图片描述
1.GPIO 三态门的控制TRI
2.Write
3.read
还可以通过多路选择器构建两个GPIO外设。

第三部分
知道AXI GPIO是什么东西后,那么要怎么去配置

在这里插入图片描述
可以配置默认的输出电平和门控状态(输入还是输出)。
添加zynq PS 后,点击自动连接,vivado自己生成了axi interconnect和PS reset

在这里插入图片描述
PS的FCLK_CLK0 ,给AXI Interconnect 和AXI GPIO提供了时钟。peripheral aReastn提供了复位信号。
PS的M_AXI_GP0 和AXI Interconnect连接,PS也提供AXI时钟。
在这里插入图片描述
FCLK_CLK0 是PS端提供给PL端的时钟信号,供给了所有AXI 相关的所有IP。
FCLK_RESET0_N 这个信号给到processor System Reast IP ,然后通过peripheral aReastn 对AXI 互联和AXI GPIO提供复位信号。
在这里插入图片描述
在这里插入图片描述

AXI Interconnect 是一个AXI总线的连接矩阵,有点像路由器的意思
在这里插入图片描述

在这里插入图片描述
这样通过xilinx AXI GPIO IP核构建了一个 AXI 接口的GPIO模块。
在这里插入图片描述
clock Configuration 设置时钟,提供给AXI和AXI GPIO
打开AXI GPIO的中断,它的中断信号属于PL中断信号,相关设置在GIC中。
如下图所示,双击GIC

在这里插入图片描述
在这里插入图片描述
打开PL -PS的中断信号,其中断号是84~91。
最后进行引脚分配
.在这里插入图片描述
配置AXI GPIO的端口,生成比特流。

第四部分
AXI GPIO编程,导入官方例程。见下章
在这里插入图片描述

### Zynq FPGA AXI GPIO读取操作 对于Zynq FPGA上的AXI GPIO模块,其设计允许PS(处理系统)通过AXI总线访问PL(可编程逻辑)中的GPIO资源。为了实现AXI GPIO的读取功能,需遵循特定流程来配置和交互。 #### 配置AXI GPIO IP核 在Block Design中添加AXI GPIO IP核时,应根据实际需求调整参数设置。当仅用于输出目的如控制LED时,只需关注单个通道;而要执行读写操作,则建议启用双通道模式[^2]: ```plaintext 1. 打开现有项目或新建一个Vivado工程; 2. 进入Block Design界面; 3. 添加AXI GPIO IP核; 4. 双击新加入的`axi_gpio_0`组件进入属性编辑器; 5. 设置`GPIO Width`为所需宽度,例如8位支持更多外设连接; 6. 启用Dual Channel选项以获得两个独立的数据流路径。 ``` #### 初始化与驱动程序编写 针对C/C++环境下的嵌入式Linux应用开发而言,可通过Xilinx提供的库函数简化硬件寄存器层面的操作复杂度。下面给出一段简单的代码片段展示如何初始化以及从AXI GPIO获取状态信息[^3]: ```c #include "xparameters.h" #include "xgpiops.h" // 定义使用的设备实例句柄变量 static XGpioPs Gpio; int main() { int Status; // 实例化并查找指定ID对应的GPIO PS对象 Status = XGpioPs_CfgInitialize(&Gpio, XPAR_XGPIOPS_0_DEVICE_ID, XPAR_XGPIOPS_0_BASEADDR); if (Status != XST_SUCCESS){ return XST_FAILURE; } // 将Channel 1配置为输入方向 XGpioPs_SetDirectionPin(&Gpio, 1, 0); while(1){ u32 ReadValue; // 从Channel 1读取当前电平值 ReadValue = XGpioPs_ReadPin(&Gpio, 1); printf("Current Pin Value:%d\n",ReadValue); usleep(1000 * 1000); // 延迟一秒再重复查询 } } ``` 此段代码展示了基本框架下对AXI GPIO进行周期性的轮询读取过程,并打印出每次读得的结果。值得注意的是,在真实应用场景里可能还需要考虑同步机制、异常处理等问题。 #### 中断响应机制 考虑到某些情况下希望及时捕捉外部事件的发生而非单纯依赖定时扫描方式,可以利用AXI GPIO自带的支持特性——即一旦监测到目标引脚发生改变就会向处理器发送通知信号。不过需要注意的是,不同于常规意义上的边沿敏感型中断源,这里采用的是基于水平变化触发的工作原理[^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值