我们已经做了一个算术逻辑单元(ALU)输入二进制,它会执行计算。我们还做了两种内存: 寄存器 - 很小的一块内存,能存一个值 ,之后我们增大做出了 ,RAM 是一大块内存,能在不同地址存大量数字,现在是时候把这些放在一起,组建计算机的 "心脏" 了。但这个 "心脏" 不会有任何包袱,比如人类情感.。计算机的心脏是"中央处理单元",简称 "CPU" 。CPU 负责执行程序,比如 Office,Safari 浏览器。程序由一个个操作组成 ,这些操作叫"指令"(Instruction) ,因为它们"指示"计算机要做什么,如果是数学指令,比如加/减 ,CPU 会让 ALU 进行数学运算,也可能是内存指令,CPU 会和内存通信,然后读/写值,也可能是内存指令,CPU 会和内存通信,然后读/写值,CPU 里有很多组件。
所以我们一边说一边建 我们把重点放在功能,而不是一根根线具体怎么连,当我们用一条线连接两个组件时,这条线只是所有必须线路的一个抽象。这种高层次视角叫 "微体系架构" 。我们首先要一些内存,把上集做的 RAM 拿来就行。为了保持简单,假设它只有 16 个位置,每个位置存 8 位 ,再来四个 8 位寄存器,叫 A,B,C,D 寄存器用来 临时存数据 和 操作数据 ,我们已经知道数据 是以二进制值存在内存里 。程序也可以存在内存里 ,我们可以给 CPU 支持的所有指令,分配一个 ID 指令表 指令 描述 4位操作码 地址或寄存器 。在这个假设的例子,我们用前四位存 "操作代码" 简称 "操作码" (opcode) ,后四位代表数据来自哪里,可以是寄存器或内存地址。我们还需要两个寄存器,来完成 CPU。
取指令阶段
为了举例,我们在 RAM 里放了一个程序,我们今天会过一遍 CPU 的第一个阶段叫 "取指令阶段" ,负责拿到指令,首先,将 "指令地址寄存器" 连到寄存器的值为 0,因此 RAM 返回地址 0 的值 0010 1110 会复制到 "指令寄存器" 里。
解码阶段
现在指令拿到了,要弄清是什么指令,才能执行(execute) 要弄清是什么指令,才能执行(execute)而不是杀死(kill)它 。这是 "解码阶段" 指令表 指令 描述 4位操作码 地址或寄存器,前 4 位 0010 是 LOAD A 指令 。意思是,把 RAM 的值放入寄存器,后 4 位 1110 是 RAM 的地址, 转成十进制是 。接下来,指令由 "控制单元" 进行解码,就像之前的所有东西 "控制单元" 也是逻辑门组成的,比如,为了识别 "LOAD A" 指令,我们需要一个电路,检查操作码是不是。我们可以用很少的逻辑门来实现。
执行阶段
现在知道了是什么指令就可以开始执行了,开始 "执行阶段",用 "检查是否 LOAD_A 指令的电路" 可以打开 RAM 的 "允许读取线", 把地址 14 传过去 ,RAM 拿到值,0000 0011,十进制的 3。因为是 LOAD_A 指令,我们想把这个值只放到寄存器 A,其他寄存器不受影响。所以需要一根线,把 RAM 连到 4 个寄存器用 "检查是否 LOAD_A 指令的电路" 。启用寄存器 A 的 "允许写入线",这就成功把 RAM 地址 14 的值,放到了寄存器。既然指令完成了,我们可以关掉所有线路,去拿下一条指令,我们把 "指令地址寄存器"+1,"执行阶段"就此结束。
LOAD_A 只是 CPU 可以执行的各种指令之一,不同指令由不同逻辑电路解码,这些逻辑电路会配置 CPU 内的组件来执行对应操作,具体分析这些解码电路太繁琐了。既然已经看了 1 个例子, 干脆把 "控制单元 "包成一个整体,简洁一些。没错,一层新抽象,控制单元就像管弦乐队的指挥 ,"取指令→解码→执行" 完成后,现在可以再来一次。