神奇的0和1,缘何能够如此的变化多端?从某种意义上看,无非就是数字本身固有的各种各样的逻辑关系在使然。在今天的数字系统中,虽然可能整个系统的不同芯片或相同芯片的不同模块之间供给电压不尽相同,有5V/3.3V/2.5V/1.8V/1.2V等等,但是从基本原理上看,无论用什么电压值代表1(通常都一致的用0V表示0),其内部逻辑运算原理都是一致的。
0和1,他们的最基本逻辑运算是通过非门、与门和或门来实现的。非门的符号和真值表如图3.5所示。输入x经过非门后,输出z为x的取值反向,如输入x=0则z=1,反之,输入x=1则z=0。
与门的符号和真值表如图3.6所示,输入x和y进行与运算后得到z,与运算的原则就是“遇0则0,全1则1".
或门的符号和真值表如图3.7所示。输入x和y进行或运算后得到结果z。或运算的原则就是“遇1则1,全0则0”。
在与、或、非这三种最基本的逻辑门基础上进行一些扩展,就产生了一些常见的逻辑门如与非门、或非门、异或门、同或门,其符号和真值表分别如图3.8、图3.9、图3.10和图3.11所示。
有了这些基本的门电路,可能有些人还是不理解,到底这些门电路能够干什么,只是做做简单的逻辑关系处理?非也,数字电路中的逻辑门其实就如同数学运算中的1+1=2和2-1=1这样简单却又非常基础的关系。数字电路的逻辑门说白了也是为数学运算服务的,人类运算的基础——加、减、乘、除都可以用逻辑门来完成,更高级一些的运算如开方、求根号等,一样可以通过一些巧妙的逻辑门处理算法解决。人类不是有一套十进制的运算方式了,那又为什么一定要通过逻辑门以二级制的方式来完成这类运算呢?究其根本原因,是因为二进制的处理机制是数字电路(或者更大一点说,也是计算机技术)的基础,而基本的逻辑门运算又非常适合于二进制的运算。再往后,如果读者有机会更深入到电子或计算机相关的应用中,回头再望望今天所说的这些基本逻辑门电路,一定会惊叹那些计算机前辈们的智慧。可不是,话说能够用最简单的东西实现最复杂的事物那才是人类创造的最高水平。
下面列举一个最简单的1位加法器的例子,如图3.12所示,x和y相加,其结果为z,进位为c。我们观察其真值表发现:z = x^y,c = x&y。果然,1位加法非常轻易的用两个逻辑门电路实现了。
若是再深入,2位、3位甚至更多位的加法运算,对于每个位的结果和进位,都可以仿照1位加法器的方式来实现。由此可见,逻辑门还真是那么回事。
接下来,我们要用这些基本的逻辑门搭个复杂点的电路。这个电路如图3.13所示,这是边沿触发的D触发器电路。该触发器的功能是实现时钟信号clk上升沿(由0变化到1)时将输入信号D的值锁存到输出信号q。
该D触发器的真值表如表3.1所示。由此表不难看出,这个D触发器实现了clk信号的上升沿锁存当前输入D信号值到输出信号q或~q的功能,而当clk信号为0或者保持高电平期间,D信号的取值变化不会影响当前的输出q和~q。
由此可见,D触发器可用于存储比特信号,当D输入为0时,在时钟clk的上升沿,q输出也为0;当D输入为1时,在时钟clk的上升沿,q输出也为1;在其他的时刻,q输出保持不变。在实际电路中,时钟信号clk源源不断的有标准的方波输入,每个时钟信号clk的上升沿都会使得D触发器的输入D值被锁存到输出q值中。其实这个D触发器就是我们最基本的寄存器的雏形了,在时序电路中,寄存器和时钟是最基本的要素。
如图3.14所示,这是一个带有异步置位和复位功能的D触发器。所谓置位,即set信号有效时(即为1时),该电路无论时钟clk和输入D值的状态如何,输出q一定是1;同理,所谓复位,即指clr信号有效时(即为1时),该电路无论时钟clk和输入D值的状态如何,输出q一定是0。有了set和clr信号,我们可以在任何时刻得到需要的输出q信号值,当然了,一般只有在系统上电初始或者出现异常后才会执行这样的操作。
图3.14 带异步置位和复位的D触发器
如图3.15所示,通常我们可以用一个简化的模型符号来表示带有异步置位和复位功能的边沿触发的D触发器,通常我们也可以直接称它为寄存器。可别小瞧了它,在后面的应用中我们会逐渐感受到它的神通广大。
数字电路按照逻辑功能一般可以分为组合逻辑和时序逻辑。组合逻辑不含有任何用于存储比特信号的电路,它的输出只和当前电路的输入有关,如前面(图3.12)所列举的加法器的电路。时序逻辑可以含有组合逻辑,并且一定有用于存储比特信号的电路(一般为寄存器),时序逻辑的输出值不仅和当前输入值有关,一般也和电路的原有状态相关。
如图3.16所示,同样是简单的与非门电路,左侧为组合逻辑,右侧则为时序逻辑。
如图3.17所示,以上面的组合逻辑和时序逻辑电路为例,输入信号x和y为随机信号,组合逻辑的输出信号z1在输入x和y发生变化并满足逻辑变化条件时立刻发生变化,当然了,这个变化在实际电路中也有一定的延时。而在时序逻辑中,该实例除了组合逻辑满足条件外,只有在时钟信号clk的每个上升沿输出z2才会发生变化。这里有一个细节大家也需要注意,x和y的组合逻辑输出值在时钟上升沿到来的前后的某段时间内(即建立时间和保持时间)必须是稳定的,否则有可能锁存到不稳定的值(即亚稳态)。
通过这个简单的例子,我们大致可以了解组合逻辑和时序逻辑的特点。一般而言,他们存在以下的区别:
●组合逻辑的输出与输入直接相关,时序逻辑的输出和原有状态也有关。
●组合逻辑立即反应当前输入状态,时序逻辑还必须在时钟上升沿触发后输出新值。
●组合逻辑容易出现竞争、冒险现象,时序逻辑一般不会出现。
●组合逻辑的时序较难保证,时序逻辑更容易达到时序收敛。
●组合逻辑只适合简单的电路,时序逻辑能够胜任大规模的逻辑电路。
在今天的数字系统应用中,纯粹用组合逻辑来实现一个复杂功能的应用几乎绝迹了。时序逻辑在时钟驱动下,能够按部就班的完成各种复杂的任务,也能够非常便利的达到时序要求,并且能够解决各种异步处理带来的亚稳态问题。因此,时序逻辑设计的一些方法和手段是大家必须掌握和熟练应用的。