今天给大侠带来FPGA Xilinx Zynq 系列第三篇,本篇内容目录简介如下:
2. Zynq 芯片(“ 是什么?”)
2.2 可编程逻辑
2.2.1 逻辑部分
2.2.2 特殊资源:DSP48E1和块RAM
2.2.3 通用输入 / 输出
2.2.4 通信接口
2.2.5 其他可编程逻辑扩展接口
本系列分享来源于《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 芯片(“ 是什么?”)
2.2. 可编程逻辑
Zynq 架构的第二个主要部分是可编程逻辑。这是基于 Artix®-7 和 Kintex®-7 的 FPGA 组件的,接下去就展开描述。
2.2.1. 逻辑部分
图 2.5 描绘了 Zynq 芯片的 PL 部分,其中几个功能被高亮了出来。PL 主要是由通用 FPGA 逻辑部分组成的,这个 FPGA 是由逻辑片和可配置逻辑块(ConfigurableLogic Block,CLB)组成的,另外还有用于接口的输入 / 输出块 (Input/ Output Block,IOB)(注意这些都是 Xilinx 专有的术语)。再往下,图 2.5 中标着的每个特性都会被解释。注意还有一些着色的方块,这些会在后面的小节中解释。
图 2.5: 逻辑部分和它的组成单元
下面总结了 PL 的特性 (如图 2.5 所示):
- 可配置逻辑块 (CLB) — CLB 是逻辑单元的小规模、普通编组,在 PL 中排列为 一个二维阵列,通过可编程互联连接到其他类似的资源。每个 CLB 里包含两个逻辑片,并且紧邻一个开关矩阵,如图 2.6 所示。
- 片 (Slice) — CLB 里的一个子单元,里面有实现组合和时序逻辑电路的资 源。如图 2.6 所示,Zynq 的片是由 4 个查找表、8 个触发器和其他一些逻辑所组成的。
- 查找表 (Lookup Table,LUT) — 一个灵活的资源,可以实现 (一)至多 6 个输入的逻辑函数;(二)一小片只读存储器 (ROM);(三)一小片随机访问存储器 (RAM);或 (四)一个移位寄存器。LUT 可以按需组合起来形成更大的逻辑函数、存储器或移位寄存器。
- 触发器(Flip-flop,FF) — 一个实现 1 位寄存的时序电路,带有复位功能。FF 的一种用处是实现锁存。
- 开关矩阵 (Switch Matrix) — 每个 CLB 旁都有一个开关矩阵,实现灵活的 布线功能来(一)连接 CLB 内的单元;或(二)把一个 CLB 与 PL 内的其他资源连接起来。
- 进位逻辑 (Carry Logic) — 算术电路需要在相邻的片之间传递信号,这就 是通过进位逻辑来实现的。进位逻辑把布线和复用器组成链条来连接一个垂直列上的片。
- 输入 / 输出块 (Input/Output Blocks,IOB) — IOB 实现了 PL 逻辑资源之 间的对接,并且提供物理设备 “ 焊盘 ” 来连接外部电路。每个 IOB 可以处理一位的输入或输出信号。IOB 通常位于芯片的周边。关于逻辑部分里的 CLB 资源的进一步资料在文献 [20] 中可以找到。尽管逻辑部分的内部结构知识对于设计者是有用的,大多数情况下并不需要专门地指定这些资源——Xilinx 工具会自动根据设计来安排所需的 LUT、FF、IOB 等,然后做好相应的映射。
图 2.6: 一个可配置逻辑块 (CLB)的组成
2.2.2. 特殊资源:DSP48E1 和块 RAM
除了通用的部分,还有两个特殊用途的部件:满足密集存储需要的块 RAM 和用 于高速算术的 DSP48E1 片。这两个资源都按列排列集成在逻辑阵列中,嵌入在逻辑部分中,而且往往彼此靠近(因为密集计算和在内存中存储数据往往是紧密联系的运算)。图 2.5 表明了芯片布局的这种特性。
Zynq-7000 里的块 RAM 和 Xilinx 7 系列 FPGA 里的那些块 RAM 是等同的,它们 可以实现 RAM、ROM 和先入先出 (First In First Out,FIFO)缓冲器,同时还支持纠错编码 (Error Correction Coding,ECC)[23]。每个块 RAM 可以存储最多 36KB 的信息,并且可以被配置为一个 36KB 的 RAM 或两个独立的 18KB RAM。默认的字宽是 18 位,这样的配置下每个 RAM 含有 2048 个存储单元。RAM 还可以被 “ 重塑 ” 来包含更多更小的单元(比如 4096 个单元 x9 位,或 8192x4 位),或是另外做成更少更长的单元(如 1024 单元 x36 位,512x72 位)。把两个或多个块 RAM 组合起来可以形成更大的存储容量 使用块 RAM 就意味着能在芯片内优化的专用存储单元内,用很小的物理空间储存大量的数据。另一种办法是分布式 RAM (Distributed RAM),这是用逻辑部分里 的 LUT 来搭建的。想要构成一个与快 RAM 大小相当的储存器,需要用到大量的 LUT(分布在较大的面积上) ,而且实现的结果还受到由于遽增的逻辑和布线延迟所造成的时序性能受限的影响。另一方面,用分布式 RAM 实现小存储器往往是有优势的,既是因为资源利用率,也是因为这样的布局更灵活(分布式存储可以靠近与之相互作用的部件,这样也就能有更快的时序性能)。块 RAM 往往还能用芯片所支持的最高时钟频率来工作。
图 2.7: 逻辑部分及其组成单元
逻辑部分里的 LUT 可以用来实现任意长度的算术运算,但是最合适的是做短字 长的算术运算(长字长的算术电路会在逻辑片中占据较大的空间,这样的布局和布线因素会使得时钟频率是次优的)。DSP48E1是专门用于实现对长字长信号的高速算术运算的逻辑片。这些都是专用的硅片资源,并且在逻辑单元内主要包含了预加法器 / 减法器、乘法器和后加法器 / 减法器,如图 2.8 所示,图中标注了最大的算术字长。
图 2.8: DSP48E1 逻辑片的算术能力
图 2.8 是简化的图,省略了底层的实现细节。DSP48E1 用了复用电路来灵活使 用寄存器,并且能支持计算的动态变更(就是说功能可以按需要逐个周期地改变)。多种计算是可能的,包括一个、两个或所有的算术运算符,这些可通过 OPMODE 输入来选择,这个输入会配置内部的复用器 (没有完整显示在图中),并决定所实现的算术功能。注意这里的输入标着 A、B、C 和 D,而输出标着 P。这个部件可以计算 P= (A D)*B,或 P = P’ C,或像这样的很多其它运算。它还能做 SIMD 处理,分别实现对 24 位或 12 位数据所对应的 2 个或 4 个的更短的加法 / 减法 / 累加运算。从图 2.8 还注意到后加法器有一个额外的功能,可以用作逻辑单元。当用作逻辑模式时,它可以做逻辑运算而非算术运算,并且支持所有的基础布尔运算:按位的 NOT、AND、OR、NAND、NOR、XOR 和 XNOR。另外值得指出的是实现溢出检测功能的模式识别器(没有显示在图中),根据所选的场景,可以做四舍五入等相关运算。图 2.8 上所标的标准算术字长足够适合大多数需求,但是如果需要的话,也可 以组合多个 DSP48E1 来做扩展。可以做复数算术,这也是通过组合 DSP48E1 来实现的,而字长也可以配合来实现浮点运算。加上高频率操作(和块 RAM 一样,DSP48E1可以以芯片的最高时钟频率工作)和低功耗的优势,这些 DSP48E1 片对于实现计算密集型算术电路是很有吸引力的。
这些特性合起来,DSP48E1 适合信号处理及其他各种应用。其中最有影响力的 一种用法是用来实现对称形式的有限脉冲响应滤波器,这是在 DSP 和数字通信中常用的部件。预加法器确保了每个 DSP48E1 可以实现两个滤波器抽头,而整个滤波器可以由级联的 DSP48E1 来构成,不再需要利用通用部分上的任何逻辑部件。这就提供了 DSP 中基础的重要计算的一种高性能、高效率的实现。在设计 Zynq 的时候,识别出明确的、可计算的并行函数,尤其是在可能的情况 下,针对 DSP 和块 RAM 的需要,在芯片的 PL 部分加以实现是应该要做的事情。这样一来,PL 就可以用来加速存在于 PS 中的算法。有许多可以想得到的例子,能把 PL直接放在处理器附近,就有机会能把一定的系统功能赋予这个 PL,从而能给整个系统的实现带来巨大的收益。关于 DSP48E1 的进一步详细资料在 [17] 可以找到,而块 RAM 存储器资源是在 [23] 中。
2.2.3. 通用输入 / 输出
Zynq 上的通用输入 / 输出功能(IOB)合起来被称作 SelectIO 资源,它们被组 织成 50 个 IOB 一组。每个 IOB 有一个焊盘,是与外部世界连接来做单个信号的输入或输出的。I/O 组被分类为高性能 (High Performance,HP)或高范围 (High Range, HR),支持各种 I/O 标准和电压,具体见 [24]。HP 接口的电压最高为 1.8V,通常用作连接存储器和其他芯片的高速接口;而 HR 接口允许高达 3.3V 的电压,适合做各种 IO 标准的连接。两类接口都支持单端和差分信号,单端需要一个 IOB 连接,而差分则需要两个。每个 IOB 还包含一个 IOSERDES 资源,可以做并行和串行数据的可编程转换(串 行化和反串行化),数据可以是 2 位到 8 位的。
2.2.4. 通信接口
更准确地说,Zynq 芯片里含有嵌入在逻辑部分里的 GTX 收发器和高速通信接口 块 [21]。这些是专用的硅片块 (“ 硬 IP” 块),能支持一些标准接口,包括 PCIExpress、串行 RapidIO、SCSI 和 SATA。要实现 PCI Express,除了 GTX 收发器本身 之外,还需要另一个硬 IP 包(一个 PCI Express 块 [22],也存在于相应的 Zynq 芯 片)和块 RAM。GTX 收发器是以 “ 四元组 ” 的形式实现的,就是说一组有四个独立的通道, 每个通道包括一个那个通道专用的锁相环 (Phase Locked Loop,PLL)、一个发送 器和一个接收器。根据具体的 Zynq 芯片和封装的不同,最高可以支持 12.5Gbps 的速率。这个接口可以用来实现与像是网络设备、硬盘和其他 FPGA 或 Zynq 芯片这样的独立的外部芯片的连接。要使用这些 GTX 块,需要通过一个 Wizard 工具的支持,它能自动创建所需的接 口的核 [26]。从用户的角度看,就是把一个块引入系统,选择所需的协议和硬件选项,然后设置参数就可以了。
2.2.5. 其他可编程逻辑扩展接口
最后我们来总结一下剩下的 PL 的外部接口。
模拟 - 数字转换 — PL 还具有其他的硬 IP 部件:XADC 块。这是一个专用的模 拟 - 数字转换器 (Analogue to Digital Converter,ADC)混合信号硬件,具有两个独立的 12 位 ADC,每个可以以 1Msps 对外部模拟输入信号采样。对 XADC 的控制是用位于 PS 内的 PS-XADC 接口控制块实现的,而且 PS-XADC 控制块本身可以由 APU上所执行的软件来编程。关于 XADC 的进一步数据和相关资源在 [18] 可以找到。
时钟 — PL 接收来自 PS 的四个独立的时钟输入,另外还能产生和分发它自己 的与 PS 无关的时钟信号 [33]。这个独立的 PL 资源与 7 系列 FPGA 里的是等价的,进一步的细节可以在 [19] 中找到。
编程与调试 — 在 PL 部分实现了一组 JTAG 端口来实现对 PL 的配置和调试 [33][12]。尽管在部署的时候通常倾向于更安全的方法,在开发阶段还是常用 JTAG来做配置。ARM 和 Xlinx 工具都支持通过 JTAG 来做调试。
第三篇到此结束,明日将会带来第四篇,介绍处理器系统与可编程逻辑的接口相关内容。欢迎各位大侠一起交流学习,共同进步。
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!