(直接开始正题)
1. 锁存器
锁存器是一种具有保持前一个状态留下的数据不变、读入数据两种功能的基本存储单元。
下图为RS-锁存器,它由两个与非门构成,我们称上面的与非门为A,下面的与非门为B。那么,A的第一个输入为S,第二个输入是B的输出;B的第一个输入为R,第二个输入为A的输出。
下面先来分析一下,对于R、S不同的输入情况,RS-锁存器会产生怎样的效果。
在《计算机系统概论》这本书上,作者先分析的是R、S同时为1的情况,但这种情况无法产生可推理的输出。因为在R、S同时为1的情况下,与非门的输出不具有必然性,必须假设前一个状态是什么,而这个前一个状态是怎么来的呢?书上并没有提及,事实上,根据逻辑常识,只有令R、S其中一个(假设是R)为0,才能让这个与非门(即A)的输出确定为1,也就能让另外一个与非门(即B)的输入确定为S和1,在这种情况下Q端输出的是1,也就是书上说的“置1”操作;相反地,若S为0,R为1,则Q端输出的结果是0,也就是书上的“置0”操作。这就是所谓的“前一个状态”的来源。换句话说,只有0/1或1/0的组合,才能让锁存器读入数据。注意,只有输出端Q才能代表锁存器目前存储的数据,Q非只是作为互补端存在。在这里也产生了一个新的细节:Q和Q非的数据必须是互补的,否则就会出现异常,这个异常在下下一段会提及。
接下来要讲的,就是R、S同时为1的情况。假设Q端已经输出了一个数据1,也就是锁存器存下了1这个值。那么在这个即将过去的状态下,R、S必然是0/1或1/0。假设此时R=1,S=0,Q=1,如果突然将S改为1,B与非门输出的就是0,也就是Q非。这个输出的0会到达A与非门的输入,和R=1共同决定了A的输出为1,也就是Q=1。很显然,Q和Q非是互补的,也就是这个操作是合理的,同时留意到,Q的输出仍为1,这是不是意味着保存的值仍为1不变?同理,假设前一个状态输出的是0,也会满足这样的结果,即输出保持0不变。因此可以得到结论:若R、S从0/1状态切换到1/1状态,代表的是锁存器的保存操作,输出的值不会发生改变。顺带提一句,1/1也代表着锁存器的初始状态(即静态),因为这种状态下不会读入或擦除数据。
最后一种情况,即R、S同时为0的情况,也就是我上文提到的会发生异常的情况。和上一段的假设一样,Q端存下了1这个值,且R=1,S=0,Q=1,如果将R瞬间置为0,B与非门会输出1,即Q非=1,这个1到达A与非门后,和S共同产生输出为1,也就是Q=1,这时候就产生矛盾了:Q和Q非都等于1,这显然违背了输出端和互补端必须互补的原则,这时锁存器的状态就是不确定的,所以绝对不要让R和S同时为0。
下图为门控D锁存器:
和RS-锁存器相比,门控D锁存器多了两个与门。我们称上面的与门为C,下面的为D。C的输入一个来源于D,另一个来源于WE信号;同理,D的输入一个来源于D非,一个来源于WE信号。
WE信号是一个称为可写入的信号,和计算机的时钟相关联。可以发现,当WE=1时,若D=1,则R=0,S=1,此时写入的值为1;反之,若D=0,则R=1,S=0,写入的值为0。可以看出,当WE=1时,写入的值等于D的值。
但是当WE=0时,R和S将永远为1,也就是上文提到的静态。无论D输入什么,锁存器保存的值都保持不变。
2. 组合逻辑电路设计
书中以交通警告灯为例,设计了一个组合逻辑电路。
组合逻辑电路包括两组输出,一组是指示灯的控制信号,一组是次态的状态信息。
下面首先展示指示灯控制信号的真值表:
显然,Z、Y、X分别代表1、2灯,3、4灯和5灯的开关。
接下来是状态转移的真值表:
其中,IN代表电路总开关,S1和S0的组合分别代表了不同的状态,S1’和S0‘的组合代表了各现态的次态。
此处给出逻辑实现,其中上半部分的实现可凭借译码器的基本原理看懂,下面重点要讲的就是下方的存储单元里究竟有什么玄妙。
通过这个逻辑电路的原理可以知道,在每个时钟周期内,存储单元的输出是电路的输入,而电路的输出也是存储单元的输出,这句话听着很绕,同样地,单凭一个门控D锁存器,要实现起来也很困难。因为在这个情况下,当前周期输入的时候,会直接把存储的值覆盖,就相当于编程时想交换两个数,如果不用一个临时变量去存其中一个变量当前的值,就无法实现交换了。于是大佬们想了一个办法,使用“主从锁存器“,就能解决这个问题。
什么是“主从锁存器“呢?我们可以看看下面的图片:
左边的是锁存器B,右边的是锁存器A。因为时钟实际上就是WE信号,在时钟周期的前半段,真正的时钟信号为1,因此对于A,WE=0,A为只读状态,不允许写入新数据,而将原本存储的数据输出到B寄存起来;对于B,WE=1,自然就可以写入数据了,这就相当于用临时变量保存的操作。而到了时钟周期的后半段,时钟的信号变为0,对于A,WE=1,A可以写入新数据了;而对于B,WE=0,不允许写入。所以,通过将一个时钟周期分割为两个小周期,相当于在一个周期内实现了利用存储单元已有数据和更新存储单元数据的操作。