1. 0 Introduction
从与非门到俄罗斯方块的建立,课程分为两个独立的部分,硬件和软件
这门课专注于硬件部分
1.1. Background
最简单的Hello World背后也隐藏着很多神奇的事。比如你写一句printf,最后就在显示器上显示出了内容
当然这也是计算机科学中最重要的抽象过程,你不需要知道how,你只需要知道what,只需要关注高一层的逻辑就能实现你想要的功能。
- 这样的抽象是多层次的,从最简单的电子元器件到CPU到计算机到编程语言
之后的的课程,每一次都
- 只考虑单一一层的抽象
- 把低一层的接口作为已知
- 实现高一层的接口
- 测试我们的接口是能正常使用的
1.2. This Course
构建一个Hack计算机,能够沟通ROM,CPU和RAM
学习的方式:从下到上,从EE到CS
- 怎么建立一个芯片:使用模拟器仿真
设计:知道了一个芯片的抽象功能,然后设计硬件图,然后转化为硬件描述语言,最后用在仿真软件里看效果
1.3. Next Course
之前的课程中已经建立了可以运行汇编语言的电脑,在下一节课中,我们会建立更加高级的编程语言,并且建立相应的编译器、基础系统库
2. 1 Boolean Functions and Gate Logic
2.1. Boolean Functions
我们可以对布尔值进行的操作
- AND
- OR
- NOT
根据一些等价转换可以转换逻辑函数,起到化简的作用
显然我们可以根据布尔表达式求解真值表,那么如何从真值表到布尔函数?
将所有最终值为1的行表达为一个简单表达式(这个表达式只在那一行的值为1,其他行为0),然后将这些简单表达式用or连接起来
如何找最简的表达式?NP-Hard问题
任意表达式都可以用AND\OR\NOT组成的表达式表示
进阶:任意表达式都可以用AND\NOT组成的表达式表示
证明:$(\mathrm{x} \mathrm{OR} \mathrm{y})=\mathrm{NOT}(\mathrm{NOT}(\mathrm{x}) \mathrm{AND} \mathrm{NOT}(\mathrm{y}))$
- 进进阶:任意表达式都可以用NAND组成的表达式表示
这是因为:$(\mathrm{x} \mathrm{NAND} \mathrm{y})=\mathrm{NOT}(\mathrm{x} \mathrm{AND} \mathrm{y})$
证明:AND和NOT都可以用NAND表示
$$
\begin{array}{l}{\text { 1) } \operatorname{NOT}(x)=(x \text { NAND } x)} \ {\text { 2) }(x A N D y)=\operatorname{NOT}(x \text { NAND } y)}\end{array}
$$
2.2. Logic Gates
基础逻辑门:NAND、AND、OR、NOT
复合逻辑门:三个输入的AND
- 也是一种抽象,每种门的表达是一样的,但是实现可以不同(EE做的事)
2.3. Hardware Description Language
HDL只是一种描述语言,还需要一个模拟器来将所描述的结构运行起来
- 所以描述的顺序是没有关系的,但是推荐从左到右,调高程序的可读性
- 有许多不同的HDL
- VHDL
- Verilog
- 课程使用的HDL,最简化,简单
输入输出都是由外部给定的变量名
假设:我们已经有了基本的AND\NOT\OR门
设计步骤:
- 写出基本的逻辑表达式
- 画成电路图(也是由AND\NOT\OR门组成)
- 写成HDL程序
- 用模拟器测试HDL是否正确
在一个实际的项目中,芯片的设计是怎么样的呢?
- 项目中有设计师和工程师
- 设计师知道要实现的具体功能
- 决定要设计哪些小的芯片
- 对于每个小芯片,确定名字API、测试脚本、比较文件
- 让工程师根据以上内容,建立芯片
Multi-Bit Buses
我们需要对一排bit进行操作,所以,使用数组进行描述
2.4. Project 1
我们要实现的是一共15个门电路
除了常见的AND\NOT\OR,还有
- MUX\DEMUX
这两个可以作用于通信领域,将不同的信息通过通过单一的数据线进行传输
实现过程:
- 先用NAND实现AND\NOT\OR
- 然后用AND\NOT\OR实现其他逻辑
3. 2 Boolean Arithmetic and ALU
3.1. Binary Numbers
我们可以用01来表示数,不管是二进制还是十进制
对于二进制数的操作,虽然看上去有很多,包括加减乘除比大小。但是其实我们只要能够实现加法,其他的一些操作都能够简单的实现
减法和比大小显然能够轻松达成
乘法和除法不会有硬件上的实现,而是通过软件模拟
这是为了简单起见,如果要构建这样的硬件,需要很多的设计花费,这也是一个trade-off
- 溢出问题
因为加法的两个数字长是固定的,所以如果两者相加溢出了,比如8位变成了9位。那么计算机会直接忽略溢出的那个数,这是需要使用计算机的人记住的,那就是相加的结果可能不正确,如果不使用正确的长度
如何操作负数呢?
用最左边的那一位表示符号这样的实现不优雅,比如会有-0的情况,而且还要分类讨论
用$2^n-x$代表$-x$
正的范围$0…{2^{n-1}-1}$
负的范围$-1…-2^{n-1}$
加法就只需要按这个逻辑,效果是一样的
减法可以用$2^{n}-x=1+\left(2^{n}-1\right)-x$,这样因为$2^n-1$都是111111,所以不需要进位
这就是补码的背后思路:取反+1
3.2. ALU
ALU接受两个输入和一个函数$f$,输出值
- $f$是一堆已经事先定义好的函数中的一个
- 确定$f$的集合大小是一个典型的trade-off的问题
在这门课中的ALU,称为Hack ALU,ALU实现的$f$的集合是18个函数
其中比较重要的就是上面的6个控制值,他们进行了一些预处理
下面的两个zr、ng是两个寄存器,说明一些输出的性质
- zr说明了out是否为0
- ng说明了out是否为负数
设计的芯片的效率问题:总的来说基本上没有什么可以优化的,因为都是最简单的实现,没有优化的余地。
但是对于加法器ADDER,因为要计算进位,所以计算的位数越多,延时也就越多
解决方法:Carry Look-Ahead Adder
解决思路:
- 延时有线延时和门延时,我们主要关注门延时
- 改变结构,使得全加器的进入输入不来自上一级的全加器,而是超前进位
- 优点:使得延迟时间减小,固定为3级门延迟
- 缺点:如果拓宽加法器的位数,电路非常复杂
3.3. Project 2
给定:在Project 1中已经实现的所有芯片
目标:构建以下新的芯片
- 半加器:XOR+AND
- 全加器:
- ALU
- …
4. 3 Memory
Cache memory: RAM is very expensive, so there are trade-offs in the situation
- Use large and cheap RAM with low quality
- Use small and expensive RAM with good quality
从这一部分开始,会涉及到时间,其中会有一些问题包括
- 重复使用相同的硬件
- 记住系统的状态
- 协调速度
4.1. Clock
在一个时钟周期内,系统的状态是一样的
当然在物理层面,系统状态的变化不会是瞬间的,就如图中所示灰色的部分一样
- 在设计时,这部分不需要考虑,因为我们只看最后平稳的那一部分
- 实际上,时钟的频率就是根据这段变化的时间来确定的,只要间隔比灰色时间长一点就好
时序逻辑:下一时刻的输出由上一时刻的输入决定
4.2. Data Flip Flop
我们需要一个电路(1-Bit),能够记住一个状态
- 这个电路(1-Bit)能够永远记住一个状态,除非来了新的数据
- 内部结构(Data Flip Flop+Mux)
DFF和1Bit的区别:DFF是瞬时的,而1Bit的状态可以延续
DFF的电路实现
4.3. Memory Units
基本电路就是上一节提到的(1-Bit)电路,通过把许多的(1-Bit)电路顺序地连接在一起,就变成了一个寄存器,寄存器的长度w,可以是16、32、64
RAM unit
- 就是一堆有地址的寄存器叠加起来
- 在任意时刻,只有1个寄存器被选择——被读或被写
- 地址的长度$\log_2{n}$
在这节课中,会建立一些不同长度、大小的RAM
4.4. Counters
计数器的作用:递增地址,使得程序能够顺序执行
所以需要的功能有
- Reset,PC=0
- Next,PC++
- Goto,PC=n
计数器在硬件上抽象地实现了上述功能
4.5. Project 3
给定:Project 2中所实现的所有芯片
目标:构建以下芯片
Bit
寄存器
RAM(各种大小)都是16位
先建立RAM8,然后拼成RAM64,再用RAM64拼成RAM512
在Address部分,可以使用一部分作为那一个RAM的选择,还有一部分地址作为RAM内部寄存器的选择
PC
好几个MUX选择
5. 4 Machine Language
5.1. Overview
How is it possible that we can do all different things with a single hardware
- theory from Turing: one machine can simulate all other machine
- practice from Von Neumann: architect
3 Most important elements for every ML:
- Operations: what to do with this instruction
- Program Counter: what to do next
- Addresing: what to operate (where the data is)
e.g. assembly language
a instruction 010001000110010
in fact it can be view as 3 part:
0100010
0011
0010
ADD R3 R2
5.2. Elements
Machine language is the interface beteween hardware and software
5.2.1. Operations
- Arithmetic: add, subtract
- Logical: and, or
- Flow control: goto, if
Differences between machine languages:
- richness of the set of operations
- data types
5.2.2. Addressing
Accessing a memory location is expensive
Solution: Memory Hierarchy
- Registers’ number and functions are a center part of the machine language
这部分基本都是微机原理所涉及的内容
5.3. Hack Computer
课程所要设计的电脑
- 硬件部分
- 16位计算机,意味着RAM里有一堆寄存器,每个寄存器都是16位的,CPU也都能处理16位的数据指令
- 由3部分组成,ROM\CPU\RAM
- 软件部分
- 16位的指令。A instruction and D instruction