• 从结构上浅谈FPGA实现逻辑的原理


             FPGA是啥?你要是在百度上一查,多数会搜到什么 Field Programmable Gate Array,现场可编程门阵列嘛,但是这句话对咱们新手理解FPGA起到的作用十分有限,其实不单是新手朋友,就连我这个玩了几个月的FPGAer也不求甚解,我脑海里隐隐约约的印象就是:

    FPGA是一堆数字积木,你可以用他来搭建任何需要的数字电路

            这个概念伴随了我很久,直到我看了一本关于FPGA结构的书,虽然是走马观花地浏览了一遍,但还是给了我一些启发,今天特写一篇博客记录一下我的一些感悟。

            先来总结一下FPGA的基本组成:

    基本组成要素

    • 可编程逻辑要素 :实现逻辑电路需求的电路,有乘积项、查找表和数据选择器等
    • 可编程输入/输出要素:连接IO引脚和内部布线要素的模块,通常包含上拉、下拉、输入/输出方向和极性、转换速率、开漏等功能的控制电路,以及触发器等数据存储电路。
    • 可编程布线要素:连接前两种要素

             上图给出了一个岛型结构的FPGA,可以看出FPGA的组成有实现任意逻辑的软逻辑块(soft logic、不同厂家对此称呼不同,例如Xilinx称为CLB,Confugurable Logic Block;Altera公司将其称为LAB,Logic Array Block)、位于芯片四周的输入/输出要素(IOB)、布线要素(开关块SB、连接块CB、布线通道),同时我们看到FPGA内部还有乘法器块和存储器块等硬逻辑,最基本的FPGA结构就包含上述的要素。

    软逻辑的核心:LUT查找表

            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输入查找表能存储2^{^{N}}Bit数据

    结语

            上述的看法是我个人的一些朴素的观点,现代FPGA结构日新月异,其中设计的奥妙不是通过我这三言两语能够讲清楚的,但上面的朴素理解对于我们FPGA工程师来说至关重要,就好比计算机组成对于优秀程序员的作用一样,我们不是专业制造FPGA,但我们一点要在心里对FPGA有一个核心的认识,这就是所谓学习的哲学。

  • 相关阅读:
    React报错之Expected `onClick` listener to be a function
    Apache Shiro反序列化漏洞研究及解决方法
    面试突击90:过滤器和拦截器有什么区别?
    成为 Java 顶尖程序员之前,先过了下面问题才行
    百望云携手华为发布金融信创与数电乐企联合方案 创新金融合规变革
    docker 部署 clickhouse
    精益(Lean)与ERP实施
    7.使用多线程时,要注意哪些场景?经验之谈
    深入理解.Net中的线程同步之构造模式(二)内核模式4.内核模式构造物的总结
    【Python】 Python 文件与路径处理
  • 原文地址:https://blog.csdn.net/weixin_54358182/article/details/127909105