1.3 FPGA/CPLD的基本结构

本节在讨论FPGA与CPLD的通用结构的基础上,比较两者的异同,加深读者对这两种通用的可编程逻辑器件的认识。

1.3.1 FPGA的基本结构

简化的FPGA基本由6部分组成,分别为可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等,如图1-1所示。

图1-1 可编程逻辑器件的结构原理图

每个单元的基本概念介绍如下。

(1) 可编程输入/输出单元。

输入/输出(Input/Output)单元简称I/O单元,它们是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配需求。为了使FPGA有更灵活的应用,目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可以适配不同的电气标准与I/O物理特性;可以调整匹配阻抗特性,上/下拉电阻;可以调整输出驱动电流的大小等。

可编程I/O单元支持的电气标准因工艺而异,不同器件商不同器件族的FPGA支持的I/O 标准也不同,一般说来,常见的电气标准有 LVTTL、LVCMOS、SSTL、HSTL、LVDS、LVPECL和PCI等。值得一提的是,随着ASIC工艺的飞速发展,目前可编程I/O支持的最高频率越来越高,一些高端FPGA通过DDR寄存器技术,甚至可以支持高达2Gbit/s的数据速率。

(2) 基本可编程逻辑单元。

基本可编程逻辑单元是可编程逻辑的主体,可以根据设计灵活地改变其内部连接与配置,完成不同的逻辑功能。FPGA一般是基于SRAM工艺的,其基本可编程逻辑单元几乎都是由查找表(LUT,Look Up Table)和寄存器(Register)组成的。FPGA内部查找表一般为4输入(注:Altera Stratix Ⅱ的自适应逻辑模块ALM结构比较特殊),查找表一般完成纯组合逻辑功能。FPGA内部寄存器结构相当灵活,可以配置为带同步/异步复位或置位、时钟使能的触发器(FF,Flip Flop),也可以配置成为锁存器(Latch)。FPGA一般依赖寄存器完成同步时序逻辑设计。一般来说,比较经典的基本可编程单元的配置是一个寄存器加一个查找表,但是不同厂商的寄存器和查找表的内部结构有一定的差异,而且寄存器和查找表的组合模式也不同。例如,Altera可编程逻辑单元通常被称为LE(Logic Element,逻辑单元),由一个Register加一个LUT构成。Altera的大多数FPGA将10个LE有机地组合起来,构成更大的功能单元――逻辑阵列模块(LAB,Logic Array Block),LAB中除了LE还包含LE间的进位链、LAB控制信号、局部互联线资源、LUT级联链、寄存器级联链等连线与控制资源。Xilinx可编程逻辑单元叫Slice,它由上下两个部分构成,每个部分都由一个Register加一个LUT组成,被称为LC(Logic Cell,逻辑单元),两个LC之间有一些共用逻辑,可以完成LC之间的配合与级联。Lattice的底层逻辑单元叫PFU(Programmable Function Unit,可编程功能单元),它由8个LUT和8~9个Register构成。当然这些可编程单元的配置结构随着器件的发展也在不断更新,最新的一些可编程逻辑器件常常根据设计需求推出一些新的LUT和Register的配置比率,并优化其内部的连接构造。

学习底层配置单元的LUT和Register比率的一个重要意义在于器件选型和规模估算。很多器件手册上用器件的ASIC门数或等效的系统门数表示器件的规模,但目前FPGA内部除了基本可编程逻辑单元外,还包含有丰富的嵌入式RAM、PLL或DLL,以及专用Hard IP Core(硬知识产权功能核)等。这些功能模块也会等效出一定规模的系统门,所以用系统门权衡基本可编程逻辑单元的数量是不准确的,常常混淆设计者。比较简单科学的方法是用器件的Register或LUT的数量衡量(一般来说两者比例为1∶1)。例如,Xilinx的Spartan-Ⅲ系列的XC3S1000有15360个LUT,而Lattice的EC系列LFEC15E也有15360个LUT,所以这两款FPGA的可编程逻辑单元数量基本相当,属于同一规模的产品。同样道理,Altera的Cyclone器件族的EP1C12的LUT数量是12060个,就比前面提到的两款FPGA规模略小。需要说明的是,器件选型是一个综合性问题,需要将设计的需求、成本压力、规模、速度等级、时钟资源、I/O特性、封装、专用功能模块等诸多因素综合考虑。

(3) 嵌入式块RAM。

目前大多数FPGA都有内嵌的块RAM(Block RAM)。FPGA内部嵌入可编程RAM模块,大大地拓展了FPGA的应用范围和使用灵活性。FPGA内嵌的块RAM一般可以灵活配置为单端口RAM(SPRAM,Single Port RAM)、双端口RAM(DPRAM,Double Ports RAM)、伪双端口RAM(Pseudo DPRAM)、CAM(Content Addressable Memory)、FIFO (First In First Out)等常用存储结构。RAM的概念和功能读者应该非常熟悉,在此不再赘述。FPGA中其实并没有专用的ROM硬件资源,实现ROM的思路是对RAM赋予初值,并保持该初值。所谓CAM,即内容地址储存器。CAM这种存储器在其每个存储单元都包含了一个内嵌的比较逻辑,写入CAM的数据会和其内部存储的每一个数据进行比较,并返回与端口数据相同的所有内部数据的地址。概括地讲,RAM是一种根据地址读、写数据的存储单元;而CAM和RAM恰恰相反,它返回的是与端口数据相匹配的内部地址。CAM的应用也非常广泛,比如在路由器中的地址交换表等。FIFO是“先进先出队列”式存储结构。FPGA内部实现RAM、ROM、CAM、FIFO等存储结构都可以基于嵌入式块RAM单元,并根据需求自动生成相应的粘合逻辑(Glue Logic)以完成地址和片选等控制逻辑。

不同器件商或不同器件族的内嵌块RAM的结构不同,Xilinx常见的块RAM大小是4kbit和18kbit两种结构,Lattice常用的块RAM大小是9kbit,Altera的块RAM最为灵活,一些高端器件内部同时含有两种块RAM结构,分别是M9K RAM(9kbit)和M-144K RAM (144kbit)。

需要补充一点的是,除了块RAM,Altera、Xilinx和Lattice的FPGA还可以灵活地将LUT配置成RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM(Distributed RAM)。根据设计需求,块RAM的数量和配置方式也是器件选型的一个重要标准。

(4) 丰富的布线资源。

布线资源连通FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA内部有着非常丰富的布线资源,这些布线资源根据工艺、长度、宽度和分布位置的不同而被划分为不同的等级,有一些是全局性的专用布线资源,用以完成器件内部的全局时钟和全局复位/置位的布线;一些叫作长线资源,用以完成器件Bank(分区)间的一些高速信号和一些第二全局时钟信号(有时也被称为Low Skew信号)的布线;还有一些叫作短线资源,用以完成基本逻辑单元之间的逻辑互联与布线;另外,在基本逻辑单元内部还有着各式各样的布线资源和专用时钟、复位等控制信号线。

实现过程中,设计者一般不需要直接选择布线资源,而是由布局布线器自动根据输入的逻辑网表的拓朴结构和约束条件选择可用的布线资源连通所用的底层单元模块,所以设计者常常忽略布线资源。其实布线资源的优化与使用和设计的实现结果(包含速度和面积两个方面)有直接关系。

(5) 底层嵌入功能单元。

底层嵌入功能单元的概念比较笼统,这里我们指的是那些通用程度较高的嵌入式功能模块,比如PLL(Phase Locked Loop)、DLL(Delay Locked Loop)、DSP、CPU等。随着FPGA的发展,这些模块被越来越多地嵌入到FPGA的内部,以满足不同场合的需求。

目前大多数FPGA厂商都在FPGA内部集成了DLL或PLL硬件电路,用以完成时钟的高精度、低抖动的倍频、分频、占空比调整、移相等功能。目前,高端FPGA产品集成的DLL和PLL资源越来越丰富,功能越来越复杂,精度越来越高(一般在ps的数量级)。Altera芯片集成的是PLL,Xilinx芯片主要集成的是DLL,Lattice的新型FPGA同时集成了PLL与DLL以适应不同的需求。Altera芯片的PLL模块分为增强型PLL(Enhanced PLL)和快速PLL(Fast PLL)等。Xilinx芯片DLL的模块名称为CLKDLL,在高端FPGA中, CLKDLL的增强型模块为DCM(Digital Clock Manager,数字时钟管理模块)。这些时钟模块的生成和配置方法一般分为两种,一种是在HDL代码和原理图中直接实例化,另一种方法是在IP核生成器中配置相关参数,自动生成IP。Altera的IP核生成器叫作Mega Wizard,Xilinx的IP核生成器叫作Core Generator,Lattice的IP核生成器叫作Module/IP Manager。另外,可以通过在综合、实现步骤的约束文件中编写约束属性来完成时钟模块的约束。

越来越多的高端FPGA产品将包含DSP或CPU等软处理核,从而使FPGA由传统的硬件设计手段逐步过渡为系统级设计平台。例如,Altera的Stratix、Stratix GX、Stratix Ⅱ等器件族内部集成了DSP Core,配合通用逻辑资源,还可以实现ARM、MIPS、NIOS等嵌入式处理器系统;Xilinx的Virtex Ⅱ和Virtex Ⅱ Pro系列FPGA内部集成了Power PC 450的CPU Core和Micro Blaze RISC处理器Core;Lattice的ECP系列FPGA内部集成了系统DSP Core模块。这些CPU或DSP处理模块的硬件主要由一些加、乘、快速进位链、Pipelining和Mux等结构组成,加上用逻辑资源和块RAM实现的软核部分,就组成了功能强大的软运算中心。这种CPU或DSP比较适合实现FIR滤波器、编码解码、FFT(快速傅里叶变换)等运算密集型应用。FPGA内部嵌入CPU或DSP等处理器,使FPGA在一定程度上具备了实现软硬件联合系统的能力,FPGA正逐步成为SPOC(System On Programmable Chip)的高效设计平台。Altera的系统级开发工具是Qsys和DSP Builder,通过这些平台用户可以方便地设计标准的DSP处理器(如ARM、NIOS等)、专用硬件结构与软硬件协同处理模块等。Xilinx的系统级设计工具是EDK和Platform Studio,Lattice的嵌入式DSP开发工具是MATLAB的Simulink。

(6) 内嵌专用硬核。

这里的内嵌专用硬核与前面的“底层嵌入单元”是有区分的,这里讲的内嵌专用硬核通用性相对较弱,不是所有FPGA器件都包含硬核(Hard Core)。我们称FPGA和CPLD为通用逻辑器件,是区分于专用集成电路(ASIC)而言的。其实FPGA内部也有两个阵营:一方面是通用性较强,目标市场范围很广,价格适中的FPGA;另一方面是针对性较强,目标市场明确,价格较高的FPGA。前者主要指低成本(Low Cost)FPGA,后者主要指某些高端通信市场的可编程逻辑器件。例如,Altera的Stratix IV GX器件族内部集成了8.5Gbit/s SERDES(串并收发单元);Xilinx的对应器件族是Virtex 5和Virtex 6;Lattice器件的专用Hard Core的比重更大,有两类器件族支持SERDES功能,分别是Lattice高端SC系列FPGA和现场可编程系统芯片(FPSC,Field Programmable System Chip)。目前,Altera、Lattice和Xilinx都已经推出内嵌10Gbit/s SERDES模块的系统级可编程逻辑器件。

1.3.2 CPLD的基本结构

CPLD在工艺和结构上与FPGA有一定的区别,如前面介绍,FPGA一般都是SRAM工艺的,如Xilinx、Altera、Lattice的系列FPGA器件,其基本结构都是基于查找表加寄存器结构的。CPLD一般都是基于乘积项结构的,如Altera的MAX7000、MAX3000(E2PROM工艺)系列器件,Lattice的isp MACH4000、isp MACH5000(0.18µm E2CMOS工艺)系列器件,Xilinx的XC9500(0.35µm CMOS Fast Flash工艺)、Cool Runner2(0.18µm CMOS工艺)系列器件等都是基于乘积项的CPLD。

CPLD的结构相对比较简单,主要由可编程I/O单元、基本逻辑单元、布线池和其他辅助功能模块构成,如图1-2所示。

图1-2 CPLD的结构示意图

(1) 可编程I/O单元。

CPLD的可编程I/O单元和FPGA的可编程I/O单元的功能一致,完成不同电气特性下对输入/输出信号的驱动与匹配。由于CPLD的应用范围局限性较大,所以其可编程I/O的性能和复杂度与FPGA相比有一定的差距。CPLD的可编程I/O支持的I/O标准较少,频率也较低。

(2) 基本逻辑单元。

与FPGA相似,基本逻辑单元是CPLD的主体,通过不同的配置,CPLD的基本逻辑单元可以完成不同类型的逻辑功能。需要强调的是,CPLD的基本逻辑单元的结构与FPGA相差较大。前面介绍过,FPGA的基本逻辑单元通常是由LUT和Register按照1∶1的比例组成的,而CPLD中没有LUT这种概念,其基本逻辑单元是一种被称为宏单元(Macro Cell,简称MC)的结构。所谓宏单元,其本质是由一些与、或阵列加上触发器构成的,其中“与或”阵列完成组合逻辑功能,触发器用以完成时序逻辑。器件规模一般用MC的数目表示,器件标称中的数字一般都包含该器件的MC数量。CPLD厂商通过将若干个MC连接起来完成相对复杂一些的逻辑功能。不同厂商的这种MC集合的名称不同,Altera的MAX7000、MAX3000系列EPLD将之称为逻辑阵列模块(LAB,Logic Array Block);Lattice的LC4000、isp LSI5000、isp LSI2000系列CPLD将之称为通用逻辑模块(GLB, Generic Logic Block);Xilinx 9500 和 Cool Runner2 将之称为功能模块(FB,Function Block),其功能一致,但结构略有不同。

与CPLD基本逻辑单元相关的另外一个重要概念是乘积项。所谓乘积项即MC中与阵列的输出,其数量标志了CPLD容量,对CPLD的性能也有一定的影响,不同厂商的CPLD定制的乘积项数目不同。乘积项阵列实际上就是一个“与或”阵列,每一个交叉点都是一个可编程熔丝,如果导通就是实现“与”逻辑,在“与”阵列后一般还有一个“或”阵列,用以完成最小逻辑表达式中的“或”关系。“与或”阵列配合工作,完成复杂的组合逻辑功能。MC中的可编程触发器与FPGA内部的可编程触发器相似,一般也包含时钟、复位/置位配置功能,用以实现时序逻辑的寄存器或锁存器等功能。

(3) 布线池和布线矩阵。

CPLD的布线及连通方式与FPGA差异较大。前面讲过,FPGA内部有不同速度、不同驱动能力的丰富布线资源,用以完成FPGA内部所有单元之间的互联互通。而CPLD的结构比较简单,其布线资源也相对有限,一般采用集中式布线池结构。所谓布线池其本质就是一个开关矩阵,通过打结点可以完成不同MC的输入与输出项之间的连接。Altera的布线池叫作可编程互联阵列(PIA,Programmable Interconnect Array),Lattice的布线池叫作全局布线池(GRP,Global Routing Pool),Xilinx 9500系列CPLD的布线池叫作高速互联与交叉矩阵(Fast Connect Ⅱ Switch Matrix),而Cool Runner Ⅱ系列CPLD的布线池则叫作先进的互联矩阵(AIM,Advanced Interconnect Matrix)。CPLD的器件内部互联资源比较缺乏,所以在某些情况下器件布线时会遇到一定的困难,Lattice的LC4000系列器件在输出I/O Bank和功能模块GLB之间还添加了一层输出布线池(ORP,Output Routing Pool),在一定程度上提高了设计的布通率。

CPLD的布线池结构固定,所以CPLD的输入管脚到输出管脚的标准延时固定,被称为Pin to Pin延时,用Tpd表示。Pin to Pin延时反应了CPLD器件可以实现的最高频率,也就清晰地标明了CPLD器件的速度等级。

(4) 其他辅助功能模块。

CPLD中还有一些其他的辅助功能模块,如JTAG(IEEE 1532、IEEE 1149.1)编程模块,一些全局时钟、全局使能、全局复位/置位单元等。

1.3.3 FPGA和CPLD的比较

FPGA/CPLD既继承了ASIC的大规模、高集成度、高可靠性的优点,又克服了普通ASIC设计周期长、投资大、灵活性差的缺点,逐步成为复杂数字硬件电路设计的理想首选。当代FPGA、CPLD有以下特点。

• 规模越来越大。随着VLSI(Very Large Scale IC,超大规模集成电路)工艺的不断提高,单一芯片内部可以容纳上百万个晶体管,FPGA芯片的规模也越来越大。单片逻辑门数已愈千万,如Altera Stratix IV的EP4S230已经达到千万门的规模。芯片的规模越大所能实现的功能就越强,同时也更适于实现片上系统(SOC)。

• 开发过程投资小。FPGA/CPLD芯片在出厂之前都做过严格的测试,而且FPGA/CPLD设计灵活,发现错误时可直接更改设计,减少了投片风险,节省了许多潜在的花费。所以不但许多复杂系统使用FPGA完成,甚至设计ASIC时也要把实现FPGA功能样机作为必需的步骤。

• FPGA/CPLD一般可以反复地编程、擦除。在不改变外围电路的情况下,设计不同片内逻辑就能实现不同的电路功能。所以,用FPGA/CPLD试制功能样机,能以最快的速度占领市场。甚至在有些领域,因为相关标准协议发展太快,设计ASIC跟不上技术的更新速度,只能依靠FPGA/CPLD完成系统的研制与开发。

• FPGA/CPLD开发工具智能化,功能强大。现在,FPGA/CPLD开发工具种类繁多、智能化高、功能强大。应用各种工具可以完成从输入、综合、实现到配置芯片等一系列功能。还有很多工具可以完成对设计的仿真、优化、约束、在线调试等功能。这些工具易学易用,可以使设计人员更能集中精力进行电路设计,快速将产品推向市场。

• 新型FPGA内嵌CPU或DSP内核,支持软硬件协同设计,可以作为片上可编程系统(SOPC)的硬件平台。

• 新型FPGA内部内嵌高性能ASIC的Hard Core。通过这些Hard IP(知识产权)可以完成某些高速复杂设计(如SPI 4.2、PCI Express、Fibre-Channel等通信领域成熟标准和接口等),提高系统的工作频率与效能,减轻工程师的任务量,规避了研发风险,加速了研发进程。

FPGA与CPLD的区别及联系如表1-1所示,希望通过对照,加深读者对FPGA和CPLD各自特点的整体把握。

表1-1 FPGA与CPLD的区别及联系

尽管FPGA与CPLD在硬件结构上有一定的差异,但是对用户而言,FPGA和CPLD的设计流程是相似的,使用EDA软件的设计方法也没有太大的差别。设计时,根据所选器件型号充分发挥器件的特性就可以了,所以后文多数情况下的论述并未加以区分,而统称为可编程逻辑器件。