图8 :二选一多路选择器的真值表
根据数字组合逻辑电路的设计方法,首先做出布尔表达式,经过化简,得出简化后的布尔表达式,最后做出电路。
如果需要一个二选一多路选择器的等效电路,不关心内部是如何实现的。那么我们设计时,只需要考虑实现真值表的功能即可。当我们把真值表看做查找表时,A、B、S都是输入,任意指定一组值,都可以得出后面对应的Y即可。
下面解释一种器件:存储器。
存储器(Memory)是现代信息技术中用于保存信息的记忆设备。它根据控制器指定的位置存入和取出信息。
图9 :存储器模型
存储器中被分为了很多“小格子”,每一个“小格子”里面都可以放下很多的二进制数码。每个小格子都会有自己独特的标识,就像我们的门牌号一样,每个屋都是不同的。逻辑功能是当外部输入一个“门牌号”,对应的“小格子”里面的二进制数码就会输出。
存储器中的“小格子”的数量,在制造时,就已经确定。“小格子”的数量确定了,那么“门牌号”的形势也就被确定了。例:我们有100个房间,我们只有两个十进制的数码就可以表示了,00至99。在存储器中,“门牌号”也只能用二进制数来表示,例如:有4个“小格子”,那么“门牌号”就要用两个二进制码来表示,00~11。每个“小格子”里面存放的二进制数的个数,在制造时,也就确定好了。
通常我们把“门牌号”称为地址,“小格子”称为单个地址的存储空间,每个“小格子”能放下的二进制数码的个数称为“存储器的存储位宽”。
制作一个拥有8个地址,单个地址空间为1个二进制数码的存储器。此时,地址码应该有三位,每个地址对应的存储二进制数码 的个数为1个。要求:000地址中,放入0;001地址中,放入0;010地址中,放入1;011地址中,放入1;100地址中,放入0;101地址中,放入1;110地址中,放入0;111地址中,放入1;
图10 :存储器示意图
按照我们存储器的逻辑功能,给与地址,存储器就会给出对应地址中所存放的数据。那么存储器的功能表如下:
图11 :存储器的功能表
将存储器的功能表图11和二选一多路选择器的真值表图8相对比,我们会发现,除了自定义的信号名称不相同外,逻辑功能是相同的。那么也就是说,在黑盒设计时,我们可以将一个带有预设值的存储器放进去,它所对外的功能,也是可以实现二选一多路选择器的。此时,我们可以带有预设值的存储器可以等效为二选一多路选择器。
仔细观察,我们发现,任意真值表都可以用存储器来等效。那也就是说,存储器电路可以等效为任意组合逻辑的电路。
存储器电路的优势:不用做任何逻辑化简,不受基本逻辑门电路的样式限制,可以很快的得出最终的电路功能。如果存储器可以任意修改预设值的话,那么同一个存储器就可以随着不同的预设值等效为各类的电路。如果是基本门电路构成的话,就需要受到数量和样式的限制。
存储器电路的劣势:对于简单的门电路,用存储器实现是一种浪费。存储器电路也是一种相对复杂的电路。另外存储器电路的延迟一般偏大,原因同上。
在做数字组合逻辑电路设计时,如果采用门电路的设计方式,需要更新电路功能时,就需要重新布置电路结构,更换基本电路元器件;如果采用存储器等效的设计方式,只需要更改预设值即可。这种方法为我们做电路升级提供了一个很好的解决途径。
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
在介绍FPGA芯片结构之前,首先就FPGA和单片机做一个简单的对比。
单片机是一种微处理器,类似于电脑CPU。它的电路是固定的,是通过软件编程语言描述软件指令控制微处理器进行工作;它的所有指令都是微处理器顺序执行的;
图12 :某单片机结构图
FPGA是一种半定制电路。它的电路也是固定的,但是可以通过硬件编程语言描述电路功能,重新配置电路功能,得到我们想要的电路的等效电路;它的所有功能都是利用电路来直接实现的,所有的功能都是可以并行执行。
图13 :与门逻辑功能示意图
要求实现两路信号的与操作,将结果作为一路信号输出。那么在单片机中和FPGA中都是如何实现此功能的呢?
在单片机中,假设我们已经将对应的变量和引脚已经分配结束。我们会编写如下一段代码:
CPU会首先去读取A管脚的电平值,放入到自己的通用寄存器。然后读取B管脚的电平值放入到自己的通用寄存器。然后将两个电平值进行相与,结果写入通用寄存器。最后将存放结果的通用寄存器的值存入到Y管脚对应的寄存器。每一步都需要很久的时间。
在FPGA内部会形成一个存储器的等效电路(与门),直接将A管脚电平和B管脚的电平相与的结果用线连接到Y管脚了。
有些人可能不太明白,觉得这两个是相同的。都是取两个电平,然后把结果输送出去。不一样的地方有两个:
第一:单片机执行是顺序的,也就是说,每个时刻只能做一件事情。假设A管脚被取完电平后,突然降低一段时间,然后又拉高了。但是此时CPU去取B管脚电平或者输送结果到Y管脚了。那么整个设计将不会察觉到A管脚被拉低了一段时间。在FPGA中,都是直接线连接的,没有任何控制逻辑,任何的变化都会直接反映到电路的结果上。
第二:由于单片机的执行时顺序的,也就是有一个时间表,每一个时刻干什么规定好的。而FPGA是纯逻辑实现,每时每刻所有的电路都在工作。速度上要比单片机快很多。
所以FPGA的本质实现是靠自己的逻辑功能电路来实现,单片机是靠控制CPU,让CPU单个控制各个逻辑功能电路顺序实现的。
在数字电路基础中,我们知道,所有的数字电路都是由组合逻辑和时序逻辑构成,而时序逻辑是由组合逻辑和时序逻辑器件构成。所以数字电路是由组合逻辑和时序逻辑器件构成。
电路的重新配置按照现在的技术还实现不了。例如:有一个asic,现在想要他换一种功能,这是现在实现不了的,因为其中的电路是固定的,并且没有重新配置的功能。
如果想要电路能够重新配置,在上一节中叙述存储器等效电路时,我们了解到存储器电路预设不同的值是可以完成不同的电路功能。
在FPGA中,由一定的存储器等效电路和时序逻辑器件构成最小单元。那么此单元可以被配置成为组合逻辑、时序逻辑。
图14 :CYCLONE IV E 可编程最小单元示意图
CYCLONE IV E是INTEL FPGA中CYCLONE系列的第四代。在上图中,四输入查找表(Four – Input LUT)其实就是一个有16存储空间,每个存储空间只有1个二进制数字的存储器,LUT(Look Up Table)就是查找表。设置合理的预设值,就可以实现一定的数字组合逻辑电路功能。
那为什么要固定为16存储器空间呢?如果我们要实现一个5输入的与门,那16个存储空间就不够用了。那么此时我们应该怎么办?
其实也很简单,只需要将5输入的与门分为一个四输入的与门,然后把结果和另外一个输入进行相与即可。对于存储器电路也可以这样做。
如果可以级联的话,那么做成2输入的是不是也可以的。原则上是可以的,但是如果我们实现的逻辑功能比较复杂的话,那么就会级联特别长,延时就会很大。那做成1000输入的话,是不是就好了,再复杂的话,都不用级联。可是在设计时,我们做的不仅仅是复杂逻辑,还有很多的不复杂的,那么一个二输入与门的设计也要占用一个1000输入,那就得不偿失了。所以经过衡量,最终设计者将输入做成了4输入的查找表。
经过不断的发展,FPGA在各个场合的应用越来越多,所做的设计越来越复杂,要求的延迟越来越小。于是新出的FPGA系列拥有更多的输入查找表。
在图2-14中,后面还有一个时序逻辑器件。这个时序逻辑器件是FPGA厂商直接做到FPGA内部的,我们设计电路时,不需要设计,只需要调用出来即可。
由此,我们就可以实现组合逻辑和时序逻辑的一个小部分了。但是复杂的设计,往往是需要级联的。
图15 :CYCLONE IV 中结构示意图
LAB中包含了很多最小可编程单元,这些可编程单元完成电路的一部分功能。然后通过各种interconnect(连线)互联,最终实现我们想要的复杂的逻辑功能。
通过可编程单元和连线资源就可以完成各种电路功能,但是最终还是在芯片内部,为了能够和外部的芯片进行通信,一定会需要IO单元。