今天给大侠带来FPGA Xilinx Zynq 系列第二十二篇,Zynq 片上系统概述之存储器等相关内容,本篇内容目录简介如下:
10. Zynq 片上系统概述
10.3 存储器
10.3.1 存储器接口
10.3.2 片上存储器 (On-Chip Memory,OCM)
10.3.3 存储器映射
10.4 中断
10.4.1 中断信号
10.4.2 通用中断控制器 (GIC)
10.4.3 中断源
10.4.4 中断优先级定序和处理
10.4.5 延伸阅读
10.5 本章回顾
10.6 参考文献
本系列分享来源于《The Zynq Book》,Louise H. Crockett, Ross A. Elliot,Martin A. Enderwitz, Robert W. Stewart. L. H. Crockett, R. A. Elliot, M. A. Enderwitz and R. W. Stewart, The Zynq Book: Embedded Processing with the ARM Cortex-A9 on the Xilinx Zynq-7000 All Programmable SoC, First Edition, Strathclyde Academic Media, 2016。
Zynq 片上系统概述
10.3 存储器
Zynq-7000 AP 芯片实现了很多不同类型的存储器和存储器接口工具。本节将介绍这些存储器工具。
10.3.1 存储器接口
所有 Zynq-7000 AP芯片上的存储器接口单元包括一个动态存储器控制器和几个静态存储器接口模块。动态存储器控制器可以用于 DDR3、DDR3L、DDR2 和 LPDDR2。静态存储器控制器支持一个 NAND 闪存接口、一个 Quad-SPI 闪存接口、一个并行数据总线和并行 NOR 闪存接口 [9]。
动态存储器接口
这个多协议双数据速率 (Double Data Rate,DDR)存储器控制器包括三个主要的模块:一个核心存储器控制器和调度器 (DDRC) 、一个 AXI 存储器端口接口(DDRI)和一个数字 PHY 以及控制器 (DDRP)[3]。
DDR 存储器控制器可以被配置为 16 位或 32 位模式,能在配置为 8、16 或 32 位 的单个块的 DRAM 存储器中访问 1GB 地址空间。也支持 EEC 存储器,但是只能以 32位模式访问。用 DDR3 的时候支持最大 1333Mb/s 的速度 [9]。
对 PS 和 PL 的共享存储器的共享访问是通过多端口 DDRI 来支持的,它具有四个 AXI 从机端口来满足这个要求 [9]:
• PL 通过两个专用的 64 位端口 (AXI_HP)来访问。
• 一个 64 位端口通过 L2 cache 控制器专用于 ARM CPU。这个端口可以被配置为 低延迟。
• 所有其他 AXI 主机通过中央互联共享剩下的端口。
每个 AXI 接口配备有专用的事务 FIFO。
DDRP PHY 处理从控制器来的读 / 写请求,并在 DDR 存储器的时序约束下,把请 求翻译为信号。PHY 用控制器来的信号创建内部信号,通过数字 PHY 传递到 DDR 引脚上。最后通过 PCB 上的走线把 DDR 引脚接到实际的 DDR 芯片上。
图 10.3 是 DDR 存储器控制器的框图。
图 10.3: DDR 存储器控制器框图
DDR 存储器控制器的功能是很丰富的,基于本书的目的,没能全部提及。对于 DDR 存储器控制器的深入信息,请参考 《Zynq-7000 All Programmable SoC Technical Reference Manual》的第 10 章 [3]。
DDR 存储器控制器所支持的芯片是与表 10.5 列出的条件有关的。
表 10.5: 存储器可连接性限制 [9]
表 10.6 给出了 Zynq 芯片存储器配置的一些例子。
表 10.6: 可能的 Zynq-7000 SoC 存储器配置
静态存储器接口
静态存储器控制器 (Static Memory Controller,SMC) 可以用做 NAND 闪存控 制器,或并口存储器控制器。SMC 支持下列存储器类型 [8]:
• NAND 闪存
• NOR 闪存
• 异步 SRAM
所有的地址、命令、数据和存储器芯片协议都是由 SMC 处理的,允许用户通过向功能寄存器读取或写入来访问这个控制器。而 SMC 的选项寄存器是通过 APB 接口来配置的。这个 SMC 是基于 ARM PL353 静态存储器控制器的。
表 10.7 总结了 NAND 闪存和并行 (SRAM/NOR)接口的特性。
表 10.7: SMC 接口特性 [8]
图 10.4 给出了 SMC 的框图。
图 10.4: 静态存储器控制器 (SMC)的框图
根据图 10.4 的框图,某些模块的功能描述如下 [8]:
• 存储器管理 — 存储器管理控制和跟踪 CPU_1x 域的状态机的当前状态。它负责控制发送给存储器的直接命令,更新在存储器时钟中使用的寄存器值,并经由 APB 接口控制进入和退出低功耗模式。
• 格式 — 格式模块负责协调存储器管理和 AXI 从机接口,其中从存储器管理来的请求具有较高的优先级。从 AXI 读写通道来的请求大体以轮转的形式来协调。AXI 传输也由这个格式模块被映射到可用的通道上,然后经由命令 FIFO传送到存储器接口上。
• 互联接口 — 这个 APB 接口给软件提供了一块存储映射的区域,来读写控制和状态寄存器。这个 AXI 接口是存储映射的,让软件可以以 NOR/SRAM 控制器模式来读取和写入存储器。对这个 SMC 存储器的访问是由一个 32 位 AHB 总线实现的。
表 10.8 给出了 SMC 存储器地址映射。
10.3.2 片上存储器 (On-Chip Memory,OCM)
片上存储器包括 256kB 的 RAM 和 128kB 的 ROM —— 这是 BootROM 驻留的地方。OCM 支持两个 64 位 AXI 从机接口端口 —— 一个端口专用于通过 APU SCU 的 CPU/ ACP 访问,而另一个是由 PS 和 PL 内其他所有的总线主机所共享的。BootROM 对于用户是不可见的,专门保留只用于引导的过程 [6]。
由于 RAM 被实现为一个双宽度的存储器(128 位),OCM 能支持 RAM 访问时高吞 吐率的 AXI 读写。为了充分利用这个 RAM 访问的高吞吐率,用户应用程序必须使用128 位对齐的地址和偶数的 AXI 批量大小 [6]。
TrustZone 安保手段支持 4kB 的存储器块,而这个 256kB 的 RAM 可以被分割为 64 个 4kB 的块,每个可以赋予不同的安全属性。图 10.5 是 OCM 的一个结构图。
图 10.5: OCM 结构图
根据图 10.5 的结构图,OCM 关联着 10 个 AXI 通道 [6]:
• 5 个用于 CPU/ACP(SCU) 端口的 AXI 通道
• 5 个用于其他 PS/PL 主机 (OCM 切换端口)的 AXI 通道
SCU 和 OCM 切换端口的读写通道仲裁是在 OCM 模块内控制的。只有 RAM 的访问 要接收校验发生和检验。一个寄存器访问 APB 端口和中断信号 (IRQ)是另一个进出 OCM 模块的主接口 [6]。
这个 OCM 模块的关键特性包括 [6]:
• 256kB 片上 RAM
• 128kB 片上 BootROM (用户不可见)
• 两个 AXI 3.0 64 位从机接口
• 支持完整的 AXI 64 位带宽用于 OCM 互联端口上的同步读写指令(施加了优化 了的地址对齐限制)
• 对片上 RAM 的 TrustZone 安保支持 (4kB 页粒度)
• 对 RAM 的以字节为单位的校验发生、检验和中断支持
OCM 存储器寻址映射和寄存器设置的进一步细节在 《Zynq-7000 All Programmable SoC Technical Reference Manual》的第 29 章 [6]。
10.3.3 存储器映射
Zynq-7000 AP SoCs 支持 4GB 的地址空间,表 10.9 给出了存储器映射。
表 10.9: Zynq-7000 SoC 的存储器映射 [9]
10.4 中断
Zynq 芯片的中断结构是和基于双核 ARM A9 的 PS 紧密链接的,也和 GIC PL390 中断控制器是协作的。这一节介绍这个中断控制器的功能和系统级的中断环境,如图 10.6 所示。本节剩下的部分会涉及一些关键的话题,包括:
• GIC 的功能
• 私有、共享和软件的中断
• 中断优先级和处理
图 10.6: 系统级中断环境
10.4.1 中断信号
PS 的 IOP 中断信号被走线到 PL 并与 FCKL 时钟异步触发。另一方面,PL 可以触 发至多 20 个异步中断给 PS,其中最多 16 个中断信号会映射到中断控制器作为外设中断。每个中断信号会设置一个优先级,然后被映射给一个 CPU 或两个 CPU 都给。剩下的四个 PL 中断信号,被反转然后直接传递给中断控制器的私有外设中断(Private Peripheral Interrupt,PPI)单元作为 nIRQ 和 nFIQ 信号。每个 CPU 具 有自己的 nIRQ 和 nFIQ 信号。表 10.10 总结了 PS 和 PL 之间相关的中断信号 [5]。
表 10.10: PL 中断信号 [5]
10.4.2 通用中断控制器 (GIC)
通用中断控制器是基于非向量的 ARM 通用中断控制器架构 v1.0 的。
控制器管理从 PS 和 PL 发送给 CPU 的中断。它是一个集中管理的资源,能使能、 禁止、屏蔽中断源,并且能对中断源设立优先级,当下一个中断被某个 CPU 接口接受时,能以可编程的方式把中断发送给恰当的 CPU[5]。控制器还支持有安全机制的系统实现的安全扩展 [5]。
GIC 寄存器是通过 CPU 私有总线来访问的,这条私有总线避开了互联中的瓶颈 和偶尔的阻塞,从而确保了读写的快速响应时间 [5]。
所有的中断源都被中断分配器集中起来,然后其中最高优先级被分派到具体的某个 CPU 上去。GIC 还要确保那些目标是不止一个 CPU 的中断一次只被一个 CPU 所捕获。有一个唯一的中断 ID 编号来标识每一个中断源,对应有它自己的可配置的优先级和目标 CPU 的列表 [5]。
关于 GIC 的进一步的资料,可以从 《ARM Generic Interrupt Controller Architecture Specification》获得 [1]。
10.4.3 中断源
本节概述每个中断源的情况,包括:
• CPU 私有外设中断 (PPI)
• PL 和 PS 共享的外设中断 (SPI)
• 软件产生的中断 (SGI)
图 10.7 勾勒了中断源的结构图。
图 10.7: 中断控制器架构图
CPU 私有外设中断 (PPI)
如表10.11所总结的,每个CPU核连接到了一个有五个外设中断的私有组上[5]。
GIC 必须被编程以实现让所有的 PPI 敏感性类型都与请求源绑定,而且不能被改变。这些寄存器不能被 Boot ROM 所编程,因此 GIC 必须被 SDK 芯片驱动程序编程来配合这些 PPI 敏感性类型 [5]。
值得提及的是,从 PL 来的中断 (IRQ)和快速中断 (FIQ)信号在发送给中断控制器之前,会在传输给 PS 的时候被反转。这些信号因此在 PL 内被反转为低电平有效前,在 PS 内的 PS-PL 接口上是高电平有效的。
表 10.11: 私有外设中断 (PPI) [5]
共享的外设中断 (SPI)
有大约 60 个来自各种模块的中断可以被传送到 PL 或一个或两个 CPU。那些目标为 CPU 的中断的优先级和中断的接收情况是由中断控制器管理的 [5]。
和 PPI 类似,SPI 的中断敏感性类型是与请求源绑定的,不能被修改。SDK 驱动程序必须对 GIC 编程来适应这些敏感性类型。表 10.12 总结了各种 SPI 中断。
表 10.12: PS 和 PL 共享的外设中断 [5]
软件产生的中断 (SGI)
每个 CPU 都能用 SGI 来中断自己、另一个 CPU 或同时中断两个 CPU。表 10.13 总结了 16 个 SGI[5]。向软件产生的中断寄存器(Software Generated Interrupts Register,ICDSGIR)写入 SGI 中断编号并指定目标 CPU (或两个 CPU),就产生了一个 SGI。这个写入是由源 CPU 的 CPU 私有总线执行的。每个 CPU 各自有一组 SGI寄存器,可以产生 16 个软件产生中断中的一个或多个。中断的清除是通过读取中断确认寄存器 (Interrupt Acknowledge Register,ICCIAR)或向中断挂起清除寄存器 (Interrupt Clear-Pending Register,ICDICPR)对应的位写入 “1” 值来实 现的 [5]。
所有的 SGI 都是边缘触发的,它们的敏感性类型是固定的,而且不能被修改。
表 10.13: 软件产生的中断 (SGI) [5]
10.4.4 中断优先级定序和处理
本章简要了解一下 Zynq 芯片的中断优先级定序和处理的方式。
中断优先级定序
所有的中断请求,无论是 PPI、SGI 还是 SPI,都被赋予了一个唯一的 ID 编号, 以用于中断控制器的仲裁。中断分派器握有每个 CPU 的挂起的中断列表,它会从中选择优先级最高的中断,然后把它发送到 CPU 接口。如果具有相同优先级的两个中断同时到达,具有最低中断 ID 的那个会首先被发送 [5]。
每个 CPU 都存在着优先级定序逻辑,所以对最高优先级中断的选择是每个 CPU 各自进行的。中断分派器具有中断、处理器和活跃信息的中央列表,它负责给 CPU(或多个 CPU)触发软件中断。为了给每个处理器一个独立的拷贝,SGI 和 PPI 分派器寄存器是分组的。逻辑上确保了目标不止一个 CPU的中断只能同一时间被一个 CPU获取 [5]。
在发送了挂起的最高优先级的中断给 CPU 接口之后,中断分派器会从那个 CPU 收到回复的确认消息,这样它就可以改变对应的中断的状态了。这个中断只能由确认中断的那个 CPU 来终止 [5]。
中断处理
中断分派器给每个 CPU 上所支持的每个中断运作了一个状态机。可能的中断状 态是 [1]:
• 无效
• 挂起
• 有效
• 有效并挂起
当中断控制器收到一个中断请求,它会把那个请求的状态置为挂起。一个挂起 的中断的再生不会影响那个中断的状态 [1]。一旦那个中断被确认了,如果中断的挂起状态在中断有效了之后还要继续,或是中断又发生了,状态就从挂起转变为有效并挂起;否则的话,状态就从挂起变为有效 [1]。当中断控制器从处理器收到确认消息表明中断处理已经完成,那么中断的状态就从有效变更为无效,标明中断不会被再次产生;否则,就从有效并挂起变更为挂起。
GIC 如何处理中断的进一步信息在 《ARM Generic Interrupt Controller Architecture Specification》的第 3 章 《Interrupt Handling and Prioritization》中。
10.4.5 延伸阅读
仅就本章的篇幅是不可能覆盖中断的方方面面的,ARM 的 GIC 的规范超过了 150 页!有鉴于此,下面列出了在《ARM Generic Interrupt Controller Architecture Specification》[1] 中可以找到的一些内容:
• GIC 安全扩展
• 中断处理状态机
• 连接 GIC 的程序员模型接口
• GIC 寄存器的细节
• 分派器和 CPU 接口
10.5 本章回顾
本章详细解释了 Zynq SoC 的某些特性。介绍并讨论了在 L1 cache 和 PS 之间的 接口的方法和相关的信号。特别关注了在 PL 和 PS 之间实现 cache 一致性数据传输和请求的 ACP 访问点,也介绍了 PL 和 PS 之间的中断接口。
讨论了 AXI 互联系统,以及各种数据通路和互联开关,并标识了可用的互联主机和从机。关于 AXI 互联的进一步信息在第 19 章还有。
本章最后一节详细讨论了 Zynq SoC 实现的各种存储器接口和控制器,以及中断系统。
10.6 参考文献
说明:所有的 URL 最后访问时间是 2014 年 6 月。
[1] ARM, “ARM Generic Interrupt Controller: Architecture Specification”, v1.0, September 2008.位于 : http://infocenter.arm.com/help/topic/com.arm.doc.ihi0048a/IHI0048A_gic_architecture_spec_v1_0.pdf
[2] Xilinx, Inc, “Application Processing Unit” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 60-111.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[3] Xilinx, Inc, “DDR Memory Controller” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 278-314.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[4] Xilinx, Inc, “Interconnect” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 117-146.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[5] Xilinx, Inc, “Interrupts” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 213-224.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[6] Xilinx, Inc, “On-Chip Memory (OCM)” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 707-717.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[7] Xilinx, Inc, “Signals, Interfaces and Pins” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 42-59.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[8] Xilinx, Inc, “Static Memory Controller” in Zynq-7000 All Programmable SoC Technical Reference Manual, UG585, v1.5, February 2014, pp. 315-324.位于 : http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf
[9] Xilinx, Inc, “Zynq-7000 All Programmable SoC Overview”, DS190, v1.6, December 2013.位于 : http://www.xilinx.com/support/documentation/data_sheets/ds190-Zynq-7000-Overview.pdf
第二十二篇到此结束,下一篇将带来第二十三篇,开启第十一章,Zynq 片上系统的开发等相关内容。欢迎各位大侠一起交流学习,共同进步。
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!