今天给大侠带来FPGA Xilinx Zynq 系列第二篇,第一篇提到了本系列分成三个部分,详细介绍可见FPGA Xilinx Zynq 系列(一)。第二篇开始第一部分 Part A 开始了解Zynq。本篇内容目录简介如下:
2. Zynq 芯片(“ 是什么?”)
2.1 处理器系统
2.1.1 应用处理器单元 (APU)
2.1.2 关于 ARM 模式
2.1.3 处理器系统外部接口
本系列分享来源于《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 芯片(“ 是什么?”)
Zynq 是一款新的组合了一个 FPGA和一个强大的应用处理器的芯片,因此它特征、功能和潜在的应用和单独的 FPGA 或处理器都有所不同。如果你正在此篇文章,很可能你已经了解了一些用FPGA 或处理器或是两者结合来开发系统的背景了。通过此篇,我们会从各方面更详细地观察 Zynq,在这个过程中会提出一些很基础但又很重要的问题,诸如 “ 这是什么?”、“ 如何使用它?” 以及 “ 为何需要用 Zynq”。本篇专注于第一个问题,并介绍 Zynq 架构。Zynq 的总架构包含了两个部分:处理器系统 (PS)和 可编程逻辑 (PL)。这两部分可以单独使用,也可以合起来用,而且实际上供电电路被设计成独立给每个部分供电,这样 PS 或 PL 部分不被使用的话就可以被断电。不过,Zynq 最有价值的模式是它的两个组成部分结合起来使用,因此理解两个部分的结构以及两者之间的接口是很重要的。本篇接下去的部分就是从 PS 部分开始来分析 Zynq 的架构。进一步的资料可以 参阅 《Zynq-7000 Technical Reference Manual (Zynq-7000 技术参考手册)》 。
2.1 处理器系统
所有的 Zynq 芯片都有相同的基本架构。作为处理器系统的基础,所有的芯片都 包含了一颗双核 ARM Cortex-A9 处理器。这是一颗 “ 硬 ” 处理器 —— 它是芯片上 专用而且优化过的硅片元件。作为比较,我们来看一下硬件处理器以外的另一种方案,就像 Xilinx 的 MicroBlaze这样的“软”处理器,这是由可编程逻辑部分的单元组合而成的。也就是说,一个软处理器的实现和部署在 FPGA 的逻辑结构里的任何其他 IP 包是等价的。一般来说,软处理器的优势是处理器实例的数量和精确实现是灵活的。从另一方面来说,硬处理器可以获得相对较高的性能,Zynq 的 ARM 处理器正是如此。值得指出的是,可以在 Zynq 的 PL 部分配上一个或多个 MicroBlaze 软处理器, 用来和 ARM 处理器协同工作。比如这些 MicroBlaze 处理器可以负责协调特定的底层功能与系统之间的配合,这些要求不高的任务可以从主的 ARM Cortex-A9 处理器上 脱离出来,从而提升整体的性能。换句话说,系统中存在的 ARM 处理器并不会妨碍软处理器的使用,甚至很多应用能因采用了此种类型的处理模式(软、硬处理器并存)而受益。图 2.1 指出了 Zynq 芯片上的 ARM 和 MicroBlaze 处理器的位置,ARM 是专用的 资源,而 MicroBlaze 位于逻辑部分。
图 2.1: Zynq 芯片上的硬 (ARM Cortex-A9)和软 (MicroBlaze)处理器
重要的是,Zynq 的处理器系统里并非只有 ARM 处理器,还有一组相关的处理资 源,形成了一个应用处理器单元 (Application Processing Unit,APU),另外还 有扩展外设接口、cache 存储器、存储器接口、互联接口和时钟发生电路。图2.2 所示是 PS 部分架构框图,其中高亮的部分就是 APU。
图 2.2: Zynq 处理器系统
2.1.1 应用处理器单元 (APU)
图 2.3 所示是 APU 的简化框图。
图 2.3: 应用处理器单元的框图 (简化版)
APU 主要是由两个 ARM 处理核组成的,每个都 关联了一些可计算的单元:一个 NEONTM 媒体处理引擎(Media Processing Engine, MPE)和浮点单元 (Floating Point Unit,FPU);一个内存管理单元 (Memory Management Unit,MMU);和一个一级 cache 存储器(分为指令和数据两个部分)。APU 里还有一个二级 cache 存储器,再往下还有片上存储器 (On Chip Memory, OCM)。最后,由一个一致性控制单元 (Snoop Control Unit,SCU)在 ARM 核和二级 cache 及 OCM 存储器之间形成了桥连接,这个单元还部分负责与 PL 对接,图中没有标出这个接口。
其中的 ARM Cortex-A9 最高工作频率可达到 1GHz。两个核中的任意一核分别包含一个一级数据 cache 和一个一级指令cache,每个都是 32KB。一般情况下,这样就能在本地存储常用的数据和指令,实现快速的访问时间和优化的处理器性能。两个核另外还共用了一个 512KB 的二级cache 来存放指令和数据,再往下在 APU 里还有一个 256KB 的片上存储器。
MMU 的主要责任是在虚拟地址和物理地址之间做翻译 , 一致性 (窥视)控制单元 (SCU)从事的是一些和两个处理器与一二级 cache 存储器之间的接口相关的任务 (“ 窥视 ” 是保证 cache 一致性的几种机制之一,也就是管理在共享的 cache 资源上的数据的一致性 [13])。SCU 负责维持两个处理器的数据 cache 存储器 —— 就是图 2.3 上标着 L1(D) 的 —— 和共享的二级 cache存储器之间的存储一致性。它还初始化并控制对二级 cache 的访问,在必要的时候仲裁从两个核来的访问请求。SCU 还要通过加速器一致端口(AcceleratorCoherency Port,ACP)来管理在 PS 和 PL 之间的访问会话。在简化版的 APU 图(图 2.3)上没有出现这个端口,不过在图 2.2 的右侧可以看到。再往下,在 APU 里还有一些定时器和一个中断控制器这种控制块。
从编程的角度看,对 ARM 指令的支持是由 Xilinx 软件开发包 (Software Development Kit,SDK)来实现的,它包含了开发部署在 ARM 处理器上的软件所需 的全部内容。编译器支持 ARM 和 Thumb® 指令集 (16 位或 32 位),在特定的状态下还支持 8 位的 Java 字节码 (用于 Java 虚拟机)。作为主 ARM 处理器的附加功能,NEON 引擎实现了单指令多数据 (Single Instruction Multiple Data,SIMD)功能来实现媒体和 DSP类算法的战略加速。NEON 指令是对标准 ARM 指令集的扩展,可以直接使用,也可以通过写出遵循特定的格式的 C 代码,来让编译器产生 NEON 指令。SIMD 术语意味着 NEON 引擎可以对输入向量中的多组数据,同时执行相同的运算来得到对应的输出向量。
这种计算范式很好地迎合了像图像和视频处理这样的应用,可以同时对大量的数据样本(像素点)做运算,也适合天生具有并行性的常用的信号处理函数,比如有限脉冲响应(Finite Impulse Response,FIR)滤波和快速傅立叶变换 (Fast Fourier Transforms,FFT)。图 2.4 描绘了 NEON 引擎的计算。有两个输入寄存器,A 和 B,每个里面有 N 组独立输入向量。这 N 组输入之间,定义了单个运算来产生对应的输出向量,然后写到输出寄存器去。向量的大小是可变的,也就是构成每个寄存器的向量的数量是可变的。重要的特征是每个 “ 道 ” 会用相同的运算产生结果,也就是同一时间对多组不同的输入数据做运算,这就是单指令多数据这个术语的意思。NEON 支持多种数据类型,包括有符号和无符号的整数、单精度浮点数和半精度浮点数,但是不支持双精度的。如果需要双精度计算,要用到浮点数单元 (不具有 SIMD 能力)。
图 2.4: 在 NEON MPE 中的单指令多数据 (SIMD)处理
在 NEON 之外,还有对浮点单元 (FPU)的扩展,叫做 “ 浮点扩展 ”,也有的 地方因为历史的缘故叫做 “VFP (Vector Floating Point,向量浮点)扩展 ”。这个单元实现了与 IEEE 754 标准兼容的浮点运算的硬件加速,支持单精度和双精度格式,另外还部分支持半精度和整数转换。
2.1.2. 关于 ARM 模式
有必要了解 ARM 公司所用的处理器许可(授权)模式,以及这对你,作为 Zynq 用户在涉及到 Xilinx 和 ARM 的文档时的意义。ARM 的商业模式是许可给原始设备制造商 (Original Equipment Manufacturers,OEM)—— 像 Xilinx—— 在他们所开发的芯片(就是这里的 Zynq)内使用 ARM 处理器 IP。Zynq 里包含了 Cortex-A9,是一系列可用的处理器中的一种,是基于一个特定的架构 (ARM v7)的一个特定的分类 (A)的。即使已经选择 了 Cortex-A9处理器,OEM还是可以在所设计的产品中定制具体的实现,就像 Xilinx所设计的 Zynq 一样。读者可以参考,那里给出了对这种结构和方法有所帮助的概述。
由于 ARM 所提供的处理器 IP 配置的灵活性,在 ARM 和 Xilinx 的文档之间并非 总能保持直接的对应关系。比如 ARM Cortex-A9 可以是 1 核到 4 核的各种配置,而设计Zynq 芯片的时候,Xilinx 已经确定配置为双核。另外还有一些可以配置的单元,比如一级 cache 存储器的大小可以指定为 16KB、32KB 或 64KB,而 Xilinx 选择了 32KB。最后,有些可选的扩展,值得指出的是 Xilinx 已经选择了在 Zynq 中加入NEON 和 FPU 扩展。ARM 的文档详细描述了 APU,但是是在一般性的层面上的;ARM 的文档还分别提 供了关于 Cortex-A9 核、可选的扩展以及它所基于的架构的手册。因此要深入理解它的运行情况,可能需要借助几份 ARM 手册,还需要知道 Zynq 的具体运行的参数。同时,和 Zynq 的配置相关的指标是写在 Xilinx 的文档里的。要注意 Zynq-7000 是特地使用了 ARM Cortex-A9 的 r3p0 版本的,那是基于 ARM v7-A 架构的。当参考 ARM 文档的时候,这一点很重要,因为 ARM 提供了和具体处理器版本相关的不同的手册版本。
2.1.3. 处理器系统外部接口
如图 2.2 所示,Zynq PS 实现了众多接口,既有 PS 和 PL 之间的,也有 PS 和外 部部件之间的。这一节,我们特别讨论外部接口,PS-PL 接口稍后在 2.3 节讨论。PS 和外部接口之间的通信主要是通过复用的输入 / 输出(Multiplexed Input/ Output,MIO)实现的,它提供了可以做灵活配置的 54 个引脚,这表明外部设备和引脚之间的映射是可以按需定义的。这样的连接也可以通过扩展 MIO (ExtendedMIO,EMIO)来实现,EMIO 并不是 PS 和外部连接之间的直接通路,而是通过共用了PL 的 I/O 资源来实现的 [30]。这些都出现在图 2.2 的左侧。当需要扩展超过 54 个引脚的时候可以用 EMIO,而当 PL 中实现了一个 IP 包的时候,这也是 PS 和 PL 中的IP 包接口的一种方法。在 2.3.3 节中将深入讨论 EMIO。可用的 I/O 包括标准通信接口和通用输入 / 输出 (General Purpose Input/ Output,GPIO),GPIO 可以用做各种用途,包括简单的按钮、开关和 LED。表 2.1总结了全部 I/O 外设接口,左侧列中标着的名字对应了 Xilinx 开发工具中用的缩写。注意每种通信接口都有两个。
这里每个接口的丰富而深入的数据在 《Zynq-7000 Technical Reference Manual (Zynq-7000 技术参考手册)》[33] 中。
表 2.1: I/O 外设接口列表
第二篇到此结束,明日将会带来第三篇,介绍可编程逻辑相关内容。欢迎各位大侠一起交流学习,共同进步。
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!