这一节来介绍基本的寄存器和存储器的实现,首先看时序逻辑电路的动力时钟,时钟可以周期性的去输出0或者是1。
继电器时钟
时钟可以通过继电器来实现,比如上面的电路,v是电源高电压,所以开始的时候它输出out是1,当开关闭合的时候,电磁铁会充电,那么它会把弹片拉下来,输出out就变成0,弹片拉下来以后,电磁铁它就会断电,那么它就会失去磁性,这时候弹片又会被弹回去,输出又变成1,然后电磁铁又通电,又把弹片给拉下来,这时候输出又变成0,就这样的交替往复输出1跟0。
时钟周期
在每一个上升沿之间的间隙就称为一个时钟周期,比如上图它的时钟周期就是0.05,而时钟周期的倒数被称为时钟频率,就是说在一秒钟之内有多少个时钟周期,比如如果时钟周期它是0.05的话,那么时钟频率就是1/0.05=20HZ,单位是赫兹,现在的计算机通常使用晶振来产生时钟,频率也很高,可以达到100M到4G赫兹。
晶振
时钟的作用第一个是同步的作用,可以让多个元件在相同的时刻进行状态的改变,第二个可以起到控制的作用,可以让电路在特定的时间间隔内去执行特定的操作,第三个是时序控制,可以让电路按照特定的时序进行电路操作,第四个是时钟频率决定了电路的工作速度,时钟频率越高那么CPU的运行速度就越快。
实现存储器之前我们先看基本的多路选择器和多路复用器的实现,入下图多路选择器它有两个输入a,b一个输出out,从多路输入里面选择一个作为输出,它有一个select做控制,当select等于0的时候就选择a作为输出,当select等于1的时候选择b作为输出,
多路选择器
上图是它的符号和verilog实现,我们来推导一下,当sel等于0的时候,nsel是等于1的,那么1跟a作与操作输出o1就是a,0跟b作与操作输出o2是0,那么a再跟0做或操作输出out就是a,当sel等于1的时候也是一样的,当sel等于1,nsel它就是0,那么输出o1是0,输出o2是b,b跟0做或操作输出out就是b。
Mux16
我们再把16个mux组合起来,就构成一个16位的多路选择器如上图,它的输入跟输出都变成16位的,因为我们后面设计的CPU它是16位的,所以我们设计的加法器,存储器,寄存器,它的输入输出都是16位的。
4way就是在mux16的基础上把输入变成4个如上图,那么sel它的值就是两位,可以有4个值去选择,4个值作为输出,比如当sel等于0的时候就选择a,当sel等于3的时候选择d作为输出,8way就是把MUX16输出变成8个,那么sel值就从0到7变化,当sel等于7的时候它选择的就是h作为输出。
多路复用器它有一个输入多个输出,把一个输入的内容多路输出去复用,下图当sel等于0的时候,它就选择把in从a输出,a就是等于in的,当sel=1的时候b是等于in的,a是等于0的,
多路复用器
我们来推一下,当sel等于0,nsel就是1,1跟in做与操作,输出就是in,那么a就是等于in的,那0跟in做与操作,输出就是0,那么b就是等于0的,当sel=1的时候也是一样,nsel是等于0的,那么a就是等于0的,b就是等于in的。
4way就是把输出扩展成4个值,那么sel值就是从0到3变化,然后sel=0的时候a就等于in的,b c d就等于0的,当sel=3的时候,d是等于in的,其它的a b c是等于0的,8way就是把输出扩展成8个。
然后我们来看SR锁存器怎么使用电路来存储一位,SR锁存器是由两个或非门构造,或非门特性是当a b输入为0的时候输出为1,其它情况输出都是0,
SR锁存器
我们来看一下下图,第一个电路开始的时候,输出是不确定的,然后第二个电路,当上面的开关闭合的时候,电源输入的是1,所以第1个或非门必然输出的是0,然后第2个或非门两个输入都是0,所以最终输出是1,灯亮,第三个图,当上面的开关断开的时候,第1个或非门有一个输入是1,所以第1个或非门输出的仍然是0,第2个或非门两个输入还是0,所以最终输出仍然是1,这时候电路就记住了上次的状态,存储了1位。
我们把上面的开关称为set,当set设置成1的时候,就是把输出设置成1,然后再看图4,把下面的开关闭合的时候,第2个或非门有一个输入是1,那么最终输出必然是0,灯灭,这时第1个或非门两个输入是0所以他的输出是1,再把下面的开关断开,因为第1个或非门输出是1,所以最终输出还是0,那么下面这个开关就称为reset,当reset设成1的时候,就把输出reset成0,
下面就是SR锁存器的符号,跟前面的电路是一样了,就是看起来不太直观一些,我们看它的真值表,有两个输入s跟r,输出q跟q_,q跟q_的值是相反的,当s=1,r=0的时候,就做set操作把输出设成1,那么q_就是0,当r=1,s=0的时候,就做reset的操作,把输出reset成0,那么q_就是1,
SR锁存器的符号
当s跟r都为0的时候,那么就保持之前的值,那么当s跟r都为1的时候,那么这两个或非门它输出的都是0,那么这时候q跟q_的值就相同了,那么它就不符合SR锁存器它的特性了,所以我们需要避免这种情况,避免把s跟r同时设为1,
实际在使用SR锁存器的时候,还会增加一个控制信号,通常是一个时钟如下图,当这个时钟信号为1的时候,输出才受r跟s的影响,当这个时钟为0的时候,输出就保持之前的值,比如当时钟为0的时候,这两个与门它输出都是0,那么这里的s跟r都为0,它就保持之间的值,那么当时钟为1的时候,那么这里输出的就是r跟s,所以输出就受输入的影响,
我们这里记一下这个特性,当时钟为0的时候,它的输出是保持之前的值,我们后面会使用这个特性来简化电路分析,这个电路也称为时钟SR锁存器。
D锁存器就是把SR锁存器的两个输入变成一个输入,这个输入下面就接的是之前的s端,然后这个输入再取反接的就是上面的r端,这样我们就可以避免把r跟s输入相同的值,
D锁存器
我们来看一下它的特性,当时钟为1的时候,那么输出就等于输入的,当时钟等于0的时候,输出就保持之前的值,这种触发方式也被称为电平触发,就是当时钟保持1的时候,它的输出就是等于输入的,
还有一种D触发器它是属于边沿触发,就是当时钟从0变成1以后,它的输出才是等于输入的,其它情况输出都不受输入的影响,表里的箭头就代表时钟从0变成1,
D触发器
我们来看一下真值表,当时钟从0变成1的时候,输出是等于输入的,然后其它情况,当时钟保持在1,或者是从1变成0的时候,它的输出都不受输入的影响,只有当时钟再从0变成1的时候,它的输出再变成输入0,可以看到它其实就是由两个时钟SR锁存器构成的,
我们来大致推导一下它的工作原理如下图,开始的时候输入data是0,时钟也是0,那么时钟取反就变成1,这里的红线就代表是1,黑线代表是0,这里是1,这里是0,那么这里做与操作以后输出来就是0,这里0取反是1,两个1输出来是1,这里输入的是1,那么这里必然输出的是0,两个0输出来就是1,所以第一个SR锁存器它的输出是1跟0,
然后第二个SR锁存器,因为它这里的时钟是0,所以它就保持之前的值,再看当data=1的时候,这里的时钟也是1,所以第一个SR锁存器,它的输出就受输入的影响,那么这里就是把r端设成了1,那么它就会把输出reset成0,那么这里的q_就变成了1了,那么第二个SR锁存器它这里是0,所以它还是保持之前的值,
再看时钟从0变成1,时钟从0变成1以后,这个1再取反就变成0,所以第一个SR锁存器它就保持之前的值0跟1,然后第二个SR锁存器,它这个时钟就变成1了,所以它的输出就受输入的影响,那么上面r端是0,下面s端是1,所以它就把输出设置成1,这就变成1了,那么这时候输出就是等于输入的1,
然后再看data从1变成0的时候,时钟不变,data从1变成0,因为第一个SR锁存器,它这个时钟还是0的,所以它这里还是保持之前的值0跟1,然后第二个SR锁存器它这里是1,因为它两个输入都没有变,所以它的输出还是没有变的,那我们再把时钟从1变成0,时钟从1变成0,那么第二个SR锁存器,它这里就变成0了,变成0以后它就会保持之前的值,两个0还是保持之前的值,所以这里输出的还是1,
然后我们来看怎么实现d触发器,在实际的使用d触发器的时候,我们还会加一个load,当load=1的时候,输出才受输入的影响,当load=0的时候,它的输出就保持之前的值,所以我们在前面加一个多路选择器,它的一个输入是新的输入in,一个输入是之前的输出out,当load=1的时候,它的输出就是新的输入in1,当load=0的时候,它的输出就是之前的输出out,就通过一个多路选择器来实现,
d触发器
然后后面就是调用前面的两个时钟SR锁存器,第一个时钟SR锁存器它的r端是in1,时钟端是clocknot,时钟取反,s端就是in取反innot,输出是q跟q_,第二个SR锁存器,它的输入是,r输入是q,时钟输入就是等于这个时钟,然后s输入就是q_,它的输出就是out跟q1_,大家按照这个图来实现一下,
实现完成以后我们看一下效果,当load=1的时候,并且时钟从0变成1的时候,输出是等于输入的,其它情况都是保持,load=1时钟变成1,输出是等于输入的,当load=0的时候,不管你时钟怎么变化,它的输出都是保持之前的值,
D触发器演示
然后我们把16个D触发器组合起来,构造成一个16位的寄存器,它的输入跟输出都变成16位的,
下面是演示,当load=1,时钟从0变成1的时候,输出是等于输入的,当load=0的时候就保持之前的值,
然后我们再把8个寄存器组合起来,构造成一个RAM8,它通过地址来寻址,地址的范围是3位,就是8个地址,8个地址分别对应的是8个寄存器,它下面有一个多路选择器,通过地址来选择把哪个寄存器的值作为输出,比如地址是1,那么选择的就是寄存器1的输出作为最终的输出,
它前面还有一个多路复用器,就是当load=1的时候,去选择把输入存储到哪一个寄存器里面,比如当address=1,load=1的时候,那么它就会把loadB设成1,其它的load都是等于0的,loadB=1,当时钟从0变成1以后,它的输出就等于输入了,所以就会把地址1所对应的存储单元,值设置成in,然后输出出去,
上图是演示,我们来看一下,当load=1的时候,就是做写入的操作,当从0变成1,时钟从0变成1的时候,就做写入操作,地址1写入的就是1,000,地址3就是3,000,当load=0的时候,输出就不受输入的影响,就做的是读的操作,比如address3它输出来就是之前存储的值3,000,我们这里的一个地址它对应的是一个16位寄存器,
现在的CPU不管它是8位16位还是32位,它一个地址对应的最小的存储单元,都是一个8位就是一个字节,当地址加1的时候它取的就是下一个字节的值,而我们这里的一个地址对应的是16位两个字节,然后当地址加1的时候它取的就是第3个字节,反正原理是一样的,
然后我们再把8个RAM8组合起来构成一个RAM64,它的地址范围就是0到5,2的6次方64个地址,我们把这6位的地址从前面的3位,从3到5做为这8个RAM8的选择,去选择选择用哪个RAM8,然后我们把后面的三位从0到2,作为在这个RAM8里面去选择哪一个寄存器,
然后我们再把8个RAM64组合起来,就可以构造成一个RAM512,它的地址就是512个,512对应的就是512个寄存器,那么我们在实现的时候就可以把它的地址就是有9位,我们就把前面的789这三位做为8个RAM64的选择,再把后面的6位做为RAM64内部的8个RAM8的选择,就这样大家来实现一下.
**