目前主流的FPGA,比如Altera和Xilinx,都是基于查找表(LUT)技术和SRAM工艺的,因为SRAM的工艺特性,通电的情况下,数据可以永久保存,但是掉电数据就会丢失,所以在JTAG等配置FPGA时,一般会外接FLASH或者EEPROM,先将数据写入到FLASH或者EEPROM,上电时,再从FLASH或者EEPROM读取数据并配置到FPGA内部。
FPGA芯片内部包括可编程逻辑块(LAB)、可配置输入输出单元(IOE)、时钟管理模块、嵌入式块RAM(BRAM,在Cyclone IV中是M9K)、丰富的布线资源、内嵌的底层功能单元和嵌入式专用硬核等。
1、Cyclone IV资源分布图
可以看到,可编程逻辑块和M9K嵌入式块RAM是交替分布的,因为我们在设计中,常常会利用到BRAM,所以这样有利于优化布线,减少写入和读取的传输延迟。
而嵌入式乘法器是位于最中间,也是为了能够快速地使用乘法器资源,因为在使用乘法器的时候,大多数是进行高速信号处理,所以传输延迟比较重要,能够更好地进行时序分析和约束。
2、查找表(LUT)
查找表是构成逻辑单元的重要组成部分。本质是一个RAM,只是这个RAM已经把所有输出的可能性都写好了。当用户描述了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出。
目前FPGA Cyclone IV内部多使用4输入LUT,共可以构成16*1的RAM,可以输出16RAM地址的数据。
Cyclone V系列使用的是6输入LUT。
在一个4输入LUT中,使用的是2选1多路器。输入A可以2选1 B输出,输入B可以4选2 C输出,输入C可以8选4 D输出,输入D可以16选8 RAM中的数据。
假设A= B= C= D= 1,则输出最上方的0,假设A= B= C= D= 0,则输出最下方的1。
3、可编程逻辑块(LAB)
本地互联在同一个 LAB 的 LE 之间传输信号。寄存器链连接把一个 LE 寄存器的输出传输到 LAB 中相邻的 LE 寄存器上。Quartus II 编译器放置相关的逻辑在 LAB 或相邻的LAB 中,允许使用本地和寄存器链连接以实现性能和面积效率。
4、逻辑单元(LE)
上面我们说到了LAB由16个LE组成,那么LE又是由什么组成呢
在图中可以看到,一个完整的LE包括LUT、控制信号逻辑、同步加载清零逻辑、可编程寄存器等。
其中,最核心的是LUT和可编程寄存器。可编程寄存器可以配置成D、JK、T或者SR触发器。
下面画一个简易的LE,只包括LUT和D触发器,控制信号不画,简单说明LE逻辑单元的原理
从图中可以知道,
1、输入信号从LUT端输入并从线2直接输出,相当于就是一个组合逻辑
2、当输入信号data3直接经过线1,并输入到D触发器,再输出,相当于是信号打了一拍,即延迟一个时钟周期
3、当输入信号输入到LUT,并从LUT输出再经过线3输入到D触发器,再从D触发器输出,相当于是构成了一个时序逻辑。
所以,LE可以实现组合逻辑、打一拍、和时序逻辑,具有逻辑单元的特性了。
LE有两种工作模式:
1、正常模式,适用于一般的逻辑应用和组合功能;
2、算术模式,对于加法器、计数器、比较器、蓄能器(??翻译就是这个,没太懂,应该是存储器差不多吧)的实现比较理想。