处理器系统
所有的 Zynq 芯片都有相同的基本架构。作为处理器系统的基础,所有的芯片都包含了一颗双核 ARM Cortex-A9 处理器。这是一颗 “ 硬 ” 处理器 —— 它是芯片上专用而且优化过的硅片元件。
作为比较,我们来看一下硬件处理器以外的另一种方案,就像 Xilinx 的MicroBlaze这样的“软”处理器,这是由可编程逻辑部分的单元组合而成的[27]。也就是说,一个软处理器的实现和部署在 FPGA 的逻辑结构里的任何其他 IP 包是等价的。一般来说,软处理器的优势是处理器实例的数量和精确实现是灵活的。从另一方面来说,硬处理器可以获得相对较高的性能,Zynq 的 ARM 处理器正是如此。第四章会更详细地讨论这个问题。
值得指出的是,可以在 Zynq 的 PL 部分配上一个或多个 MicroBlaze 软处理器,用来和 ARM 处理器协同工作。比如这些 MicroBlaze 处理器可以负责协调特定的底层功能与系统之间的配合,这些要求不高的任务可以从主的 ARM Cortex-A9 处理器上脱离出来,从而提升整体的性能。换句话说,系统中存在的 ARM 处理器并不会妨碍软处理器的使用,甚至很多应用能因采用了此种类型的处理模式(软、硬处理器并存)而受益。
图 2.1 指出了 Zynq 芯片上的 ARM 和 MicroBlaze 处理器的位置,ARM 是专用的资源,而 MicroBlaze 位于逻辑部分。
重要的是,Zynq 的处理器系统里并非只有 ARM 处理器,还有一组相关的处理资源,形成了一个应用处理器单元 (Application Processing Unit,APU),另外还有扩展外设接口、cache 存储器、存储器接口、互联接口和时钟发生电路 [8]。图2.2 所示是 PS 部分架构框图,其中高亮的部分就是 APU。
应用处理器单元 (APU)
应用处理器单元 (APU)图 2.3 所示是 APU 的简化框图。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 对接,图中没有标出这个接口。
根据具体的 Zynq 芯片型号(详见 2.5 节),其中的 ARM Cortex-A9 最高工作频率可达到 1GHz。两个核中的任意一核分别包含一个一级数据 cache 和一个一级指令cache,每个都是 32KB。一般情况下,这样就能在本地存储常用的数据和指令,实现快速的访问时间和优化的处理器性能。两个核另外还共用了一个 512KB 的二级cache 来存放指令和数据,再往下在 APU 里还有一个 256KB 的片上存储器。MMU 的主要责任是在虚拟地址和物理地址之间做翻译 (参见 23.3 节关于 Linux 操作系统里的内存管理的讨论)。
一致性 (窥视)控制单元 (SCU)从事的是一些和两个处理器与一二级 cache存储器之间的接口相关的任务 (“ 窥视 ” 是保证 cache 一致性的几种机制之一,也就是管理在共享的 cache 资源上的数据的一致性 [13])。SCU 负责维持两个处理器的数据 cache 存储器 —— 就是图 2.3 上标着 L1(D) 的 —— 和共享的二级 cache存储器之间的存储一致性。它还初始化并控制对二级 cache 的访问,在必要的时候仲裁从两个核来的访问请求[8][33]。SCU 还要通过加速器一致端口(AcceleratorCoherency PortACP)来管理在 PS 和 PL 之间的访问会话。在简化版的 APU 图(图2.3)上没有出现这个端口,不过在图 2.2 的右侧可以看到。再往下,在 APU 里还有一些定时器和一个中断控制器这种控制块,有关这些的更多详情在 [8] 可以找到。
从编程的角度看,对 ARM 指令的支持是由 Xilinx 软件开发包 (SoftwareDevelopment Kit,SDK)来实现的,它包含了开发部署在 ARM 处理器上的软件所需的全部内容。编译器支持 ARM 和 Thumb® 指令集(16 位或 32 位),在特定的状态下还支持 8 位的 Java 字节码 (用于 Java 虚拟机)。关于指令集选项和细节的进一步信息请阅读 [5]。
作为主 ARM 处理器的附加功能,NEON 引擎实现了单指令多数据 (SingleInstruction Multiple Data,SIMD)功能来实现媒体和DSP类算法的战略加速[9]。NEON 指令是对标准 ARM 指令集的扩展,可以直接使用,也可以通过写出遵循特定的格式的 C 代码,来让编译器产生 NEON 指令 [15]。SIMD 术语意味着 NEON 引擎可以对输入向量中的多组数据,同时执行相同的运算来得到对应的输出向量。这种计算范式很好地迎合了像图像和视频处理这样的应用,可以同时对大量的数据样本(像素点)做运算,也适合天生具有并行性的常用的信号处理函数,比如有限脉冲响应(Finite Impulse Response,FIR)滤波和快速傅立叶变换(Fast Fourier Transforms,FFT)。
图 2.4 描绘了 NEON 引擎的计算。有两个输入寄存器,A 和 B,每个里面有 N 组独立输入向量。这 N 组输入之间,定义了单个运算来产生对应的输出向量,然后写到输出寄存器去。向量的大小是可变的,也就是构成每个寄存器的向量的数量是可变的。重要的特征是每个 “ 道 ” 会用相同的运算产生结果,也就是同一时间对多组不同的输入数据做运算,这就是单指令多数据这个术语的意思。
NEON 支持多种数据类型,包括有符号和无符号的整数、单精度浮点书和半精度浮点数,但是不支持双精度的 [9]。如果需要双精度计算,要用到浮点数单元 (不具有 SIMD 能力)。
在 NEON 之外,还有对浮点单元 (FPU)的扩展,叫做 “ 浮点扩展 ”,也有的地方因为历史的缘故叫做 “VFP (Vector Floating Point,向量浮点)扩展 ”。这个单元实现了与 IEEE 754 标准 [11] 兼容的浮点运算的硬件加速,支持单精度和双精度格式,另外还部分支持半精度和整数转换。就所支持的功能而言有少量限制,具体的描述在文献 [7] 和 [5],不过不会影响和标准的兼容。
|