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内部触发器和多路器的配置。


块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代码中优化,即可进行仿真、综合、布局布线。