Zynq7000系列FPGA中的中断

本文介绍Zynq7000系列FPGA中的系统级中断环境和中断控制器的功能(见图7-1)。

专用、共享和软件中断

每个CPU都有一组专用外围中断(PPI,private peripheral interrupts),使用banked 寄存器可以对这些中断进行专用访问。PPI包括全局计时器、专用看门狗计时器、专用计时器和来自PL的FIQ/IRQ。

软件生成的中断(SGI)被路由到一个或两个CPU。SGI是通过写入通用中断控制器(GIC)而产生的。共享外设中断(SPI)是由PS和PL中的各种I/O和内存控制器产生。它们被路由到其中一个或两个CPU。来自PS外部设备的SPI中断也被路由到PL。

通用中断控制器(GIC)

通用中断控制器(GIC)是一个集中式资源,用于管理从PS和PL发送到CPU的中断。当CPU接口接受下一个中断时,控制器启用、禁用、屏蔽并优先考虑中断源,并以编程方式将其发送到选定的CPU。此外,控制器支持用于实现安全感知系统的安全性扩展。

控制器是基于Arm通用中断控制器体系结构的非矢量化的1.0版(GIC v1)。

通过CPU专用总线访问寄存器,以避免互连中的临时阻塞或其他瓶颈,从而实现快速读/写响应。

中断分配器将所有中断源集中在一起,然后将优先级最高的中断源分配给各个CPU。GIC确保针对多个CPU的中断一次只能由一个CPU执行。所有中断源都由一个唯一的中断ID号标识。所有中断源都有自己的可配置优先级和目标CPU列表。

重置和时钟

中断控制器由复位子系统通过写入SLCR中的A9_CPU_RST_CTRL寄存器的PERI_RST位来复位。相同的重置信号还重置CPU专用定时器和专用看门狗定时器(AWDT)。重置后,将忽略所有挂起或正在服务的中断。

中断控制器使用CPU_3x2x时钟(CPU频率的一半)进行操作。

方框图

共享外设中断由各种子系统生成,包括PS中的I/O外设和PL中的逻辑。中断源如图7-2所示。

CPU中断信号通过

来自PL的IRQ/FIQ可以作为PPI#4和#1通过GIC进行路由,或者使用图7-3所示的直通复用器绕过GIC。这个逻辑是为两个CPU实例化的。直通模式是通过mpcore启用的。ICCICR寄存器如表7-1所示。

功能说明

软件生成的中断(SGI)

每个CPU都可以使用软件生成的中断(SGI)来中断自己、另一个CPU或两个CPU。有16个软件生成的中断(见表7-2)。通过将SGI中断号写入ICDSGIR寄存器并指定目标CPU,生成SGI。此写入通过CPU自己的专用总线进行。每个CPU都有自己的一组SGI寄存器,用于生成16个软件生成的中断中的一个或多个。通过读取ICCIAR(中断确认)寄存器或将1写入ICDICPR(中断清除挂起)寄存器的相应位来清除中断。

所有SGI都是边缘触发的。SGI的灵敏度类型是固定的,不能更改;ICDICFR0寄存器是只读的,因为它指定了所有16个SGI的灵敏度类型。

CPU专用外围设备中断(PPI)

每个CPU连接到一个由五个外设中断组成的专用组。PPI如表7-3所示。

PPI的灵敏度类型是固定的,不能更改;因此,ICDICFR1寄存器是只读的,因为它指定了所有5个PPI的灵敏度类型。注意,来自PL的快速中断(FIQ)信号和中断(IRQ)信号被反相,然后被发送到中断控制器。因此,尽管ICDICFR1寄存器将它们反映为活动低(active)电平,但它们在PS-PL接口处为活动(active)高电平。

共享外设中断(**Shared Peripheral Interrupts,**SPI)

一组来自不同模块的大约60个中断可以路由到一个或两个CPU中,或是PL中。中断控制器为CPU管理这些中断的优先级和接收。

除了IRQ#61到#68和#84到#91之外,所有中断敏感度类型都由请求源固定,不能更改。必须对GIC进行编程以适应这种情况。引导ROM不对这些寄存器进行编程;因此SDK设备驱动程序必须对GIC进行编程以适应这些敏感度类型。

对于级别敏感类型的中断,请求源必须为中断处理程序提供一种机制,以便在确认中断后清除该中断。此要求适用于任何具有高灵敏度类型的IRQF2P[n](来自PL)。

对于上升沿灵敏度的中断,请求源必须提供足够宽的脉冲,以便GIC捕获。这通常至少是2个CPU_2x3x周期。此要求适用于任何具有上升沿灵敏度类型的IRQF2P[n](来自PL)。

ICDICFR2到ICDICFR5寄存器配置所有SPI的中断类型。每个中断都有一个2位字段,用于指定敏感度类型和处理模型。

SPI中断如表7-4所示。

中断敏感性、目标和处理

有三种类型的中断进入GIC:SPI、PPI和SGI。在一般意义上,中断信号包括灵敏度设置、是一个还是两个CPU处理中断,以及目标CPU的个数(0,1或2)。然而,大多数中断信号的功能包括固定设置,而其他中断信号是部分可编程的。

有两组控制寄存器用于灵敏度、处理和定位:

•mpcore。ICDICFR[5:0]寄存器:灵敏度和处理。

•mpcore。ICDIPTR[23:0]寄存器:目标CPU。

共享外设中断(SPI)

SPI中断可以针对任意数量的CPU,但只有一个CPU处理中断。如果一个中断以两个CPU为目标,并且它们同时对GIC做出响应,则MPcore确保只有一个CPU读取活动中断ID#。另一个CPU根据时序接收Spurious ID#1023中断或下一个未决中断。这消除了对中断服务例程中的锁的要求。

以CPU为目标是由ICDIPTR[23:8]寄存器完成的。每个SPI中断的灵敏度必须编程为与ICDICFR Register、PS和PL共享外设中断(SPI)中列出的灵敏度相匹配。使用ICDICFR[5:2]寄存器对灵敏度进行编程。

专用外围设备中断(PPI)

每个CPU都有自己的独立PPI中断,具有固定的功能;这些中断的灵敏度、处理和目标是不可编程的。每个中断只进入其自己的CPU,并由该CPU处理。ICDICFR[1]寄存器是只读的,CDIPTR[5:2]寄存器基本上是保留的。

软件生成的中断(SGI)

SGI中断总是边缘敏感的,并且是在软件将中断号写入ICDSGIR寄存器时生成的。ICDIPTR[23:8]中定义的所有目标CPU必须处理中断才能清除它。

编程模型

中断优先级

所有中断请求(PPI、SGI和SPI)都被分配了一个唯一的ID号。控制器使用ID号进行仲裁。中断分配器保存每个CPU的挂起中断列表,然后在将其发送到CPU接口之前选择最高优先级的中断。同等优先级的中断通过选择最低ID来解决。

优先级逻辑在物理上是重复的,以使每个CPU能够同时选择最高优先级的中断。中断分配器保存中断、处理器和激活信息的中央列表,并负责触发CPU的软件中断。

存储SGI和PPI分配器寄存器,为每个连接的处理器提供单独的副本。硬件确保针对多个CPU的中断一次只能由一个CPU执行。

中断分配器向CPU接口传输最高未决中断。它接收回中断已被确认的信息,然后可以更改相应中断的状态。只有确认中断的CPU才能结束该中断。

中断处理

当IRQ线路去断言时,GIC对未决中断的响应。

如果中断在GIC中挂起,并且IRQ被取消断言,则GIC中的中断将变为非活动状态(CPU永远不会看到它)。如果中断在GIC中处于活动状态(因为CPU接口已确认中断),则软件ISR通过首先检查GIC寄存器,然后轮询I/O外设中断状态寄存器来确定原因。

Arm编程主题

Arm GIC体系结构规范包括以下编程主题:

  • GIC寄存器访问
  • 分配器和CPU接口
  • GIC安全扩展的影响
  • PU接口寄存器
  • 保持和恢复控制器状态

传统中断和安全扩展

当使用传统中断(IRQ、FIQ),并且中断处理程序以安全模式(通过ICCICR[AckCtl]=1)访问IRQ和FIQ时,读取中断ID时偶尔会出现争用情况。在IRQ处理程序中也存在看到FIQ ID的风险,因为GIC只知道处理程序从什么安全状态读取,而不知道处理程序是从哪种类型读取的。

有两种可行的解决方案:

  • 仅向重新进入的IRQ处理程序发送IRQ信号,并使用GIC中的抢占功能。
  • 在ICCICR[AckCtl]=0的情况下使用FIQ和IRQ,并使用TLB表在非安全模式下处理IRQ,在安全模式下进行FIQ处理。
相关推荐
chinalihuanyu6 小时前
FPGA程序设计
fpga开发
king_machine design7 小时前
状态机与时钟分频
fpga开发
LabVIEW开发9 小时前
如何在LabVIEW中使用FPGA模块
fpga开发·labview·labview开发
爱吃饼干的小白鼠17 小时前
课程设计——基于FPGA的双向移位寄存器
fpga开发
king_machine design19 小时前
序列检测器(Moore型)
fpga开发
icysmile1311 天前
Zynq7000系列FPGA中的DMA控制器——PL外设请求接口
fpga开发
icysmile1311 天前
Zynq7000系列FPGA中的DMA控制器编程指南
fpga开发·dma
ehiway1 天前
中科亿海微成功入选2023“科创中国”先导技术榜
fpga开发
今天你fpga了嘛1 天前
以太网常用协议——ARP协议
fpga开发
芯王国2 天前
ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)
fpga开发·ic·接口隔离原则·iic·cmos传感器