书接上文计算机如何储存数据八、使用计数器替代手动设置地址上面我们制作了RAM在累加前先把所有数字存储到RAM中这样一旦要修改数字那么将非常容易。但是累加时依然要反复手动设置地址这还是挺麻烦的因为地址是连续的如果能使用计数器来设置地址那么将节省大量工夫。那么如何制作计数器先看下面的电路边沿触发的D触发器把Q反与D连接起来。我们来看看上面这个电路的状态变化过程1、电路启动时的状态假设Clk为0Q为0则Q反为1D为1。2、当Clk变为1的瞬间Q变成D为1Q反变成0。3、但是因为Q反变成0所以D也迅速变成0。所以到目前为止的变化过程如下4、当Clk变成0输出不会变化。5、当Clk又变成1的瞬间因为D是0所以Q变成0Q反变成1。6、因为Q反变成1所以D又迅速变成1。变化过程如下以上现象可以总结为每当Clk从0变成1时Q都会变化要么从0变成1要么从1变成0。也就是Clk每从0到1变化两次Q才从0到1变化一次。就像下图所示Q的变化频率是Clk的变化频率的一半正因为这一点这种电路叫做分频器。一个分频器的输出可以作为另一个分频器的Clk输入再一次分频。下面是3个分频器相连Clk反、Q1、Q2、Q3的变化规律如下标上数字之后你可能会发现一些有趣的东西把上图顺时针旋转90度然后读读每行的四个数字你会发现它们是递增的二进制数。这就是一个计数器连接的分频器越多计数范围就越大。这种计数器叫做“行波计数器”因为是变化是一级一级顺序传递的最后一级触发器的变化必定会有一些延迟。更先进的计数器叫做“并行计数器”这种计数器的所有输出都是在同一时刻改变的。为了方便把计数器符号化有了计数器就可以改进电路因为我们只在累加时才用到计数器往RAM中存储数字的时候并不使用计数器所以要添加一套选择器区分两种情况。累加前先把选择器的c置为0把所有数字存储到RAM中。累加时把选择器的c置为1。下面是累加时的工作流程初始状态是把计数器和五位锁存器清零Clk为0。RAM地址为000。五位加法器的A是RAM地址为000的数字B是00000Sum是计算结果。把Clk设置为1再置为0则同时发生两件事1、五位锁存器保存Sum。2、计数器加1也就是RAM地址加1变成001。接着五位加法器的A变成RAM地址为001的数字B是之前的计算结果Sum是新的计算结果。然后Clk第二次设置为1再置为0还是同时发生两件事1、五位锁存器保存新Sum。2、计数器加1也就是RAM地址加1变成002。如此反复。直到把所有数字累加起来。九、如何自动化使用计数器设置地址已经省了不少工夫但是手动改变计数器的Clk毕竟是手动操作还是有点麻烦难道不能让它自动计数吗当然能。想要让计数器自动计数就要用到振荡器。振荡器的电路如下乍看这个电路好像是矛盾的但是不矛盾。因为电信号从输入到输出是需要一段时间的即使这段时间极短那也是一段时间所以即使输出与输入相同输出也很快变成相反的电信号然后输出再次作为输入如此反复。这种电路叫做振荡器oscillator。它与我们之前讲过的所有电路有本质的区别之前电路输出的改变必须依靠人为干预通常是以手动改变输入实现的。只要不改变输入输出就绝对不会改变。但是振荡器却可以在无人为干预的情况下自动地改变输入从而改变输出。下面的图展示了振荡器的输出随着时间的推移振荡器的输出在0和1之间有规律的变化。正因为这一点振荡器又称为时钟clock。振荡器从一个初始状态开始经过一段时间之后又回到初始状态这段时间称为一个循环或者叫周期。周期的倒数叫频率假设振荡器的周期是0.05s那么频率就是1/0.0520Hz。也就是1秒循环20次。有了振荡器就可以改进电路累加前先把选择器的c置为0把所有数字存储到RAM中。累加时把选择器的c置为1。下面是累加时的工作流程初始状态是把计数器和五位锁存器清零Clk为0。RAM地址为000。五位加法器的A是RAM地址为000的数字B是00000Sum是计算结果。振荡器会自动把Clk设置为1再置为0则同时发生两件事1、五位锁存器保存Sum。2、计数器加1也就是RAM地址加1变成001。接着五位加法器的A变成RAM地址为001的数字B是之前的计算结果Sum是新的计算结果。然后振荡器把Clk第二次设置为1再置为0还是同时发生两件事1、五位锁存器保存新Sum。2、计数器加1也就是RAM地址加1变成002。如此反复。直到把所有数字累加起来。计数器的变化是由振荡器自动控制的不用手动设置。但是这个电路存在一个问题会一直循环工作无法停止。当计数器达到111之后会重新回到000累加器又把所有数字加一遍。如何确定时钟周期其实还有一个问题一直没讲那就是时钟周期应该是多长的问题。你可能以为周期越短越好这样每秒的计算次数就越多也就是计算速度越快。然而并不是这样。因为每次修改计算机的输入后得出正确输出都是需要时间的这段时间叫传播时延propagation delay。所以时钟周期不能太短。时钟周期应该大于等于每次输入改变后的最大传播时延。如果不等计算出正确输出就改变输入做下一次计算那就乱套了。举一个例子。假设有1个100米的环形跑道起跑线也是终点线然后有5个人在这个跑道上连续比赛100米。第1次比赛5个人都从起跑线起跑。然后第一个人先到终点线了但是他还不能开始第2次比赛因为他还要等其他四个人都到达。如果他不等待那这场比赛就乱套了。在前面我们已经知道了CPU是通过很多的门电路来工作的而电流从门电路的输入到输出是需要时间的这段时间就是所说的传播时延。比如下面一个逻辑电路当AB1时Q0。当B变化为0时由于B也作为XOR的直接输入所以XOR异或门会立即感知一个输入变为0的状态变化XOR输出变为了1。但是由于传播时延的作用AND与门的输出会过一小段时间才变为0XOR的输出会在变为1后隔一小段时间后变为0。表现为下图就是这样所以确定时钟周期时要考虑传播时延时钟周期应当大于所有逻辑门的最大传播时延。
