AXI Interrupt Controller (INTC)中断控制器IP核 - 一般使用模式

AXI Interrupt Controller (INTC)中断控制器IP核 - 一般使用模式

逻辑部分

LogiCORE IP AXI 中断控制器(INTC)核心接收来自外围设备的多个中断输入,并将它们合并为系统处理器的中断输出。用于存储中断向量地址检查、启用和确认中断的寄存器可以通过 AXI4-lite 接口访问。

特征

  • 通过 AXI4-Lite界面进行登记。
  • 快速中断模式。
  • 支持最多32次中断。可级联以提供额外的中断输入。
  • 总线或单中断输出。
  • 中断请求之间的优先级由向量位置决定。最低有效位(LSB,在本例中为位0)具有最高的优先级
  • 中断启用寄存器选择性地启用单个中断输入。
  • 主启用寄存器以启用中断请求输出。(可以选择所有的中断是否输出)
  • 每个输入都可以根据边缘或水平灵敏度进行配置。
  • 输出中断请求引脚可配置为边缘或水平生成。
  • 可配置的软件中断能力。
  • 支持嵌套中断。
  • 硬件和软件向后兼容。

方框图

在这里插入图片描述

  • 寄存器块: 此块包含控制寄存器和状态寄存器。它们通过 AXI4-lite 从接口访问。有关 AXI INTC核心寄存器的详细说明,请参阅寄存器空间。
  • 中断检测: 此块检测中断输入。它可以为每个中断输入配置电平检测或边缘检测。
  • 中断生成: 此块执行以下功能:
    • 从中断控制器核心生成最终输出中断。
    • 中断灵敏度由配置参数决定。
    • 检查控制寄存器(MER 和 IER)中是否存在中断生成的启用条件。
    • 确认后重置中断。
    • 在 IVR 寄存器中写入活动中断的向量地址,并为挂起的中断启用 IPR 寄存器。
1 边缘敏感型和电平敏感型

在这里插入图片描述

  • 边缘敏感性:当中断输入出现活动边缘且中断条件不存在时,记录一个新的中断条件。(活动边缘的极性,上升或下降,是每个输入选项。)无论是否启用中断,中断都会被记录下来,并被保留到确认为止。在此期间任何活动边缘都没有效果。
  • 级别敏感:当输入处于活动级别且中断条件不存在时,记录一个中断条件。(活动电平的极性,高或低,是每个输入的选项。)无论是否启用中断,中断都会被记录下来,即使在此期间输入电平变为非活动状态,中断也会被保留,直到被确认为止
  • 在边缘敏感中断的情况下,信号必须采样非活跃的一个时钟周期,然后活跃一个处理器时钟周期被检测。
  • 在电平敏感中断的情况下,信号必须采样至少活跃一个时钟周期才能被检测到。
2 快速中断模式
  • 通过在中断模式寄存器(IMR)中设置相应的位来启用快速中断模式。
  • 中断向量地址取自相应的 IVAR 或 IVEAR寄存器,并通过 interrupt_address 端口发送给处理器。这使得处理器可以直接跳转到中断处理上。
  • 在快速中断模式下配置的中断通过处理器驱动的 processor_ack 端口得到确认。生成的 IRQ 被基于processor_ack 信号进行清除,并在processor_ack接收到后更新相应的 IAR 位。
3 级联模式

当系统需要超过32个中断时,有必要扩展 AXI INTC 核心能力来处理更多的中断。这可以通过实例化一个或多个额外的内核,并相应地设置级联模式参数来实现。

4 软件中断

该核心还支持数量可配置的软件中断,这些软件中断主要用于多处理器系统中的处理器间中断。这些中断是由写入中断状态寄存器的软件触发的。

5 嵌套中断

核心通过实现一个中断级别寄存器为嵌套中断提供支持。这可以被软件用来防止在处理中断时发生低优先级中断,从而允许在中断处理期间启用中断以立即获得高优先级中断。软件必须保存和恢复中断级别寄存器和返回地址。
因为在使用快速中断模式时,处理器直接跳转到唯一的中断向量地址来服务特定的中断,所以用户本身必须保存和恢复中断级别寄存器和返回地址。在正常中断模式下,这由软件驱动程序处理。

寄存器空间

在这里插入图片描述

Interrupt Status Register (ISR)中断状态寄存器

在这里插入图片描述

  • 该寄存器中每一位可设置为一个中断状态,0为无中断,1为有中断
  • 可以通过软件生成中断,即寄存器中有效位数 = 硬件中断数 + 软件中断数
  • ISR 中的位与 IER 中的中断启用位无关。
  • 剩余位的数量的软件中断数由 Vivado Design Suite (参数 C_NUM_SW_INTR)的数量定义。
Interrupt Pending Register (IPR)中断挂起寄存器

在这里插入图片描述

  • 这是 AXI INTC 中的一个可选只读寄存器,可以在 Vivado Design Suite Customize IP 对话框中通过选中 Enable Interrupt Pending Register (参数C_HAS_IPR)来设置。
  • 读取这个寄存器的内容表明是否存在同样启用的活动中断。这个寄存器通过将 INTC 的读取次数减少一次来减少中断处理延迟。
  • 这个寄存器中的每个位是 ISR 和 IER 中位的逻辑 AND。如果中断输入少于数据总线的宽度,则读取不存在的中断将返回零。
Interrupt Enable Register (IER)中断启用寄存器

在这里插入图片描述

  • 这是一个读写寄存器。在这个寄存器中写入一个1到一个位将启用相应的 ISR 位,从而允许它影响 irq 输出。
  • 当中断被禁用时,中断事件会发生,但不会传递给处理器。禁用活动中断可以防止该中断影响 irq 输出,但是一旦重新启用该中断,该中断立即设置irq 输出。
  • 中断必须通过写入(Interrupt Acknowledge Register)中断确认寄存器来清除。
Interrupt Acknowledge Register (IAR)中断确认寄存器

在这里插入图片描述

  • IAR 是一个只写寄存器,用于清除与所选中断相关联的中断请求。在 IAR 中将1写入一个位将清除 ISR 中的相应位,并且还将清除 IAR 中的位本身。
  • 快速中断模式下,IAR 中的位将通过使用 Processing_ ack 端口的信息自动清除。在正常的中断模式下,通过 AXI 接口写入寄存器来清除 IAR 中的位。
  • 在 IAR 中将1写入位位置,清除由相应的中断输入生成的中断请求。通过在 IER 中对相应位写入一个0而使中断将保持激活状态,直到通过确认它而被清除。
Set Interrupt Enables (SIE)设置中断启用

在这里插入图片描述

  • SIE 用于在单个比特位设置 IER 位,而不是使用读-修改-写序列。在 SIE 中写入一个1到一个位置会在 IER 中设置相应的位。
  • SIE 在 AXI INTC 核心中是可选的,可以通过在 Vivado Design Suite Customize IP 对话框(参数 C_HAS_SIE)中选择 Enable Set Interrupt Enable Register 来启用。
Clear Interrupt Enables (CIE)清除中断启用

在这里插入图片描述

  • CIE 是用于在单个原子操作中清除 IER 位,而不是使用读-修改-写序列。在 CIE 中写入1到位位置将清除 IER 中的相应位。
  • CIE 在 AXI INTC 核心中是可选的,可以通过在 Vivado Design Suite Customize IP 对话框(参数 C_HAS_CIE)中选择 Enable Clear Interrupt Enable Register 来启用。
Interrupt Vector Register (IVR)中断向量登记册

在这里插入图片描述

  • IVR 是一个只读寄存器,包含最高优先级、启用和活动中断输入的序号值。 INT0(始终是LSB)是优先级最高的中断输入,左边的每个连续输入的中断优先级相应较低。 如果没有中断输入是活跃的,那么 IVR
  • 包含所有的中断输入。IVR 可作为正确中断向量地址的索引。
Master Enable Register (MER)主启用寄存器

在这里插入图片描述

  • 这是一个2位读写寄存器。最低有效位包含主启用(ME)位,下一位包含硬件中断启用(HIE)位。 将1写入 ME 位使 Irq输出信号成为可能。将0写入 ME 位禁用 Irq 输出,有效地屏蔽所有中断输入。
  • HIE 位是一个 write-once位。写入1也禁用对此位的任何进一步更改,直到发生重置。
  • 在重置时,HIE位被重置为0,允许软件写入 ISR以产生用于测试目的的硬件中断,并禁用任何硬件中断输入。写一个1到这个位使硬件中断输入和禁用软件生成的输入。但是,使用C_NUM_SW_INTR配置的任何软件中断依旧是可写的。
Interrupt Mode Register(IMR)中断模式寄存器

在这里插入图片描述

  • 此寄存器只有在 Vivado Design Suite (参数 C_HAS_IMR)中的 Customize IP对话框中选择“启用快速中断模式逻辑”时才存在。
  • IMR 寄存器用于设置连接的中断模式。通过在 IMR中设置相应的中断位置,可以单独配置所有中断。
  • 将0写入任意位,以正常中断模式处理相应的中断。将1写入任意位,以快速中断模式处理相应的中断。IMR寄存器中未使用的位位置返回零。
Interrupt Level Register (ILR)中断级别寄存器

在这里插入图片描述

  • 中断级别寄存器(ILR)是一个读写寄存器,它包含阻止生成处理器 IRQ 的最高优先级中断的序号值。ILR 提供了一种阻塞低优先级中断的方法,以支持嵌套中断处理。
  • 当 ILR 为0时,不允许中断生成 IRQ,当 ILR 为1时,只允许 INT(0)生成 IRQ,等等。如果允许所有中断生成 IRQ,则 ILR 应该包含所有中断。
Interrupt Vector Address Register (IVAR)中断向量地址登记册
Interrupt Vector Extended Address Register (IVEAR)中断向量扩展地址登记册

在这里插入图片描述
在这里插入图片描述

这些是读写寄存器,其数量由 Vivado Design Suite (参数 C_NUM_INTR_INPUTS 和 C_NUM_SW_INTR)中的 Customize IP 对话框中的外围中断数量软件中断数量定义。这些寄存器只有在选择了“启用快速中断逻辑”(参数 C_HAS_FAST)时才可用。

官方设计指南

在上电或重置期间,AXI INTC 核心被初始化为禁用所有中断输入和中断请求输出的状态。为了使 AXI INTC 核心能够接受中断和请求服务,需要采取以下步骤:

1.对应于中断的 IER 中的每个位必须设置为1。这允许 AXI INTC 核心开始接收中断输入信号和软件中断。INT0具有最高的优先级,并且它对应于 IER 中的最低有效位(LSB)。
2.MER 必须根据 AXI INTC 核心的预期用途进行编程。MER 中有两个位: 硬件中断启用(HIE)和主 IRQ 启用(ME)。必须设置 ME 位以启用中断请求输出。
3.如果要执行硬件中断的软件测试,HIE 位必须保持在其重置值0。软件测试现在可以通过写一个1到 ISR 中与现有中断输入或软件中断相对应的任何位来进行。如果启用了中断,就会生成相应的中断请求,并且中断处理正常进行。
4.在硬件中断的软件测试完成之后,或者如果没有执行测试,必须将1写入 HIE 位,该位允许硬件中断输入并禁用任何进一步的软件生成的硬件中断。
5. 在1写入 HIE 位之后,对该位的任何进一步写入都没有效果。

寄存器总结

地址偏移量寄存器名称寄存器作用
00h中断状态寄存器ISR一般是外部输入,软件也可以配置软件中断。
04h中断挂起寄存器IPR本寄存器是ISR和IER的位与,便于查看
08h中断挂起寄存器IER只有本寄存器对应比特为1,中断事件才会输出
0ch中断确认寄存器IAR用于清除中断,写入1,清除ISR中对应比特位的高电平
10h设置中断启用SIR单比特设置IER,写入1拉高IER中对应位
14h清除中断启用CIR单比特设置IER,写入1清除IER中对应位
18h中断向量登记册IVR只读寄存器,确定现有中断优先级
1Ch主启用寄存器MER最低位为主启用(ME)位,次低位为硬件中断启用(HIE)位
20h中断模式寄存器IMR0为正常中断模式,1为快速中断处理模式
24h中断级别寄存器ILR限制优先级比ILR小的中断起作用

主要是通过查看中断挂起寄存器(IPR)查看是否有中断,然后运行中断处理函数,最后清除中断。

1.设置IER,确认中断数目
2.设置MER,开启中断
3.通过软件写入ISR,用软件模拟硬件中断
4.写入IAR,清除对应中断
5.设置MER,开启硬件中断

级联模式中断(未关注

IP核界面桌面-Basic Tab

在这里插入图片描述
Enable Fast Interrupt Logic:此选项允许 AXI INTC 在快速中断模式下工作。在这种模式下,AXI INTC 使用interrupt_address信号提供中断向量地址,而处理器通过processor_ack信号确认中断。当选择单一中断输出时,快速中断模式不可用。
Peripheral Interrupts Type

  • Interrupts type - Edge or Level:此选项用于将输入中断设置为 Edge(0)或 Level(1)类型。自动设定为边缘触发。
  • Level type - High or Low:此选项用于将输入 Level 类型的中断设置为 High(1) 或 Low(0)。默认为高电平。
  • Edge type - Rising or Falling:此选项用于将输入 Edge 类型的中断设置为“上升(1)”或“下降(0)”边缘。默认为上升。

Processor Interrupt Type and Connection

  • Interrupt type:此选项用于将输出中断设置为 Edge 或 Level 类型。默认为0,且不建议修改。
  • Level type:此选项用于将输出 Level 类型的中断设置为 High 或 Low。当中断类型设置为 Level 时显示。
  • Edge type:此选项用于将输出边缘类型的中断设置为“上升”或“下降”边缘。当中断类型设置为 Edge 时显示。
  • Interrupt Output Connection:选择中断输出连接总线接口。当连接到 MicroBlaze 和级联的 AXI 中断控制器时,通常使用总线。否则,在未启用快速模式中断且目标具有单个中断输入时,可以使用 Single。

IP核界面桌面-Advanced Tab

在这里插入图片描述

Register Usage:可以选择启用或者不启用某个寄存器
Cascade Mode Master:设置此选项将 AXI INTC 定义为级联模式主机。
Enable Asynchronous Clock Operation:启用此选项允许 AXI 时钟和处理器时钟异步运行。
Number of Software Interrupts:此选项允许选择软件中断的数量。需要注意的是,硬件中断和软件中断应该小于等于32.

IP核界面桌面-ClocksTab

在这里插入图片描述• s_axi_aclk frequency (MHz)- Sets the frequency for the input AXI clock
• processor_clk frequency (MHz)- Sets the frequency for the input processor clock

SDK实现(自己编写)

在这里插入图片描述
在进行中断初始化,启用中断挂起和主启用中断打开后,使用软件向中断状态寄存器中写入1,果然输出中断。
在这里插入图片描述
在检查中断状态寄存器和中断挂起寄存器后,发现有中断,就向中断确认寄存器IAR中该比特位置1,清除中断。

  • 需要注意的是,必须是所有的中断都进行清除后,输出才会变为1.
    在这里插入图片描述
    在向主启用寄存器中的硬件中断打开后,再向中断状态寄存器中对应逻辑中断的位写入中断就不起作用了。而只有对IP的软件中断对应的位写入中断才会发生中断。

SDK实现(官方例程)

在这里插入图片描述

// 进行AXI INTR的初始化
Status = XIntc_Initialize(&InterruptController, DeviceId);

在这里插入图片描述

// 首先先清楚所有的中断,测试中断状态寄存器确实为全0
// 再软件生成一个中断,验证检测到中断且确实可以清楚该中断。则自我测试成功
Status = XIntc_SelfTest(&InterruptController);

在这里插入图片描述

// 连接中断函数和对应的中断ID
Status = XIntc_Connect(XIntcInstancePtr, INTC_DEVICE_INT_ID, 		
	         (XInterruptHandler)DeviceDriverHandler, (void *)0);
// 打开主启用寄存器,分为硬件中断和软件中断两种
Status = XIntc_Start(XIntcInstancePtr, XIN_SIMULATION_MODE);
// 打开中断挂起寄存器,允许某些中断起作用
XIntc_Enable(XIntcInstancePtr, INTC_DEVICE_INT_ID);
// 中断例外三件套
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
				(Xil_ExceptionHandler)XIntc_InterruptHandler,
				XIntcInstancePtr);
Xil_ExceptionEnable();

在这里插入图片描述

// 使用软件为特定位添加中断
Status = XIntc_SimulateIntr(&InterruptController, INTC_DEVICE_INT_ID);

官方例程运行不起来?

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值