第一章 FPGA简介1 什么是FPGAFPGA的官方解释是 : Field-Programmable Gate Array,即现场可编程门阵列,它是在PAL、GAL、CPLD(不用读系列)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 可以将FPGA理解为大量的逻辑门阵列,用户可以自由组合以实现不同的电路功能,即FPGA的可编程特性。相比于冯诺依曼结构的CPU、GPU等通用处理器,FPGA具有效率更高速度更快的优点;相比于专职专用的ASIC,FPGA则具有开发难度小,开发周期更短的优势,更适用于复杂多变的数据中心等应用
但是FPGA也不是万能的,优势有时候也是劣势。虽然FPGA相比于CPU效率更高、功耗更低的特点,但是易于开发程度远远不如CPU;虽然相比ASIC开发周期更短,但是也存在着资源浪费,成本过高、性能较差的问题,不能真正的替代ASIC。
2 FPGA的工作原理由于FPGA需要反复烧写,所以他实现组合逻辑的结构不能像ASIC那样通过固定的与非门来完成,而只能采用一种抑郁反复配置的结构。查找表(LUT)可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。
根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放在一个存储单元,就相当于实现了与非门电路的功能。FPGA的原理就是如此,他通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多实用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查找表,找出相应的内容,然后输出即可。
以实现y=(a&b)|c的功能为例。如果是ASIC,下面就是基本的实现结构:
图 1
而在FPGA,用户首先写出“y=(a&b)|c”代码,软件工具(QUARTUS、ISE或VIVADO)分析这一行代码,得出a、b、c不同值下(共8种不同值),y的值分别是多少。
然后软件工具将结果写到LUT上,从而实现了该代码的功能。下图就是FPGA的实现基本结构。LUT就像一个RAM,abc则相当于地址,通过abc的地址就得读到值赋给y。
图 2
3 更为复杂的FPGA架构赛灵思公司在1985年推出的第一块FPGA—XC2064包含8×8=64的逻辑块阵列,每个逻辑块包含一个四输入查找表及其它一些简单功能。由于它们的容量非常有限,因此早期的FPGA只用来执行一些相对简单的任务,比如集中一些胶合逻辑,或实现基本的状态机。
随着时间的推移和工艺节点的进步,FPGA的容量和性能不断得到提高,功耗却不断的下降。直到大约2006年以前广泛使用的一直是四输入查找表,一些高端器件可能使用六、七或八输入的查找表。这些大家伙可能被用作一个大的查找表,或分裂成许多更小的功能,比如两个四输入的查找表或一个三输入一个五输入的查找表。在实际的高端器件中,这种可编程构造可以描述相当于百万级(有时甚至千万级)的原始逻辑门。
如果某个逻辑功能(比方说计数器)是用FPGA的可编程构造实现的,那么这个功能可以被说成“软功能”,我们称之为软内核。相比之下,如果某个功能是直接用芯片实现的,则被说成“硬功能”,我们一般称之为硬内核。软内核的优势在于,你可以让它们做你想让它们做的任何事,注意,是数字功能,不包括模拟功能。硬内核的优势是它们占用较少的硅片面积,具有较高的性能,并且功耗较低,并且硬内核可用于实现模拟功能。例如锁相环的倍频功能,这需要用于模拟电路,所以这一部分是在FPGA内部用硬件来实现的。
4 带嵌入式处理器的FPGA我们可以用FPGA中的普通可编程构造做的事情之一是,使用其中的一部分实现一个或多个软处理器内核。当然,你可以实现不同规模的处理器。举例来说,你可以创建一个或多个8位的处理器,加上一个或多个16位或32位的软处理器—所有处理器都在同一器件中。
如果FPGA供应商希望提供一个占用较少硅片面积、消耗较低功率但性能更高的处理器,解决方案是将它实现为硬内核。现在流行的ZYNQ,就是由赛灵思公司推出的,内部集成了ARM硬核的FPGA芯片。考虑下面所示这个例子:
图 3
这个芯片完全以硬内核方式实现的双路ARM Cortex-A9微控制器子系统(运行时钟高达1GHz,包含浮点引擎,片上缓存,计数器,定时器等),以及种类广泛的硬内核接口功能(SPI,I2C,CAN等),还有一个硬内核的动态内存控制器,所有这些组件都利用大量传统的可编程构造和大量的通用输入输出(GPIO)引脚进行了性能增强。
如果需要高速、高性能的处理器,并且需要实现逻辑编程时,传统的方法是在电路板上放置处理器(如ARM、DSP等)和FPGA,ARM或者DSP工程师实现软件部分,FPGA工程师实现可编程逻辑部分,两者协同合作。现在最新的方案,就可以使用ZYNQ一个芯片,以更低的功耗、更高的速度实现上面的功能。
如果是ZYNQ单芯片方案,是不是意味着只需要软件工程师或者FPGA工程师独立工作就可以了呢?笔者现时所了解的情况是:FPGA工程师负责搭建周边电路,如ARM的接口、时钟配置等,还负责可编程逻辑部分的开发。而软件部分仍然还是软件工程师负责。这主要原因是,FPGA逻辑开发和软件开发都是专业性比较强的技能,非常少的工程师能同时掌握这两个技能。当然,这里说的掌握性能,是专业性的、能应用到企业项目的技能,只是接触一下的不算。
5 编程方式FPGA是由存放在片内的RAM来设置其工作状态的,因此工作室需要对片内RAM进行编程。用户可根据不同的配置模式,采用不同的编程方式。FPGA有如下几种配置模式:
1、并行模式:并行PROM、Flash配置FPGA;
2、主从模式:一片PROM配置多片FPGA;
3、串行模式:串行PROM配置FPGA;
4、外设模式:将FPGA作为微处理器的外设,由微处理器对其编程。
目前,FPGA市场占有率最高的两大公司Xlinx和Altera生产的FPGA都是基于SRAM工艺的,需要在使用时外接一个片外存储器以保存程序。上电时,FPGA将外部存储其中的数据读入片内RAM,完成配置后,进入工作状态;掉电后FPGA恢复为白片,内部逻辑消失。这样FPGA不仅能反复使用,还无需专门的FPGA编程器,只需通用的EPROM、PROM编程器即可。