>> 什么是fpga
FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中 的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA采用了逻辑单元阵列 LCA(Logic Cell Array)这样一个新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有:
a) 采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
b) FPGA可做其它全定制或半定制ASIC电路的中试样片。
c) FPGA内部有丰富的触发器和I/O引脚。
d) FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
e) FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。这个过程,在资料中称为“加载”或者“装载”,是不是有点怪怪的?类似于arm系列的芯片中bootrom加载bootloader到internal sram中。掉电后,FPGA恢复成白片,内部逻辑关系消失,因 此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一 片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。
>> lut
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。 目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的16x1的RAM。 当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
下面是一个4输入与门的例子,
实际逻辑电路 | LUT的实现方式 | ||
a,b,c,d 输入 | 逻辑输出 | 地址 | RAM中存储的内容 |
0000 | 0 | 0000 | 0 |
0001 | 0 | 0001 | 0 |
.... | 0 | ... | 0 |
1111 | 1 | 1111 | 1 |
>> 基于查找表(LUT)的FPGA的结构
通过上面对lut的描述,如果你联想到可以使用这个来实现fpga,那么就恭喜你,你简直是太聪明了。
下面由小郭同志帮你以几个fpga为例来说明基于lut的fpga结构。
我们看一看xilinx Spartan-II的内部结构,如下图:
| |
xilinx Spartan-II 芯片内部结构 | Slices结构 |
Spartan-II主要包括CLBs,I/O块,RAM块和可编程连线(未表示出)。在spartan-II中,一个CLB包括2个Slices,每个slices包括两个LUT,两个触发器和相关逻辑。 Slices可以看成是SpartanII实现逻辑的最基本结构 (xilinx其他系列,如SpartanXL,Virtex的结构与此稍有不同,具体请参阅数据手册)
altera的FLEX/ACEX等芯片的结构如下图:
altera FLEX/ACEX 芯片的内部结构
逻辑单元(LE)内部结构
FLEX/ACEX的结构主要包括LAB,I/O块,RAM块(未表示出)和可编程行/列连线。在FLEX/ACEX中,一个LAB包括8个逻辑单元(LE),每个LE包括一个LUT,一个触发器和相关的相关逻辑。LE是FLEX/ACEX芯片实现逻辑的最基本结构(altera其他系列,如APEX的结构与此基本相同,具体请参阅数据手册)
>> lut结构的fpga的基本工作原理
上电后,程序加载到fpga中的internal ram中,接下来lut就可以工作了,据spec中讲述,这个过程很快,基本可以忽略。在军工和航天类的fpga中,可以把程序直接搞到flash或者eeprom中,不需要这个load的过程,实现上电运行的特性,类似于pld。
下面接着描述基于lut结构的fpga的基本原理。
我们还是以这个电路的为例:
A,B,C,D由FPGA芯片的管脚输入后进入可编程连线,然后作为地址线连到到LUT,LUT中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。 该电路中D触发器是直接利用LUT后面D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。触发器的输出与I/O脚相连,把结果输出到芯片管脚。这样PLD就完成了图3所示电路的功能。(以上这些步骤都是由软件自动完成的,不需要人为干预)
这个电路是一个很简单的例子,只需要一个LUT加上一个触发器就可以完成。对于一个LUT无法完成的的电路,就需要通过进位逻辑将多个单元相连,这样FPGA就可以实现复杂的逻辑。
由于LUT主要适合SRAM工艺生产,所以目前大部分FPGA都是基于SRAM工艺的,而SRAM工艺的芯片在掉电后信息就会丢失,一定需要外加一片专用配置芯片,在上电的时候,由这个专用配置芯片把数据加载到FPGA中,然后FPGA就可以正常工作,由于配置时间很短,不会影响系统正常工作。 也有少数FPGA采用反熔丝或Flash工艺,对这种FPGA,就不需要外加专用的配置芯片。
那么查找表取代与非门电路的原理是什么呢?我们知道,一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果,若我们事先将相应的结果存放于一个存贮单元,不就相当于实际了与非门电路的功能了吗?FPGA的原理正是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
以例1为例,它的真值表如表1所示。我们只需用将输出y的值事先存放在一个1x16的SRAM或者FLASH中,然后用a、b、c、d做地址索引查找输出,就可以代替与门运算,得到等价的结果。
【例1】 一个四输入与门电路
assign y = a&b&c&d;
表1 例1对应的真值表
a b c d y
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 0
0 1 0 0 0
0 1 0 1 0
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 0
1 0 1 0 0
1 0 1 1 0
1 1 0 0 0
1 1 0 1 0
1 1 1 0 0
1 1 1 1 1