如何使用 AXI Interrupt Controller完成含超16次中断的布线

描述

 

本文主要讲解在 PL 中从 IP 核到 PS 之间需要完成含超 16 次中断的布线的情况下,该如何使用 AXI Interrupt Controller (INTC)。其中使用的AMD Xilinx外设包括 Vivado 设计中的 GPIO、IIC、UART 以及定时器。 
设计示例是使用 Vivado 2020.1 版本,以 ZCU106 评估板为目标而创建的。中断在 PetaLinux 2020.1 上经过测试,此处随附了设计 Tcl 和 system-user.dtsi 文件。

AXI GPIO:
General Purpose Input/output (GPIO) 核是支持轻松访问器件内部属性的接口。该核还可用于控制外部器件的行为。


中断:
中断控制可从 GPIO 通道获取中断状态,并向主机生成中断。在 Vivado 中设置“Enable Interrupt”(启用中断)选项后,即可启用中断控制。

定时器

对于输入模式,gpio_input 管脚连接到 ZCU106 的如下按钮 (PUSH BUTTON):

gpio_input(0) = GPIO_SW15

gpio_input(1) = GPIO_SW14

gpio_input(2) = GPIO_SW16

gpio_input(3) = GPIO_SW17

gpio_input(3) = GPIO_SW18

定时器

AXI INTC:
AXI Interrupt Controller (INTC) 核可将来自外设器件的多个中断输入集中到系统处理器的单一中断输出。使用寄存器来检查、启用和确认中断。

定时器

此示例的主要目的是将超过 16 个中断连接到 PS。AXI INTC 核可支持我们满足此需求。使用单一 AXI INTC 块的情况下最多可连接 32 个中断,并且您还可使用级联。(我们可能会通过另一篇博文来提供此操作示例。)

在下文描述 Concat IP 的多个图例中,您可以看到中断的连接方式。

块设计:
由于设计太大了,我并没有添加完整设计的示意图,因此下面会逐一展示必要的连接示意图。

Concat IP:
Concat IP 核可提供相应机制来将不同宽度的总线信号组合到单一总线内。

定时器

从 IP catalog(IP 目录)添加 Concat 块,然后双击 IP(如下所示)以打开“Re-customize IP”(重新自定义 IP)对话框。 

定时器

将“Number of Ports”(端口数)参数设置为期望的输入端口数。在此示例中,所选数量为 18。
完成自定义 IP 后,结果如下所示,第 18 个端口连接到如前文所述的 GPIO_PUSH_BUTTONS 中断行。

定时器

dout 为输出端口,其位宽等于所有输入端口的位宽总和,该输出端口布线到 AXI INTC 核的输入 intr 端口。

定时器定时器


AXI INTC 的输出连接到 Zynq MPSoC 块的 pl_ps_irq_0 端口:

定时器

请验证设计并遵循其余步骤进行操作以生成比特流。导出硬件,用于构建 PetaLinux 镜像。

PetaLinux:
内核配置:
在 menuconfig 中启用以下选项。默认情况下,这些选项均已启用,但您应核实其状态,以防万一。

定时器

向设备树添加按钮:

按钮仅可用于 Input GPIO 应用。
创建的每个子节点均可控制 GPIO 的单个位。在 dts 文件中的“gpio-keys”键节点下,根据设计,为按钮 (Push Buttons) 创建含如下名称的子节点:

定时器

完成此操作后,请启动 Linux。您可在 cat /proc/interrupts 中看到按钮 SW15 到 SW18 的标签。

定时器

随机按下按钮后,触发器计数会按如下所示方式增加:

定时器

  
      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分