与“底层嵌入单元”是有区别的,这里指的硬核主要是那些通用性相对较弱,不是所有FPGA器件都包含硬核。
1、总体结构
FPGA内部最主要的、最需要关注的部件是CLB(Configurable Logic Block,可配置逻辑块)、Input/Output Block(输入/输出块)和BlockRAM(块RAM)。
CLB是FPGA具有可编程能力的主要承担者。通过配置这些CLB可以让FPGA实现各种不同的逻辑功能。Input/Output Block分布在FPGA的周边,也具有可编程特性,可以配置支持各种不同的接口标准,如LVTTL、LVCMOS、PCI和LVDS等。BlockRAM是成块的RAM,可以在设计中用于存储数据,是设计的重要资源。在大规模设计选择FPGA时,RAM资源是否够用是重要的考虑因素。
除了CLB、Input/Output Block和BlockRAM以外,FPGA还有很多其他的功能单元,例如布线资源、DCM(Digital Clock Manager,数字时钟管理器)和Multiplier(乘法器)等。布线资源在FPGA内部占用硅片面积很大,为FPGA部件提供灵活可配的连接;DCM模块提供各种时钟资源,包括多种分频、移相后的时钟;Multiplier为18bit×18bit硬件乘法器,可以在一个时钟周期内完成乘法运算。
在高级的FPGA中,还包含了嵌入式处理器、DSP模块、以太网MAC、高速串行IO收发器等。
1.1 可配置逻辑块CLB
Xilinx Virtex-5 FPGA的一个CLB包含两个Slice。Slice内部包含4个LUT(查找表)、4个触发器、多路开关及进位链等资源。部分Slice还包括分布式RAM和32bit移位寄存器,这种Slice称为SLICEM,其他Slice称为SLICEL。
CLB内部的两个Slice是相互独立的,各自分别连接开关阵列(Switch Matrix),以便与通用布线阵列(General routing Matrix)相连。
在Xilinx FPGA设计工具中,Slice的位置用“XmYn”表示,其中m为Slice所在横坐标,一个CLB的两个Slice的横坐标分别是m和m+1;n为CLB的纵坐标,一个CLB的两个Slice有相同的n。Virtex-5左下角的Slice编号为X0Y0。
实际上,查找表类似于一个ROM,容量是64bit,6个输入作为地址输入,存储的内容作为布尔运算的结果。查找表中的内容由ISE生成并在FPGA配置时加载进去。
Slice中的触发器可以配置成多种工作方式,例如是FF或Latch,同步复位或异步复位、复位高有效或低有效等。
CLB内部包含多个选择器。CLB的选择器与一般的选择器不同,它们没有选择端。通路的选择在FPGA配置后固定下来。
CLB内部还包含了一个重要的资源——进位链,其作用是方便加法器的实现。
SLICEM的结构与SLICEL的结构类似,最大的区别是使用了一个新的单元代替SLICE中的查找表。这个新的单元可以配置为LUT、RAM、ROM或移位寄存器(SRL16/SRL32),从而可以实现LUT的逻辑功能,也能做存储单元(多个单元组合起来可以提供更大的容量)和移位寄存器(提供延迟等功能)
CLB内部查找表、触发器、多路器等基本单元的配置是由ISE自动完成,一般情况下不需要设计者干预。但是,如果认为有必要,设计者可以通过ISE中集成的FPGA底层编辑器——FPGA Editor直接编辑CLB内部触发器和多路器的配置。
1.2 输入输出模块(Input/Output Block)
Input/Output Block 作用是为FPGA提供内部资源与外围电路之间的接口,提供输入缓冲、输出驱动、接口电平转换、阻抗匹配、延迟控制等功能。高端FPGA的输入/输出模块还提供了DDR输入/输出接口、高速串行接口(SERDES)(见注1)等功能。
Xilinx FPGA 的输入/输出模块采用SelectIO技术(SelectIO是Xilinx公司的注册商标),提供多达960个用户IO,支持20多个单端和差分电平I/O标准;还支持DDR、DDR-2、SDRAM、QDR-II和RLDRAM-II等Memory接口标准。SelectIO经验DCI(Digitally Controlled Imepedence,数字控制阻抗),提供有源I/O终端以实现阻抗匹配。
Virtex-5的Input/Output Block以Tile为单位,IO Tile的概念与CLB有相似之处,同样是一个较大的组成单元,内部包含多个相同单元。一个Tile包含两个IOB、两个ILOGIC/ISERDES单元和两个OLOGIC/OSERDES单元。
IOB内部的主要组成部分是输入/输出Buffer和PAD(焊盘,在集成电路版图上由金属焊点和静电防护二极管组成),提供输入信号缓冲、输出信号驱动等功能。
在Input/Output Block 中,每个ILOGIC/ISERDES 单元都可以配置为ILOGIC或ISERDES。配置为ILOGIC时,可以作为常见的输入逻辑单元,或作为DDR接口的输入端;配置为ISERDES时,可以完成1到6的串并转换,两个ISERDES单元相连可以完成1到10的串并转换。
类似地,每个OLOGIC/OSERDES 单元可以配置为OLOGIC,实现常见的输入逻辑单元,或作为DDR接口的输出端。也可以配置为OSERDES,完成6到1的并串转换,经过IOB和PAD驱动高速串行总线。两个OSERDES单元相连可以完成10到1的并串转换。
Input/Output Block中有IDELAY单元,可以提供精确的延迟,这个延迟不受工艺和温度的影响。延迟共有64个抽头,每个抽头提供75ps的延迟,因此延迟的数值可以在0~4800ps之间进行选择。
部分IO接口标准需要特定的Vcco和Vref电压,这些电压由FPGA外部电路提供,并连接到FPGA管脚,供多个I/O Tile共享。连接到同一组Vcco和Vref电压的I/O Tile组成一个Bank(中文意思是“组”,但是通常直接用Bank表示更方便)。
1.3 块RAM(BlockRAM)
Xilinx FPGA 内部成块的RAM资源称为BlockRAM;根据器件系列不同,BlockRAM大小有4096bit(Virtex、VirtexE和Spartan系列)、18Kbit(Virtex-II、Spartan-3和Virtex-4系列)和38Kbit等3种(Virtex-5)。BlockRAM是真正的双口RAM结构,有两套读写数据、地址和控制总线。两套总线的操作是完全独立的,共享同一组存储单元。BlockRAM的双口RAM结构对于逻辑设计至关重要,它有两套独立的接口,可以方便地连接两个其他设计单元,允许一个端口写入数据的同时,另一个端口读出数据,提高了数据吞吐率(Throughput)。
BlockRAM的内容除了在电路运行中重写以外,也可以通过配置文件在FPGA上电配置时清零或初始化为特定值。写BlockRAM时,数据输出端可以输出新写入的数据、被覆盖的数据或保持不变。FIFO是逻辑设计中常用的功能单元,Virtex-5的BlockRAM具有FIFO专用逻辑,因此实现FIFO时将不需要额外的CLB资源,也不需要设计者自行设计FIFO逻辑控制电路,对BlockRAM进行配置即可。
BlockRAM的调用,一般通过CORE Generator进行,在CORE Generator的图形界面中指定所需要RAM的数据宽度和深度、设置控制信号和初值,就可以生成设计者所需要的RAM(这些RAM通过调用BlockRAM实现),然后在项目RTL代码中优化,即可进行仿真、综合、布局布线。