想必各位读者中有不少是玩过Arduino、单片机或者是做过一些模拟电路制作的吧? 在玩过这些东西之后,经常会有的一个疑问就是,下一步玩什么?一部分人选择更加复杂的东西,比如32位单片机(如STM32)或者研究嵌入式Linux(如以“树莓派”为代表的超小型计算机),而另一部分人则是选择尽可能利用已经会的东西,做出一些有意思的制作。如果是前者,那么相信,这个所谓的“更复杂的东西”的列表里,一定会有FPGA。这个系列的文章,就是希望帮助那些已经有一定电子制作的基础,想要了解或者学习FPGA,却无从下手的人,当然可能对于正在学校学习FPGA的学生也会有一定的启发作用。本文作为这个系列文章的第一篇,先对FPGA以及相关的内容做一个概述。

如果从来接触过FPGA,那么可能直觉上会认为FPGA是一种很厉害的单片机(MCU),毕竟它看起来也就是一个体积比较大的芯片,开发板看起来也就和单片机开发板一样,甚至开发板自带的教程也像单片机的教程一样,把开发板上面自带的外设全部玩一遍。然而,实际上根本不是这样,FPGA并不是单片机,而且这两者甚至很难具有可比性。通常而言,玩单片机是玩软件编程,而玩FPGA是玩硬件编程。要了解FPGA的含义和用途,还要先从它的功能开始。

FPGA有什么功能?

首先我们来考虑一个问题。现在有一个LED,有一个按键,要实现按下按键点亮LED,应该怎么做呢?答案很简单,把电源、LED和按键全部串联在一起就行了。按下按键,电路接通,LED就会点亮。要用单片机来实现这个效果,基本的思路就是使用一个死循环,不停读取按键输入,然后把结果输出到LED。听起来用单片机完全就是多此一举嘛。那么现在来修改一下需求,有两个按键,要实现现在正好两个按键都按下或者都松开的情况时候点亮LED。用单片机来做并不需要做太多的修改,只需要在循环当中加入一些判断语句即可。如果这种情况下,还需要不使用任何芯片来控制LED,就不是连几条线的事情了。那么是不是说明单片机非常适合做这类的事情呢?其实并不是。考虑一下,如果这只是单片机需要做的事情的一部分,假如单片机还需要进行其他的处理,比如需要控制数码管刷新,也需要不断循坏。当很多这种需要不断循环的东西放到一起时,程序就不那么容易实现了,而且受限于单片机的性能,各个任务的响应速度也会受到影响。

那么有没有除了单片机以外的,更加直接一些的方法,用来实现以上的简单任务呢?比如有没有什么东西,正好有两个输入和一个输出,当且仅当两个输入全部为高或者全部为低的时候,输出高电平呢?答案是肯定的。有一种芯片,叫做74LS86,正好可以实现这个功能。功能类似的芯片还有很多,这类芯片就叫做逻辑们芯片,或者我们常说的74系列芯片(74是主要的逻辑芯片系列,但是也有很多其它系列的逻辑芯片)。他们的内部通常并不复杂,只有数量较少的三极管或者场效应管而已。有了这种芯片,电路设计就十分容易了,把按键接上74LS86的输入,把LED接上74LS86的输出,就能得到需要的效果。当然,如果有更多事情要做,就得加入更多的芯片了,因为单片74芯片通常只能实现非常有限的功能。而且,可想而知,不可能针对每一种特定的应用都会有特定的芯片,这样成本也太高了。也正是这个原因,才会有单片机这类的可编程器件,可以随时修改其实现的功能以满足不同的需要。似乎绕了一圈又回到了原点,并没有解决之前提到的问题,反而是带来了更多的问题。也确实不奇怪,发明单片机的一个目的就是代替一部分用74芯片实现的电路。

所以现在就轮到FPGA出场了。FPGA也是一种可编程器件,但是它并不是像单片机一样执行程序来实现具体的功能,而是像74芯片一样,直接通过电路连接来实现需要的功能。你可以把FPGA当作一片包含成千上万颗小的74系列芯片的大芯片,而这些小74 的连接方式和逻辑功能都是可编程的,考虑之前讲的单片机实现更多功能会降速的问题,在FPGA上,实现更多的功能只是相当于在里面放入了更多的74芯片,互相是独立的电路,并不会造成什么影响。不过需要注意的是,上面说的都是简化的模型,和实际情况会有一定出入。

听完上面的概述,你可能会觉得,实现这些逻辑功能听起来并没有什么用啊?谁没事去点LED呢?确实,单独的逻辑功能本省并没有太大的用处,甚至可能,按照一般的大学课程,学了一年的逻辑电路也没能体会到这些逻辑电路究竟能做什么。然而,逻辑功能的组合实际上是非常灵活的东西,可以实现非常多不同的功能。比如说,之前提到的FPGA和单片机的对比,你甚至可以在FPGA里面完整实现一个单片机。这并没有什么奇怪的,毕竟单片机本身就是用许许多多的逻辑门搭出来的,也就是个复杂的逻辑电路。FPGA如果能实现各种逻辑电路,自然也可以实现一个单片机。在工业应用中,FPGA通常被用于实现接口协议、数据转发一类的通信设备,也被用于进行IC设计验证。不过近年来的另外一个热点是将FPGA用于通用计算,比如神经网络模拟,但是就目前而言,FPGA相比于传统的CPU、GPU方案还并没有明显的价格优势。

FPGA与单片机有可比性吗

所以,FPGA和单片机到底能不能比呢?从他们的本质来说,这两者应该完全不具备可比性,就好比你无法比较CPU和操作系统哪个好一样。然而FPGA和单片机都可以实现控制和计算的功能,而且也确实都是通过写代码来编程的,目标应用也有一定重合,所以从这个角度来说又有一定的可比性。但我们需要知道,FPGA和单片机是两者完全不同的东西,总体来说很难讲优劣,只能说各有所长,各自适用于不同的应用场景。

学习FPGA有什么意义?

最后,学习FPGA对于爱好者而言有什么意义呢?我觉得最大的意义还是在于挑战自己。毕竟作为玩家,自己能够做到的事情比较有限,想要做出什么真正实用的东西并不容易。但是如果只是为了玩,也就大可不必去追求所谓的实用意义。如果这样说的话,FPGA大概会是一种很好玩的东西。一来是利用FPGA可以做到一些单片机不容易做到的东西,二来呢就是这个挑战本身了。就像硬核游戏玩家喜欢血缘诅咒这样的高难度游戏,也许也会有爱好者因为难度而喜欢玩FPGA的吧?这里就列举几款爱好者使用FPGA制作的有趣的作品。

1540158105816-8137c2ece942fcf6ca9be821150e60ee97cc1c93.jpg@1320w_990h.jpg

(由f4hdk制作的A2Z FPGA计算机)

1540158102760-c469d1376af5c70bd000bbeed7fd17cf0688626d.jpg@1320w_1102h.jpg

(由Ian Hanschen制作的FPGA LED点阵控制器)

关于本教程

在接下来的文章当中,我将一步步的教大家如何用FPGA制作一个Game Boy兼容的游戏机,大体涉及的内容,从购买开发板,到数字电路基础,再到Verilog,计算机组成原理,一直到最后GameBoy的实现。不知道各位读者对于这个也没有兴趣呢?如果有兴趣的话,那就不要错过下一期的教程啦。最后附上一些,为了跟着本教程学习你首先需要知道的基础。

需要知道的:

  • 如C/C++/Java/Rust等传统静态语言的编程,包括其中涉及到的基础,比如二进制和十六进制数的表示
  • 基本的计算机概念,什么是CPU,什么是RAM,什么是ROM等
  • 面包板的使用,简单的电路连接(理解按钮、拨码开关、LED、数码管等的作用)
  • 单片机或者Arduino等微控平台的使用(提供对如串并口传输一类的基本认识)

不需要预先知道,会在教程里讲到的:

  • Verilog或者VHDL的编程经验
  • 汇编语言的编程经验
  • 数字电路基础
  • 计算机组成原理基础
  • 计算机图形学基础

最后,感谢阅读,我们下期见

本文仅发布于《无线电》杂志、Bilibili专栏(@WAA-ZephRay)及我的博客(zephray.me),禁止转载或摘编,谢谢。