一位人品好到爆的朋友发了九张美食照片,自然是点赞无数,少不了还有许多朋友的赞美评论。这些赞美,在厨艺渣渣如我的电子学老师看来,除了悄悄咽口水,还可以作为数字逻辑的好教材,用来说明一个逻辑学的定理:任何复杂的逻辑关系式,都可以分解成为一个多项式。逻辑关系式的这种性质,是人们设计“万能”数字逻辑器件的基础。
谈到“万能”,大多数读者的第一反应恐怕是以为我们在卖“大力丸”。我们使用逻辑器件来生成数字逻辑,而大家需要的数字逻辑关系式又是千变万化的,如何能够让一种逻辑器件来满足不同用户千变万化的需求呢?这其实是近几十年来,电子工程和计算机技术所面临的一个不可回避的问题。
在这篇文章中,我们首先回顾一下近二三十年半导体电子学器件发展的脉络,以此理解这个问题产生的原因。然后讨论解决这个问题的若干个思路与方案。在众多解决方案当中,现场可编程门阵列(FPGA)发展得相对比较成熟,实现门槛比较低,因而得到比较广泛的应用。
集成电路的工艺在不断地进步,我们可以集成到一个芯片上的晶体管的数量越来越多。可这也给设计人员带来了烦恼,这么多晶体管让它们干什么呢?在集成电路发展的初期,人们将晶体管组合成为一些常用的逻辑单元,比如与门、或门、寄存器等等。每一个集成电路片当中,放置若干个这样的功能模块。模块的输入与输出端通过引脚接到集成电路外部,用户通过印刷电路板,将这些端口连接,组成需要的逻辑电路。
随着集成电路的制造工艺与技术进一步发展,人们能够把更多的门电路,寄存器等功能模块放到同一个芯片当中,但这些模块之间又该怎样连接呢?如果按照张三(A用户)的需求连接,这个集成电路片就很难卖给李四(B用户),即使找到A与B用户都能接受的方案,又很难满足王二麻子(C用户)的需求。这个矛盾,随着集成电路的集成度逐步增高,变得越来越突出。
大家可能会说,这还不简单,每个用户按照自己的需求设计自己的集成电路就可以了嘛。这的确是一个解决方案,这种用户根据自己需求设计的集成电路叫做ASIC(Application Specific Integrated Circuit,专用集成电路)。在工业界,我们看到很多厂商都为自己的产品设计专用的集成电路,用来实现各种智能控制,通讯,计算等功能,甚至用在儿童玩具当中。
集成电路这种东西,批量生产时每一个集成电路片的成本并不太高。但是制作光刻掩模,调整设备,设定工艺参数等一次性成本非常高。因此,只有在大批量生产的情况下,才能将一次性成本分摊开,实现经济上的可行性。
在科学研究领域,各种实验装置大多数情况下都不会复制成千上万套,因而往往用不起专用集成电路。仅仅在核物理,高能物理当中,由于探测器需要很多通道,因此探测单元信号的放大,处理以及数字化的功能有一定的可能用专用集成电路来实现。
除了在科研领域,即使是在工业界,对于逻辑电路也存在很多小批量的需求。这种需求,促成了“万能”或者通用的可编程逻辑器件的出现。
回到朋友圈里的九张美图,我们可以详细地分析一下这些赞美的评论。这些赞美,每一条都可以看成一个复杂的逻辑关系多项式中的一项。这个多项式中的每一项,是用“与”(and)运算连接起来的输入变量。而所有这些项又由“或”(or)运算连接成为多项式。此外,多项式中某些输入变量可能会先经过一个“非”(not)运算然后再参与其它运算。
比如前面朋友圈的评论就可以写成如下逻辑多项式:好吃 = (烙饼 and 大葱 and 小米粥) or (蘑菇 and 小鸡) or (红油辣子 and (not(螺狮 and 面条)))。复杂逻辑关系式能够分解为多项式,这个数学结论为我们设计通用逻辑电路器件指出了方向。
FPGA的前身:PAL与GAL人们最早开发的通用逻辑器件:可编程阵列逻辑(PAL)就是基于前面谈到的逻辑多项式性质设计的。
一个PAL器件可以接收多个逻辑电平输入,每个输入信号驱动两路纵向信号线。一路保持原有逻辑电平,输入为高电平时,输出也是高电平,而当输入为低电平时,输出也是低电平。第二路信号通过一个反相器,将逻辑电平翻转,输入为高电平时,输出变成低电平,输入为低电平时,输出为高电平,也就是说,对输入信号作了“非”运算。
FPGA的构造前面谈到的可编程阵列逻辑器件仅仅能在一定的限度内实现万能的逻辑应用,有时候,比如当逻辑关系多项式的项数超过8个,现有的器件就不能适应了。这就需要我们寻找更加万能的逻辑实现方法。此外,现代的PAL或GAL器件虽然理论上可以擦除原有的内容重新编程,可是实际上一旦焊到电路板上,要想修改,就得把它们烫下来,重新编程,再重新焊回到电路板上,非常麻烦。
因此使用PAL或GAL这类器件基本没有后悔药可以吃。而当一个器件中晶体管数量进一步增加后,没有人能一次就把复杂的逻辑功能设计对,这就需要为用户提供后悔药,让器件可以在焊到电路板上之后仍然可以随时重新编程与设置,也就是说,要做到现场可编程。于是人们就设计出了现场可编程门阵列(field-programmable gate array, FPGA)器件。
这种更加万能的逻辑实现方法是基于查询表(LUT)的,几乎所有主流FPGA产品都是用查询表来实现逻辑功能的。大多数FPGA产品里用到的查询表包括四根或六根输入线,一根输出线。在实际器件中,每一个查询表的后面都有一个寄存器(DFF),组成一个逻辑单元。这个寄存器的作用,是将查询表输出的逻辑电平暂存,然后送到下一级的逻辑单元。
这样,我们在FPGA中就可以组成多个层级的逻辑处理流水线,通过一定的时序,实现更加复杂的逻辑或计算功能。
FPGA与微处理器的异同有的读者可能会质疑,投票表决这样一个事为什么要这样复杂呢?一张票一张票地数一下不就行了吗?这是一个很好的问题,它揭示了微处理器技术与可编程逻辑器件技术这两大领域中思维方式的不同。
一张张地数,是微处理器的做法,其特点是,将一个复杂的功能拆解成许多步骤,每个步骤的处理却非常简单。这样做虽然比较麻烦,但可以很方便地将多个数据计算或逻辑处理功能并行实现,因而处理速度可以比同等的微处理器快。
FPGA的实际应用在科学实验当中,FPGA可以适应很多不同的应用需求。当然,它的应用也多少有点儿门槛,不过这个门槛相当低。一个用户在电脑上下载安装一个编译软件,再花200美元左右买个验证板,就能做很多事情。期待这篇文章,能帮助需要的读者跨过应用的门槛。