概述

这一章是硬件部分(1-5章)的最后一章。这一章会使用1-3章的芯片造一个通用计算机(名为Hack),并且可以运行第4章的机器语言编写的程序。

Hack有2个优点,一是简单,几个小时就可以用芯片和硬件模拟器造出来,二是它能够说明任何数字计算机的关键操作和硬件组成。

存储程序概念(The Stored Program Concept)

数字计算机是多功能的,能够在有限的硬件平台加载不同的程序,执行多种的任务,从交互式游戏到文字处理再到科学计算,这是存储程序概念带来的结果。

冯诺依曼结构(The von Neumann Architecture)

存储程序概念是抽象和实用的计算机模型的关键要素,最值得注意的是通用图灵机(universal Turing machine)(1936年)和冯诺依曼机(von Neumann machine)(1945年)。图灵机是一个抽象描述,用于分析计算机系统的逻辑基础。冯诺依曼机是一个实用的结构,它是现在几乎所有计算机的概念蓝图。

冯诺依曼结构基于一个CPU,和存储设备交互,从输入设备获取数据,发送数据到输出设备。中心是基于存储程序概念,存储器存储数据和指令。下面讲这种结构的细节。

冯诺依曼结构
冯诺依曼结构

存储器(Memory)

冯诺依曼的存储器存储2种类型的信息:数据和指令。它们存储在不同的单元中,而它们都是以二进制形式表示,存储在基本的随机存取结构中:一个连续的固定字长的单元的数组(Words or Locations),每一个单元都有唯一的地址(Address)。通过提供地址来确定一个字。

数据存储器(Data Memory)

高级程序的抽象部分,比如变量、数组、对象,以二进制形式存储在数据存储器。

指令存储器(Instruction Memory)

高级程序命令被翻译成机器语言,以二进制形式储存在指令存储器。

CPU(Central Processing Unit)

CPU作为计算机结构的中心,执行被加载的程序的指令。指令告诉CPU进行各种计算、读写数据、条件跳转。CPU使用3个主要的硬件来执行任务:ALU、寄存器、控制单元。

ALU(Arithmetic Logic Unit)

进行低级的算术和逻辑运算。

控制单元(Control Unit)

指令是二进制编码,在它执行之前需要解码,并且其中的信息必须给一些硬件设备信号,以执行指令。解码就是由控制单元完成的。

现在,CPU的操作可以被描述为一个循环:取指令,解码,执行,再取指令…

寄存器(Registers)

和RAM相比,寄存器可以更快捷地存取数据。

寄存器有多种用处:

数据寄存器(Data registers)

提供数据暂存功能。

寻址寄存器(Addressing registers)

地址被存储在寄存器,以访问内存地址,存取数据。

程序计数器寄存器(Program counter register)

执行程序时,CPU必须始终保持跟踪,获取下一条指令的地址。这个地址被保存在一个特殊的寄存器PC中,也就是PC中的内容将作为下一条指令的地址。在执行指令时,PC会用2种方法中的一种更新:没有goto指令,PC把地址+1;有goto n,PC修改为n。

输入和输出(Input and Output)

外设有很多,每种都代表着一种独特的机械设备,需要独特的工程知识。于是,计算机科学家设计了各种方案,使所有这些设备看起来与计算机相同。 此领域中最简单的技术称为内存映射I/O(memory-mapped I/O)。基本思路是创建一个I/O设备的二进制模拟,使它对于CPU来说就像一个普通的内存段。

Hack硬件平台规范(The Hack Hardware Platform Specification)

概观

Hack是一个冯诺依曼结构的计算机,16位,组成部分有CPU、2个分立的存储模块(一个指令存储器、一个数据存储器)、2个内存映射I/O设备(一个屏幕、一个键盘)。

CPU执行指令存储器中的指令。指令存储器是一个只读的设备,程序是由一些外部方法写入的。

现在开始,我们认为Hack的数据存储器和指令存储器分别为RAM和ROM。

CPU由ALU、D寄存器、A寄存器、PC寄存器组成。

D、A是16位通用寄存器。D用来存数据。A用来存数据、或存放RAM地址、或存放ROM地址。

机器语言基于2种指令类型,A指令、C指令。

计算机的连接方式中,PC的输出被连接到ROM的地址输入。

一个时钟周期,计算机的操作为:取指令,执行。一个“取指令-执行”周期表明一个内存访问操作一般包括寻址指令和一个后续指令(读写指令、分支指令)。

CPU

CPU
CPU

ROM

这是内建的,我们只要把程序加载进去。

ROM32K
ROM32K

屏幕

内建的,不需要实现内部细节。

屏幕
屏幕

键盘

内建的,不需要实现内部细节。

键盘
键盘

特殊的键值:

键值
键值

总内存(Overall Memory)

包括RAM和屏幕、键盘的内存映射。

数据存储器
数据存储器

计算机(Computer)

计算机芯片包含所有必要的硬件设备来操作计算机,包括CPU、数据存储器、指令存储器、屏幕、键盘。

计算机
计算机

这些当然还是在用HDL写,然后在硬件模拟器里模拟。

这里建造的难点是CPU,其他的都很直接了。

实现

CPU的实现

最难的是CPU。

CPU就是取指令、执行。。。

先了解A指令和C指令:

A指令
A指令
C指令
C指令

了解后可得到以下数据通路:

CPU的实现
CPU的实现

其中控制逻辑(control logic)没有详细给出(图中的C)。

控制逻辑需要完成以下任务:

指令译码

一条16位的指令可能是A指令或C指令。为了知道一条指令的含义,需要将一条指令分为‘i xx a cccccc ddd jjj’几个字段。

  • i:若为0就是A指令,若为1就是C指令。
  • a cccccc:C指令comp部分。
  • ddd:C指令dest部分。
  • jjj:C指令jump部分。

A指令除了i位的低15位被解释成一个常数。

指令执行

将‘i xx a cccccc ddd jjj’这几个部分同时发送到相应的结构执行相应操作。

取下一条指令

执行一条指令的同时需要知道下一条指令。

CPU使用PC的输出作为pc端的输出。

t是现在的时间单元,默认的操作是$PC(t)=PC(t-1)+1$。如果需要goto n,需要先通过A指令把A寄存器设置为n,然后再跳转。

所以我们需要实现以下逻辑:

$PC(t)=\begin{cases}A(t-1),&jump(t) \cr PC(t-1)+1,&otherwise\end{cases}$

计算机的实现

计算机的实现
计算机的实现

总结

Hack是一种最小化的计算机。然而从定性的角度来看,Hack与大多数数字计算机非常相似,因为它们都遵循相同的概念:冯诺依曼架构。

在功能方面,计算机系统可分为两类:通用计算机,旨在轻松切换执行一个程序;专用计算机,通常嵌入其他系统,对于任何特定的应用程序,单个程序被烧录到专用计算机的ROM,是唯一可以执行的。(Hack应该是专用计算机。。。?) 除了这种差异,通用和专用计算机共享相同的架构思想:存储程序,获取-解码-执行的逻辑,CPU,寄存器,程序计数器等等。

大多数通用计算机使用单个地址空间来存储数据和指令,而Hack将其分成两个独立的部分。

在I / O方面,Hack键盘和屏幕相当简洁。

设计中的大部分努力都是为了使计算机硬件有更好的性能。 因此,硬件架构课程和教科书通常围绕诸如内存层次结构(缓存),对I / O设备的更好访问,流水线,并行性,指令预取以及其他优化技术展开,当然在这门课程中都没有涉及。

从历史上看,尝试提高处理器的性能已经导致了两个设计模式。 复杂指令集计算机(CISC)通过提供丰富的功能和复杂的指令来实现更好的性能。精简指令集计算机(RISC)使用更简单的指令集来促进硬件尽可能快速实施。 Hack计算机不属于以上2者(。。。)。

项目

project是用之前造好的芯片来实现Hack电脑平台。(我的代码见github

使用硬件模拟器测试。

可能需要查看附录A和附录B。

需要建造的芯片列表:

  • Memory
  • CPU
  • Computer