FPGA属于一类被称为可编程逻辑的设备,或有时被称为可编程硬件。
微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩(公众号专用,删)
1 简介
FPGA属于一类被称为可编程逻辑的设备,有时被称为可编程硬件。从本质上讲,FPGA本身不做任何事情,但它可以被配置成你想要的任何数字电路。这里的神奇之处在于,没有任何物理变化。你只需将配置加载到FPGA中,它就开始表现得像你想要的电路。没有焊接,没有跳线。然后,FPGA可以被重新配置成好几种电路的样子。因为配置是基于RAM的,这意味着它基本上可以被重新配置,且次数不限。
莱迪思iCE40 HX FPGA在Alchitry Cu板上突出显示(左)和Xilinx Artix 7 FPGA在Alchitry Au板上突出显示 (右)
虽然我们谈论使用FPGA来创建数字电路,但你通常不会为它绘制原理图来创建设计。如果你真的画出一个原理图,那么FPGA所能包含的电路的大小和复杂性将变得非常麻烦。相反,你可以描述你想要的电路的行为,而工具将利用这一点来创建一个符合该行为的电路。
在这个方面,由于你只是在输入文字,所以感觉就像编程。然而,由于你是在创建硬件,其基本实现方式是截然不同的。
用文字创建硬件看起来像魔术,但是不要担心,它的工作方式其实很简单,在本教程中,我们会把它分解清楚。。
2 建议阅读
在本教程中,我们会探讨什么是FPGA以及它工作的原理。这里我假设你对电力(电压、电流等)和二进制值有一定的了解,其他一切都将迅速建立在基础知识之上。
如果你对以下概念不熟悉,我们建议在继续之前先看看这些教程。
3 数字电路和逻辑门
数字电路
需要注意的是FPGA它只能创建数字电路。一些较新的FPGA包括板载模数转换器,但即使有这些转换器,也会尽快将模拟输入转换成数字信号。但什么是数字电路?
在电子学中,数字被用来描述将连续电压值抽象为离散的1和0的电路。实际使用的电压和阈值对于高层设计来说实际上并不重要,但是你经常会在FPGA内看到类似0V为0,1.2V为1的情况。如果实际电压是0.8V,那就足够接近于1.2V,被认为是1,一切工作都一样。
数字电路的设计是为了将电压推向极端,这使它对噪声和现实世界的其他干扰都具有难以置信的弹性。数字的概念也为我们提供了一种方法,可以将复杂的行为设计到电路中,而不必担心低级别的设计。我们可以在一个理想的世界里工作。在我们将使用的简单构件的设计中,细枝末节都得到了处理。
这些构件就是逻辑门。
逻辑门
有一些不同的逻辑门,但最常见的是AND、OR、XOR和NOT。每个逻辑门都接受数字输入,执行其逻辑功能,并输出一个数字值。
AND门接受两个输入,只有当第一个输入和第二个输入都为1时才输出1。如果任何一个输入为0,则输出为0。 AND门的符号看起来像这样:
一个OR门有两个输入,当第一个输入或第二个输入为1时,输出为1;只有当两个输入都为0时,输出才为0:
XOR门类似于OR门,只有当第一个输入或第二个输入为1时才会输出1,而当两个输入都为1时则不会。可以理解为在两个输入不同时输出为1。XOR中的X代表排他性。下面是它的符号:
NOT门是最简单的门。它有一个输入,并简单地输出与之相反的东西。因此,1变成0,0变成1。
有一些基本门的变体称为NAND、NOR和XNOR。这些都是简单的标准版本,其输出被反转。
就像所有的逻辑门一样,AND门可以使用晶体管来构建,以提供一些额外的信息。下面的图片显示了一个如何实现AND门的例子。该示意图使用了NMOS和PMOS MOSFET晶体管。这种类型的设计被称为CMOS(互补金属氧化物半导体),是大多数现代电路中所使用的。
请注意,上面的示意图实际上是一个NAND门,然后是一个NOT门。这是因为CMOS电路的输出是反转的。
4 多路复用器
现在我们有了从晶体管到逻辑门的基本构件,我们可以用它们做出更有用的东西。仅凭逻辑门,你就可以描述任何数字电路。但是,有许多重复出现的更高层次的功能会有自己的符号,如那些用于二进制数学的符号(加法器、乘法器等)。
我们要看一下FPGA的基本构件之一,多路复用器。
多路复用器根据其选择输入的值,从一组输入中选择一个。下面是它的符号:
sel线上的/用来表示它是6位宽。
输入的数量会有所不同,但多路复用器总是只有一个输出。
选择输入的编码方式会有所不同。通常,你会看到它是一个二进制数字,但更简单的电路使用独热编码。独热编码是一个简单的二进制值,其中总是有一个1,1的位置是最重要的。
解码器接收一个二进制值,并将其变成一个独热信号。编码器将一个独热值变成一个二进制数。这些可以用来使独热编码的多路复用器接受二进制值。
看看我们如何使用一些AND和OR门来实现一个独热编码的多路复用器。
如果我们把sel的值设为000010,也就是说只有sel[1]是1,那么我们可以看到每一个AND门,除了有b输入的那一个,都有一个输入是0,也就是说不管输入a、c、d、e、f是什么,每个都会输出0。唯一重要的输入是b。当b为1时,它与1相加,AND门的输出为1。当b为0时,它与1相加,AND门的输出为0。
换句话说,AND门的输出就是b。
这个原理图中的OR门显示有两个以上的输入。这可以通过创建一棵由两个输入的OR门组成的树来实现,其中两个输入被放在一起,然后输出被反复放在一起,直到你有一个输出。一个多输入OR门的行为就像你所期望的那样,如果任何一个输入是1,输出就是1。
然而,在这个电路中,除了输出为b的AND门的输入外,OR门的每个输入都被保证为0,这意味着当b为1时,OR门将简单地输出1,当b为0时,输出0。
换句话说,OR门的输出就是b。
你可以对任何输入重复这个逻辑,只要输入是独热的,与给定的1相对应的输入就会被传递到输出。
你可以想象有一个大型的多路复用器矩阵,有一个可编程的sel输入。这将允许你在设计中的任何地方对信号进行路由。这就是FPGA如何将信号送到它们需要的地方,它被称为一般路由矩阵。
显然,路由成千上万的信号的细节变得很混乱,但从根本上说,它只是使用了一堆多路复用器,其选择输入端连接到可编程存储器。
5 查询表
现在我们有了一种方法来动态地将信号送到它们需要的地方,我们需要一种方法来执行任意的逻辑。我们将再次使用多路复用器,或者说是它的后代,即LUT或查找表。
想象一下,我们有一个多路复用器,有四个输入和一个2位二进制选择(而不是独热)。现在,我们不要把主要的输入暴露,而是把它们连接到一些可编程的存储器。这意味着我们可以将每个输入编程为某个常量值。把这些都包在一个块中,我们就有了一个双输入LUT。
LUT的两个输入是多路复用器的选择输入。通过将多路复用器的输入编程为我们想要的东西,我们可以用这个LUT来实现任何二对一的二进制函数。
例如,我们可以通过设置存储器的内容,使它像一个简单的AND门一样工作。
这是一个简单的例子--通常LUT比只有两个输入要大,Alchitry Au上的FPGA是基于五个输入LUT的。
赛灵思实际上将两个五输入LUT与另一个多路复用器放在一起,以创建一个六输入LUT或一个具有两个独立输出的五输入LUT。
如果你想真正深入了解FPGA中的LUT和资源是什么样的,请查看Xilinx关于Artix 7的这份文件。这份文件的内容非常密集,不过第20页值得一看,它显示了一个SLICEL的简化示意图。切片是LUT之上的一个构件。左边的四个盒子是LUT,如上图所示。
为了了解一些情况,Alchitry Au上的FPGA有20,800个双LUTs。这是一个很大的LUT,但还没有接近现有的最大的FPGA,在写这篇文章的时候,它有大约260倍的LUT。你可以想象,仅所有这些信号的路由就非常复杂。幸运的是,要使用FPGA,你不需要做任何这些事情,工具会处理所有的低级路由和LUT编程。我们只需要描述我们想要的电路。
6 为什么使用FPGA?
当这个问题出现的时候,通常是在选择使用处理器还是用FPGA创建一个定制设计的背景下出现的。很多人知道如何编码,但了解如何为FPGA创建设计的人比较少。编写代码通常更容易创建复杂的行为,也更容易大幅度地改变某些东西的实现方式。
在处理时间方面,FPGA的效率要高得多,而且可以提供非常严格的计时。为了说明这一点,让我们看一个微不足道的例子:当你按下一个按钮时,打开一个LED。如果你用Arduino之类的东西编写代码来做这件事,处理器将运行一个小的代码循环,读取一个引脚的状态,然后根据这个值更新另一个引脚的状态。
如果你对代码进行优化,你可能会让它每秒更新数百万次。这听起来很好,但让我们看看它在FPGA上会是什么样子。在用FPGA简单地连接一个按钮和一个LED的情况下,你只需连接按钮和LED。来自按钮的值通过一些输入缓冲器,被送入路由矩阵,然后通过输出缓冲器输出。这个过程一直在持续发生。唯一的延迟来自于芯片中晶体管的开关延迟,而这些延迟小得可以忽略不计。
为了扩展这一点,现在我们在设计中加入一个麦克风。我们可以从麦克风中获取样本,并对其进行一些处理,以弄清捕获的音频中的频率。根据一些第一手的经验,我们知道这在一个小型微控制器上很难以任何像样的采样率实时完成。处理器需要从麦克风中读取样本,将其存储在一些缓冲区中,执行一系列的数学运算,然后将数值输出到LED显示屏上。这些步骤中的每一步都需要时间,而处理器一次只能真正做一个。
有了FPGA,你可以将设计的一小部分用于从麦克风中读取样本,然后将样本交给一个缓冲器,当缓冲器满了之后,将它们交给一个进行计算的电路。然后,该电路可以将结果交给另一个电路,该电路将在一些LED上显示它们。
这些阶段中的每一个都会完全独立运作,因为它们只是存在于硬件中,它们并不是争夺处理器时间的代码行。
现在想象一下,我们仍然希望将按钮连接到LED上。我们之前壮观的百万分之一秒的响应时间现在变成了糟糕的五分之一秒,因为我们不能抽出处理器的时间来频繁地读取按钮。然而,在FPGA中,按钮和LED仍然只是连接在一起,并以接近瞬时的速度响应。
这种独立性使得FPGA成为控制任何需要严格计时的东西的绝佳人选。例如,WS2812B LED(又名NeoPixel)需要一个严格计时的脉冲流来向其写入数据。当你使用一个微控制器时,你通常需要写一些内联汇编,以使脉冲的时间足够精确。你还需要禁用中断,因为任何停顿都会对信号产生不利影响。
有了FPGA,创建一系列严格控制的脉冲来驱动这些LED是很简单的,你不需要担心你的设计中的其他东西与时间冲突。
7 何时使用FPGA
鉴于使用FPGA的所有优点,你可能会问自己:"为什么我不把它用于所有的事情!"很好的问题!
在描述FPGA的工作原理时,你可能已经注意到有很多额外的 "东西 "需要动态地实现,即使是最简单的电路。这并不是没有代价的,我指的是金钱和设计资源的代价。
FPGA往往很昂贵。较大的FPGA每块芯片的价格很容易达到数万美元。这是由于制造它们需要大量的硅,设计芯片和工具需要大量的RnD,而且与手机中使用的微小处理器相比,其产量相对较低。
另一个成本是功率。与直接实现电路所需的数量相比,LUT中使用了大量的晶体管。所有这些晶体管都需要电力来运作。正因为如此,FPGA往往是电池操作设备的不良候选者。当然,你可以把你的电路设计得很省电,但是即使什么都不做,Alchitry Au上的FPGA也要消耗100mA多一点。如果你开始推动该芯片,你可以很容易地得到超过1000mA。作为比较,Arduino Leonardo上使用的芯片ATmega32U4,在全速运行5V时消耗27mA。当然,Alchitry Au的能力大大增强。
那么,为什么要使用FPGA呢?你有两个主要的选择来创建一个定制的数字电路。首先,你可以自己用分立逻辑来构建它。这将需要大量的时间,可能花费更多的钱,而且如果你需要改变一些东西,也没有什么灵活性。
第二种,也是更现实的选择,是直接在硅中创建电路。这可以创造一个非常快、非常有效的电路,但代价是灵活性为零,并且需要花费大量的金钱。定制硅有巨大的前期成本与工具和设置有关。虽然每个芯片的增量成本会比单个FPGA低。然而,除非你要制造数万个芯片,否则总体上会更昂贵。即使如此,有时将你的设计锁定在硅中也是没有意义的。有了FPGA,你可以在需要的时候改变它。
由于FPGA的灵活性和与其他替代方案相比的低成本,FPGA为在几乎所有的设计中添加自定义数字电路打开了大门。但是,您真的需要定制电路吗?
重要的是要记住,FPGA就像任何其他工具一样。锤子用来钉钉子很好,但用来拧螺丝却很糟糕。就像试图用螺丝刀来钉钉子一样,是相当徒劳的。
创建定制电路可能很困难,你经常需要问自己是否有更好的解决方案。有许多能力很强的处理器,有大量的外设,可以处理你需要解决的大部分问题。试图通过WiFi发送和接收数据这样的事情,用FPGA是一项艰巨的任务,但用ESP8266这样的几美元的微控制器就可以轻松完成。
我经常把FPGA描述为一条装配线。装配线上的每个工位都是相互独立工作的,它们在设计上的效率令人难以置信。然而,最初设置流水线可能很困难,如果你想做重大改变,通常从头开始更容易。
另一方面,处理器就像人一样。只要有足够的时间和培训,一个人就可以完成几乎所有的任务。复杂的顺序性任务对一个人来说很容易完成。
就像你真的想建立一个完整的三明治制造厂,只是为了给你的午餐做一个三明治吗?
FPGA是令人惊奇的,对于它们擅长的任务来说往往是不可缺少的,但它们只是添加到你的工具箱中的另一种工具,一个非常强大和值得投资的工具,但仍然只是另一个工具。
推荐书单
《项目驱动零起点学Java》
《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。
《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。
马士兵,马士兵教育创始人,毕业于清华大学,著名IT讲师,所讲课程广受欢迎,学生遍布全球大厂,擅长用简单的语言讲授复杂的问题,擅长项目驱动知识的综合学习。马士兵教育获得在线教育“名课堂”奖、“最受欢迎机构”奖。
赵珊珊,从事多年一线开发,曾为国税、地税税务系统工作。拥有7年一线教学经验,多年线上、线下教育的积累沉淀,培养学员数万名,讲解细致,脉络清晰。
精彩回顾
微信搜索关注《Java学研大本营》(公众号专用,删)
访问【IT今日热榜】,发现每日技术热点