首页 > 代码库 > 我对CPU的理解——Version3.0

我对CPU的理解——Version3.0

这篇博客主要将介绍CPU硬件层面上的一些细节,但不会涉及全部的组件,只描述我个人认为重要的几个点而已,更具体详尽的描述要看前面那篇文章中介绍的两本书。

1、地址与寻址

这在之前是个非常折磨我的问题,我实在想象不出如何根据一个数字去寻找内存中相应的单元,难不成每个单元上面都贴着标签?直到我看到下面所谓的选择电路:

技术分享

在左边这张图中,若SEL=0,则输出F=A;反之,若SEL=1,则F=B。SEL输入的信号不就是地址吗?在这个体系中,A的地址就是0,B的地址就是1。好吧,也许一根地址线不够明显,那么再看这张图:

技术分享

当A=0,B=0时,输出=输入0;A=0,B=1时,输出=输入2;A=1,B=0时,输出=输入1;最后A=B=1时,输出=输入3,这样我门就确定了四个输入的地址,从上到下依次为:11,01,10,00,且在这个体系中,A代表地址的高位,B代表低位,这是有两根地址线的情况。

大家可以自行脑补一下,若有3根地址线的话,可以决定8个地址;32根就可以决定2的32次方个地址。这就是地址的硬件实现,跟我想象中贴标签的情形完全不一样。。我们同时可以看到,每个与门电路中既有地址输入,还有数据输入,但是数据输入只有一根线,不过他是可以扩充,比如增加到8根,那么一次就可以输入一个字节的数据,而输出也要相应的增加到8根。


2、读写操作与存储

这里的本质问题是:信号在电路中是如何存储的?我们知道信号在物理上表现为电压的高低,而电压往往只在线路中“流动”才能被“检测”或“表现”出来,而如何用一个电路元件把线路此刻的状态保存下来,并不是那么简单的事情。

有人发明了这个电路:

技术分享

当保持位的信号是1的时候,Q与数据端的信号保持一致,即输入随时可以改变输出;但是当保持位变成0的时候,无论数据端的信号怎么变化,Q端都将维持刚才的输出。这就是所谓电平触发的D型触发器,他可以保存电路中的信号。我想各位已经可以从这个“简单”的装置中看到了内存的影子,虽然它只能保存一位信号。而保持位就是传说中的“写”信号,当这个信号是1的时候,才可以“写入”,亦即“保存信号”。

我们可以看到,这和想象中的保存还是不太一样的。这个装置的“保存”动作实际上是维持刚才的输出信号,本身并没有实际的“存储”电信号,信号仍然只“存在”于某一段线路上。比较诗意的说法就是:电信号不会停留在某处,它永远在路上。。我有个不太恰当的比喻,计算机中所谓的存储元件,就像某种城门或者闸门,它的目的或功能只是阻碍经过它的信号的“正常”流动、传播,开闸的时候,信号可以自由通过这里继续向前传播;但是一旦关闸,这个信号就到此为止了,闸门后面的信号由闸门接管了,而接管也只是简单的让其维持刚才的状态继续向前流动。

同样的道理,我们可以想象,“读”这个动作又是如何实现的?比如从内存某个单元读入一个字节到寄存器中。我猜可能是这样的:寄存器和内存由8跟线相连,经过前面的地址选择器,内存对应单元的信号已经被放到了连线上,并且马上到了寄存器的门口,但是城门没开啊。而所谓的“读”,就是简单的把寄存器的门打开(即,把写信号置为1),然后寄存器就“读”入了新值。寄存器保存了这个新值,其实就是寄存器电路改变了向外输出的那条线路的信号,同时关闭了和内存相连的门(以避免受其影响)。新值经过寄存器又流到哪里,就要看这条线路被连到哪个地址选择器了,可能是另一个寄存器,或者是ALU,还可能是内存。

到此为止,我感觉已经把数据在CPU内以及在CPU和内存之间的流动图景描述了一边,即,这种流动的本质或者物理情形是怎么样的。

但是这个装置还有一个问题,就是太依赖保持位的稳定性。万一它应该保持在1的时候突然变成了0怎么办?要知道电路不一定是永远稳定的,受到一点儿干扰就可能发生变化。于是就有了下面这个电路:

技术分享(边沿触发器)

上面那个电路,在保持位是1的时候,输入的变化总会改变输出;而这个电路,只有在保持位从0变成1的瞬间,输入的变化才会引起输出的变化,也就是说,当保持位处于某个稳定状态的时候,输出是不会随着输入变化的,而在保持位从0变成1的瞬间,那么输入是几,输出就是几了。这意味着,想要改变输出的话,输入必须同时(0->1瞬间)变化。

这里保持位就是时钟信号的原型了,即由时钟信号来控制这个保持位。因为时钟信号在0和1之间周期性变化,所以用同一个时钟信号来控制多个存储装置的读写信号就可以保证数据传输的同步性,这个同步性对于控制数据流是相当重要的,后面我也许会分析,不过最好还是看书自己体会。其实刚才的栗子也能看出一点端倪,即内存的地址选择器做出选择(这个动作的物理含义是:地址信号达到地址选择器门前,地址选择器必须开门)的瞬间,对应的内存单元的数据立刻就能到达寄存器的门口,这时就要求寄存器的门和地址选择器的门同时打开,怎么样才能保证同时呢?唯有靠时钟信号了。下面我们就要分析一下时钟信号是怎么来的。


3、时序

首先要知道的一个器件是振荡器:

技术分享(纯手工画的哈)

这个电路做的事情就是:把输入取反之后输出,然后把输出作为输入,如此循环。可以看出输出到达输入口几乎不需要时间,这意味着输出变化的频率很高。单我们需要一个较低的频率时就要接入一个分频器,其实就接入上面提到的边沿触发器,如下图:

技术分享

这个装置中,Q在0和1之间变化的频率是Clk的一半(自己最好推算一下),Q后面可以继续接入一个边沿触发器,再次分频,如此循环。我们有了下面这个装置:

技术分享

其信号输出通过图像表现出来就能看出点东西:

技术分享                 技术分享

第二张图要这样看:第一列是0000,最后一列是1111,能不能联想到什么?我能想到的就是作为地址选择器的输入,这样就能自动化操作,CPU就可以连续的从内存中取出指令,是的,这个装置就是PC(程序计数器)的原型!!!激动有木有?当然这些输出信号还能被送往其他部件,作为读写控制信号。


我个人觉得只要理解了这几部分,CPU运行场景的关键就算是掌握了,暂时我想写的也就这么多了,欢迎大家拍砖~

我对CPU的理解——Version3.0