Versal 上的级联模式示例

作者:Abhinay Sudha P,AMD工程师;文章来源:AMD开发者社区

本篇博文主要讲解在 PL 中将来自 IP 核的超 32 次中断布线到 PS 的情况下,该如何使用 AXI Interrupt Controller (INTC) 中的级联模式。

在 Vivado 设计中使用了 AMD AXI GPIO 中断。

设计示例是以 VCK190 评估板为目标而创建的,使用的是 Vivado 2020.2 版本。中断在 PetaLinux 2020.2 上经过了测试。

AXI GPIO:

General Purpose Input/output (GPIO) 核是提供输入输出访问的接口,支持访问对接的器件。该核还可用于控制外部器件的行为。

中断:

在 AXI GPIO 中必须先为对应的 GPIO 通道启用中断,这样即可从该通道读取中断状态。使用 AXI GPIO 自定义中的“Enable Interrupt”(启用中断)选项来启用中断。


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

° gpio_input(0) = GPIO_SW15
° gpio_input(1) = GPIO_SW16

AXI INTC:

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


此示例的主要目的是将超过 16 个中断连接到 PS。AXI INTC 核可满足此需求。使用单一 AXI INTC 块的情况下最多可连接 32 个中断,并且还可使用级联。

在级联模式下,有不少于两个 AXI INTC 实例连接到同一个处理器。参数 C_EN_CASCADE_MODE 表示的“Enable Cascade Interrupt Mode”(启用级联中断模式)和参数 C_CASCADE_MASTER 表示的“Cascade Mode Master”(级联模式主接口)都需要在此模式下定义。

注释:要从 AXI INTC 辅实例建立级联,必须使用 AXI INTC 主实例的 irq_in 端口或第 31 个中断位。

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

块设计:

下文解释了设计中使用的 IP 及其连接。

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

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

在上图中,将“Number of Ports”(端口数)参数设置为期望的输入端口数。在此示例中,所选端口数量为 32。

完成 IP 自定义后的结果如下:


如前所述,输出端口 AXI_INTC_0 连接到下一个 AXI_INTC_1 irq_in 中断行。

AXI_INTC_1 的输出连接到 Versal CIPS 块的 pl_ps_irq0 端口:

请验证设计并遵循其余步骤进行操作以生成比特流。

导出硬件,用于构建 PetaLinux 镜像。

PetaLinux:

内核配置:

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

  • Device Drivers(器件驱动程序)
  • 。GPIO Support(GPIO 支持)
    Memory Mapped GPIO Drivers(存储器映射 GPIO 驱动程序)
    . Xilinx GPIO support(赛灵思 GPIO 支持)
    . Xilinx Zynq GPIO support(赛灵思 Zynq GPIO 支持)
    。Input device support(输入器件支持)
    Keyboards(键盘)
    . GPIO Buttons(GPIO 按钮)
    . Polled GPIO buttons(轮询 GPIO 按钮)

    向设备树添加按钮:

    按钮仅可用于 Input GPIO 应用。

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

    完成此操作后,请启动 Linux。

    您可在 cat /proc/interrupts 中看到按钮 SW15 和 SW16 的标签。