可编程逻辑器件

2022-03-21
9 min read

常见可编程逻辑器件

ROM

只读存储器(Read-Only Memory,ROM)可能是最早投入使用的组合型可编程器件。64KB 的 ROM 可以存储最多 16 个输入和 8 个输出的任意组合逻辑函数的真值表(16 位地址线和 8bit 的字节。每字节占用更多 bit 数,可以输出更多位)。如今 FPGA 器件的组合逻辑的基本构件是采用大量更小型的 ROM 组成

PLD/CPLD

从发展来看,可编程逻辑阵列( Programmable Logic Array Device,PLD) 是第一种可编程逻辑器件,它包含具有用户可编程连接的与门和或门两级结构(类似乘积项)。考虑到技术原因, PLD 的基本两级 “与- 或” 结构不能扩展到更大的规模。 因此,IC 制造商发明了复杂 PLD ( Complex PLD,CPLD) 来完成所需的扩展。 典型的 CPLD 只不过是处于同一个芯片上的多个 PLD 及其互连结构的一个集合而已

已知真值表后可以直接写出逻辑表达式,化简后逻辑表达式可以由与门和或门之间的不同连接进行描述,PLD 通过连接不同与或门实现对应的逻辑

FPGA

几乎在 CPLD 发明的同时,一些 IC 制造商采用了不同的方法来扩展可编程逻辑芯片的规模。与 CPLD 相比,现场可编程门阵列(Field-Programmable Gate Array,FPGA) 包含数量更多的更小型可配置逻辑块(Configurable Logic Block,CLB),并提供更大的、支配整个芯片的分布式互连结构

CPLD 和 FPGA 最大的区别应该是基本单元的组成,CPLD 的基本组成是与-或门阵列和可编程的阵列连接模块;而 FPGA 的基本模块是小型 LUT,FPGA 中已经没有基本门电路的概念,相关逻辑使用 LUT 模拟。FGPA 中的可编程模块有多种不同的实现工艺,例如闪存、反熔丝、静态存储器等,对比如下:

项目 闪存 反熔丝 静态存储器
非易失性 x
能否重配置 x
存储器面积 中 (1 Tr. ) 小 (none ) 大 (6 Tr. )
制造工艺 闪存工艺 CMOS工艺 + 反熔丝 CMOS 工艺
ISP(在线编程) x
开关电阻 500~1000 Ω 20~100 Ω 500~1000 Ω
开关电容 1∼2fF < 1fF 1∼2fF
编程良品率 100% > 90% 100%
重写次数 10000 次左右 1 次 无限制

FPGA

硬件组成

随着技术的发展,大部分 FPGA 都包含了一些通用的模块,如下图所示

  1. 逻辑块(LB,logic block)。有不同的实现方式,例如 LUT 、选择器、乘积项等
  2. 布线通道和开关块(Switch Block, SB
  3. 连接块(Connection Block, CB
  4. 输入输出块(input/output Block, IOB
  5. 其他:
    1. 时钟树、配置 / 扫描链(configuration/scan chain)、测试电路等
    2. 处理器、块存储器、乘法器等固定功能的硬核电路

Xilinx UltraScale 系列芯片包含了本文介绍的大部分组件,细节可以参考:UltraScale Architecture and Product Data Sheet: Overview。UltraScale 系列不再使用硬件逻辑单元的个数来计算芯片的逻辑容量,而是使用 System Logic Cells

逻辑块/簇

The Configurable Logic Block (CLB) is the main resource for implementing general-purpose combinatorial and sequential circuits

FPGA 有多种不同的技术实现逻辑电路,比如基于乘积项、查找表等,细节可参考其他资料 。因为 LUT 是 FPGA 最常用的逻辑块实现方法,所以下文以 LUT 为主

多个相邻的逻辑块会组成一个逻辑簇。一个逻辑簇内的局部布线使用硬连接,比通用布线速度更快,簇内的负载电容动态功耗都相对较小。簇内的 LB 可以共享信号,从而减少布线。不同厂家 LB 和 逻辑簇有不同的含义,但结构类似

随着软件和算法的发展,逻辑簇也大大提高了 FPGA 资源的利用率。过去,一个简单的逻辑可能占用一个完整的 LUT,造成了资源浪费,新的 FPGA 技术会将一个 LUT 进行拆分,让一个 LUT 实现更复杂的逻辑,从而提高资源利用率,这种技术被称为自适应 LUT(Adaptive Logic Element, ALE)。自适应 LUT 提出后,LUT 的输入端数量也从常见的 4/5 转变为 6

FPGA 中的逻辑块(LB)一般不仅仅包含 LUT。实际的 LB 模块可能包含移位、寄存器、选择器等功能和模块。复杂的 LB 将增加 LB 的延迟,简单的 LB 将增加电路的逻辑深度,实现 LB 时要权衡多方因素,不同厂家与不同用途的 FPGA,其 LB 结构也不相同。Xilinx UltraScale 系列芯片 CLB(Configurable Logic Block) 由 8 个 LUT 和 16 个寄存器组成,下图是一个 LUT 和两个寄存器之间的连接方式

Xilinx UltraScale CLB 提供了多种功能,细节请参考官方资料:UltraScale Architecture Configurable Logic Block User Guide

布线/开关/连接

随着技术的发展,FPGA 的布线方式也在不断的进化,典型的布线方式有完全连接型、岛型和层次型等,下图展示了层次型和岛型布线。新的 FPGA 大部分使用岛型布线

以岛型布线为例,现实中的 FPGA 布线通道里(SB 之间的连线),同时存在短距离、中距离、长距离等不同长度的布线线段,Xilinx 公司的 FPGA 上还有横跨整个器件的长距离连线称为长线。可以从芯片内的互连线来理解布线通道中不同类型的连线:

  1. 短线,即局部互连线。短线主要用于逻辑门之间或者用于速度不是很高的器件间的连接。通常短线的长度远远小于信号波长,短线的延时主要受寄生电容和耦合电容的影响,对系统延迟没有显著影响,一般可以忽略
  2. 中长线,即模块间互连线。中长线信号传输的速度要求比短线高,电感耦合效应也变得突出,因而容易引起很高的噪声。中长线需要采用低电阻率金属和中等厚度的绝缘介质
  3. 长线,即全局互连线。长线对电路性能起着关键作用。长线特别需要采用低电阻率金属以减小信号线和电源线的电阻损耗,需要厚的绝缘层来增加特征阻抗、减小延时,需要较宽的线间距以减少串扰。宽线、宽间距可以减小 RC 延时和串扰,但也会影响布线密度

开关块(SB)位于横向和纵向布线通道的交叉处,通过可编程开关来控制布线路径。开关块有多种类型,例如不相交(Disjoint ) 型、通用( Universal ) 型网和威尔顿( Wilton ) 型,这里不做介绍

连接块(CB)也由可编程开关构成,其功能是连接布线通道和逻辑块的输入/输出

I/O 块

输入/输出要素由专用的 I/O 块( Input / Output Block , IOB ) 构成,负责器件的 I/O 引脚与逻辑块之间的接口部分。I/O 块放置在芯片的外围。 FPGA 的 I/O 除了固定用途的电源、时钟等专用引脚,还有用户可以配置的用户 I/O。I/O 块具有输入 / 输出缓冲、输出驱动、信号方向控制 、高阻抗控制等功能,可以使输人 / 输出信号能在 FPGA 阵列内的逻辑块和 I/O 块间按指定方式传输。I/O 块里还有触发器,可以锁存输入/输出信号

DSP & 硬宏

当 FPGA 进入通用领域后, 很快就被人们注意到其广泛应用的可能性,主要应用领域也转为 FIR ( Finite Impulse Response , 有限脉冲响应 )滤波器、高速傅里叶变换等数字信号处理( Digital Signal Processing, DSP ) 等。这类应用需要进行大量乘法运算,但乘法等运算器的输入信号较多,基于逻辑块的査找表实现需要大量逻辑块相互连接,因此布线延迟就会增大,难以提高运算性能。同时也是为了和数字信号处理器竞争,FPGA 架构开始集成乘法单元来提高运算性能

随着半导体集成度的提升和 FPGA 规模的增大, 在 FPGA 上实现完整的复杂系统的方式开始受到关注。针对这类应用,需要将通用接口电路等硬件模块抽象出来,作为专用硬件嵌入 FPGA 芯片,这样比用户自行设计再占用通用逻辑资源更为高效。因此,最近的商用 FPGA 中搭载了多样的专用硬件电路,这些专用硬件电路一般被称为硬宏(hard macro)。硬件乘法器和 DSP 块也属于硬宏,此外 FPGA 上通常还有 PCI Express 接口、高速串行通信接口、外部 DRAM 接口、模拟数字转换器等多种硬宏

要在 FPGA 上实现完整的复杂系统,很多情况下微处理器都是不可或缺的组成要素。Xilinx 公司从前生产过搭载 IBM 公司 PowerPC 处理器硬宏的 FPGA,而现在 Xilinx 和 Altera 这两家的 FPGA 中,处理器硬宏采用的都是 ARM 处理器

FPGA 和外部存储器间的带宽会成为系统的瓶颈,从而限制整体性能。因此商用 FPGA 架构在发展过程中开始集成高效的片上存储器。这种 FPGA 内部的存储器统称为嵌入式存储器。 最近的商用 FPGA 架构中主要含有两类嵌入式存储器:存储器块硬宏、查找表存储器。Xilinx UltraScale 系列芯片包含了一定数量的 36Kb BRAM(Block RAM),每个 BRAM 可以看作两个独立的 18Kb RAM。Zynq UltraScale+ MPSoC ZU2CG 芯片包含 150 个 BRAM,所以一共有 5.3Mb 的 BRAM

配置链 & JTAG

将电路编程到 FPGA 上的过程叫作配置( configuration ), 向 FPGA 写人的电路信息叫作配置数据( configuration data )。 配置数据中包含在 FPGA 上实现电路的所有信息,比如査找表中真值表的数据 、开关块中各个开关的开闭状态等

SRAM 型 FPGA 一般需要在上电时使用存储在外部存储器的配置数据进行配置,因此几乎所有的 FPGA 器件都可以主动访问外部存储器,获取配置信息并进行配置。在开发或调试 FPGA 电路时,需要从开发所使用的上位机频繁地重写 FPGA, 因此大多数商用 FPGA 都支持通过 JTAG 接口进行配置

PLL & DLL

为了对应外部接口,有时需要使用多个不同频率、不同相位的时钟信号。因此,最近的商用 FPGA 都可以基于外部输入的基准时钟,通过可编程 PLL 机制来生成各种时钟信号

有的 FPGA 的时钟管理机制不是基于 PLL 而是基于 DLL 的。虽然和 PLL 同样是反馈控制系统,但 DLL 最大的不同之处在于它没有使用 VCO, 而是通过可变延迟线来控制时钟信号的延迟量

设计流程

HDL 设计

HLS 设计

最为传统的数字电路设计方式是绘制基于 AND、 OR 等逻辑门的电路图,而近些年来用 RTL 描述的设计方式成为主流。这些方式虽然可以让开发者掌握电路的实现细节并有针对性地实施优化,但设计时间长,且容易引人人为的设计错误。因此,基于更高抽象度的行为描述的开发技术历经多年发展,现在已经进入实用化的阶段。由行为描述生产电路的技术被称为高层次综合( High Level Synthesis, HLS ) 或者行为综合(behavioral synthesis )

目前大多数行为综合工具所采用的语言都是 C 语言,或者其他从 C 语言改进而来的语言。然而要将软件综合成硬件需要遵循特定的行为描述的规则,并且描述方式的不同对最终硬件性能的影响也很大。因此,开发者需要对行为综合工具所生成的硬件结构有一定的认识,才能编写行为描述代码

基于 IP 的设计

随着数字电路的系统规模不断增大,开发周期长、开发成本高成为了不可忽视的问题。实际上在一般的系统组成模块中,像接口、外围设备控制、通信、加密 、压缩、图像处理等各式各样的设计开发都是可以通用的,通过高效地重复利用成品模块就可以减轻开发周期 、 成本上的问题。这种可以通用和重复使用的设计资产被称为 IP, 也可以叫作 IP 模块、IP 核、IP 宏等

新器件与新架构

动态重配置

FPGA 作为可重构计算器件,必然要回答一个很自然的疑问:如果所要实现的计算处理电路无法全部都加载到 FPGA 时怎么办? FPGA 用作仿真器件时只要准备足够数量的 FPGA 将开发版相互连接,再将大规模逻辑电路装进去就可以了。然而面向计算应用时,软件所期待的加速器应该可以自由处理各种规模的计算。作为对这种期待的回应,动态重配置架构( dynamically reconfigurable architectures ) 应运而生了

将 FPGA 上的运算处理硬件按页单位进行分割,通过页切换的方式在有限的 FPGA 物理资源上实现大规模运算处理,正如虚拟内存允许用户使用超出物理内存大小的内存空间一样,该方法可以将虚拟的大规模硬件在小规模器件上实现,这正是 “虚拟硬件” 的概念

其他

异步 FPGA / 3D-FPGA / 高速串行 IO / 光可编程 / 其他