跳转至

第 4 章:冯诺依曼架构

基本组成部分

一个冯诺依曼架构的计算机一般由 5 个部分组成:

  • 内存
  • 计算单元
  • 输入
  • 输出
  • 控制单元

冯诺依曼架构

图:冯诺依曼架构

内存 Memory

16 GB 内存指什么?GB 在这里是 gigabytes,而 16 giga 等于 \(2^{34}\),后面的 bytes 代表一个内存单元里面有 8 个位(= 1 个字节)。16 GB 内存就是指这内存中有 \(2^{34}\) 个字节。

内存的读写

内存有它的两个寄存器,一个是关于地址的(MAR),一个是关于值的(MDR)。

当要读某个地方的内存值的时候,就往 MAR 里面写数据,然后给内存一个控制信号,让它把对应地方的值写进 MDR 里。

而要写某个地方的内存值的时候,就往 MAR 和 MDR 里面都写数据,然后给内存一个控制信号,让它把对应地方的值给改了就好了。

计算单元 Processing Unit

有个重量级的东西,叫做 Arithmetic and Logic Unit(ALU)。它可以执行一些操作,比如求两个值的和,以及取 AND、OR、NOT 什么的。

ALU 一般接收的用来运算的数都是定长的。这个长度叫做计算机的字长(word length)。比如现在的 CPU 基本上都是 64 位的字长了;8 位或者 16 位字长一般可以在非常廉价的处理器中看到。

输入、输出

可以说是计算机的外设来完成了输入输出,比如键盘、鼠标提供输入,而显示器什么的提供输出。

控制单元

它解析机器语言,向上面的所有东西发号施令。

它拥有一个储存机器码指令的寄存器 IR(instruction register);以及一个存储下一条指令的位置的寄存器,这个寄存器由于一些历史原因会被叫做 program counter(PC),不过它有个更好的名字叫 instruction pointer(IP)。

LC-3 是一种冯诺依曼计算机

LC-3 的数据通路

图:LC-3 的数据通路

内存 MEMORY

拥有 \(2^{16}\) 个内存地址,每个地址有 16 位长。

它也有一个 MAR 和一个 MDR。

输入输出 INPUT / OUTPUT

输入部分由一个键盘负责。它也有两个寄存器:键盘数据寄存器 KBDR,存着现在被按下去的键的 ASCII 码;以及键盘状态寄存器 KBSR,存着键盘上有没有键被按下去。

计算单元 THE PROCESSING UNIT

里面有一个 ALU 和 8 个寄存器 R0 到 R7。LC-3 的 ALU 可以干加法、取 AND 和取 NOT。这么少?

控制单元 THE CONTROL UNIT

拥有一个 IR 和一个 PC。

指令周期

可以分为六步:

  • 获得数据 FETCH
  • 解码 DECODE
  • 分析地址 EVALUATE ADDRESS
  • 获取操作数 FETCH OPERANDS
  • 执行 EXECUTE
  • 存储结果 STORE RESULT

获得数据 FETCH

这一步将这一次的指令存到 IR 中。

  • MAR 的值变成了 PC,然后把 PC 增加。
  • 内存收到指令,把 MAR 对应地方的值放到 MDR 中。
  • IR 的值变成了 MDR。

解码 DECODE

通过喂给解码器 IR 的 [15:12] 位(opcode),它可以确定到底要执行哪一种指令。(所以说LC-3 最多有 16 种指令。)

分析地址 EVALUATE ADDRESS

比如说 LD 指令这样的需要从内存中加载值的指令,有些指令需要动用内存。这一步会计算将要读取的内存的地址。

获取操作数 FETCH OPERANDS

这一步会把指令所需要的操作数准备好。比如在 ADD 中,这一步就会把所需要的两个寄存器的值(或者一个寄存器和一个立即数)发送到 ALU 中。

执行 EXECUTE

一切都准备好之后,就要开始计算了。

存储结果 STORE RESULT

这一步会往应该的地方存储结果,如果有结果的话。

打断:TRAP 指令

问题来了,我们怎么控制计算机开始与停止执行指令呢?这里提供了一种叫 TRAP 的指令,翻译成自陷指令,和中断指令差不多,区别在于 trap 是用户程序触发的,中断是硬件触发的。

TRAP 指令和其他指令一样,拥有自己的 opcode。