FPGA是啥?你要是在百度上一查,多数会搜到什么 Field Programmable Gate Array,现场可编程门阵列嘛,但是这句话对咱们新手理解FPGA起到的作用十分有限,其实不单是新手朋友,就连我这个玩了几个月的FPGAer也不求甚解,我脑海里隐隐约约的印象就是:
FPGA是一堆数字积木,你可以用他来搭建任何需要的数字电路。
这个概念伴随了我很久,直到我看了一本关于FPGA结构的书,虽然是走马观花地浏览了一遍,但还是给了我一些启发,今天特写一篇博客记录一下我的一些感悟。
先来总结一下FPGA的基本组成:
上图给出了一个岛型结构的FPGA,可以看出FPGA的组成有实现任意逻辑的软逻辑块(soft logic、不同厂家对此称呼不同,例如Xilinx称为CLB,Confugurable Logic Block;Altera公司将其称为LAB,Logic Array Block)、位于芯片四周的输入/输出要素(IOB)、布线要素(开关块SB、连接块CB、布线通道),同时我们看到FPGA内部还有乘法器块和存储器块等硬逻辑,最基本的FPGA结构就包含上述的要素。
FPGA属于PLD,即可编程逻辑器件的一种。
我们学过数字电路可以知道,数字组合逻辑实现的方式有许多种,你可以化简,或者不化简,但是条条大路通罗马,不同结构的电路也能实现相同的逻辑功能,因此在这个背景下,PLD的实现方式可谓是五花八门,比如基于乘积项的实现,基于查找表的实现,基于数据选择器的实现等等,如今我们使用的FPGA主要是用一种结构来进行任意逻辑的实现,那就是查找表。
入门的大家伙不知是否被各种教材以及综合后的电路图忽悠地认为FPGA是真的实现了Verilog描述的由与或非逻辑以及D触发器等原件组成电路图呢?、
从FPGA的实际结构上看,这样的观点是不正确的。
FPGA的核心,可编程逻辑的实现其实是由上面这个小小的的单元:查找表来实现的,根本就没有什么与或非的门级电路,就更不要说有人还想在FPGA上写写晶体管级的代码了。
查找表是基于SRAM实现的,其实说白了就是一块RAM内存,把输入当成地址,输出当成存储在里面的数据,对应一个输入(地址),就送一个输出(数据),以此实现任意逻辑的功能,毕竟,一个三输入的逻辑电路只有最多八个结果,一个四输入的逻辑电路最多只有十六个结果。
更通俗易懂的解释就是,好比一场考试,专用集成电路ASIC会认认真真把题目(对应输入)地从头到尾解出来(通过与或非逻辑门),而FPGA则更像打好了一份小抄(LUT中存储的数据),对着题目(对应输入)去找答案。
所以其实各个FPGA的开发工具在实现时所做的工作就是根据Verilog描述的逻辑,把结果都预先算出来,下载比特流的时候就把答案烧录进FPGA的LUT当中。
如果要实现时序逻辑的话,就在后一级套一个D触发器,如上图所示,最后用选择器选择输出时序逻辑还是组合逻辑。
了解了LUT的原理以后,我们能得到什么启发呢?考试前要打好小抄?NONONO!
第一个启发是解释了为什么FPGA掉电之后逻辑会消失,因为LUT是基于SRAM,RAM的特性就是掉电易失。
第二个启发是关于LUTRAM和LUT之间的换算关系。有时候我们需要在片内存储数据,一般我们有专用的硬存储器模块,BRAM或者URAM存储,但是如果数据量较小,或者数据太大以至于硬存储模块都使用完了,这时候我们就需要使用LUTRAM来进行数据存储了。
之前我们提到过,3输入的LUT可以存储八个Bit,4输入的LUT可以存储16个Bit,这样我们可以得到一个朴素的换算关系:
N输入查找表能存储Bit数据
上述的看法是我个人的一些朴素的观点,现代FPGA结构日新月异,其中设计的奥妙不是通过我这三言两语能够讲清楚的,但上面的朴素理解对于我们FPGA工程师来说至关重要,就好比计算机组成对于优秀程序员的作用一样,我们不是专业制造FPGA,但我们一点要在心里对FPGA有一个核心的认识,这就是所谓学习的哲学。