简介:Coursera网课笔记,从一个门电路开始,搭建一台电脑。
课程地址:https://www.coursera.org/learn/build-a-computer
作业仓库:https://github.com/ig505gi/Nand2Tetris-homework

课程概览,part1为下面的硬件部分

Week1 布尔运算和逻辑门

1.1 运算法则

布尔运算法则

1.2 NAND

任何一个布尔函数都可以用只含有AND和NOT操作符的表达式来表示;而NAND是NOT和AND的结合,因此:
任何一个布尔函数都可以用只含有NAND操作符的表达式来表示
NAND的证明

1.3 XOR

XOR真值表和门电路图
XOR的HDL实现
ps: HDL: Hardware Design Language

1.4 Multiplexor和Demultiplexor

HDL中的subBuses:
subBuses
Multiplexor非常有用,可以从多条数据中选出其中的一条
Multiplexor
Demultiplexor可以从一条数据中按照规律解析成多条数据
Demultiplexor

Week2 加法和算术逻辑单元ALU

2.1 半加器和加法器

半加器真值表:

输入输出 a b sum carry
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

全加器真值表和接口

全加器

2.2 负数和补位

从左起第一位为0的为正数,为1的为负数,x+(-x)=0,如果不考虑进了一位,也就是2^n
负数的计算

2.3 ALU

CPU里的核心计算单元,该项目里设计的比较简单
ALU概览
ALU真值表

Week3 内存

3.1 Sequential Logic & DFF

序列逻辑可以在一个位置存放所有的信息(这句怎么理解?)
Sequential Logic
DFF: Data Filp Flop
特点:1.自己需要保存一个状态,2.该状态取决于上一个时间unit的输入
DFF

3.2 Register寄存器

1-Bit Register

内部用一个DFF和一个Mux可以实现。
1-Bit Register
16个1-Bit Register组合在一起成为一个16位寄存器

3.3 RAM

Register堆在一起组成RAM,图中的小三角代表是一个Sequential chip
RAM
读:设置address为i就好
写:设置address为i,in为v,load为1

RAM16K

我们的电脑内存是16K的,如何用HDL来写?
首先实现RAM8.png,tips:
RAM8实现tips
8个16bit-Register组成RAM8,8个RAM8组成RAM64。。。。。
RAM16K实现

3.4 Counter

计数器,内部用DFF实现,每过一个时间单位,能自动加一
Counter

Week4 机器语言

4.1 Machine Language Overview

一门机器语言应该有哪些成分?操作符,逻辑运算,流程控制,寻址功能,IO。

  • 如果硬件复杂,可以实现乘除法,机器语言可以包含乘除法,如果硬件简单,可以只有加法;
  • 同样,如果硬件复杂,可以设计负数,浮点型数据类型。如果硬件简单,只有正数

ps: 这里强调tradeoff,一些功能到底设计在硬件层面还是软件层面,由设计者决定。

4.2 Hack Computer

Hack电脑认识的机器语言叫Hack语言,由两位教授设计的。

硬件

Hack电脑的硬件部分

软件

Hack电脑的软件部分

控制和寄存器

  • ROM中加载了Hack语言
  • reset按钮一按,程序开始执行

三个寄存器用来实现Hack语言:A M D,目前先不用管CPU里如何设计,第五章会讲
Hack电脑中的Register

4.3 Hack Language

汇编语言时人能看懂的语言,转化成二进制才是机器认识的机器语言
Hack语言含有A命令和C命令

A命令

A命令定义
A命令转化二进制

C命令

C命令定义
C命令转化二进制

4.3 IO

屏幕

RAM中有一块专门管屏幕的内存screen memory map,hack电脑用512X256像素的黑白屏
屏幕和RAM

键盘

RAM中有一个16bit-Register管键盘
键盘和RAM
键盘上的键对应的code

4.4 Hack program

如果程序不终止,有人在ROM后面写入了恶意命令,就会被执行。
如何终止程序:写一个无限循环即可

1
2
3
// line 6
@6
0;JMP

内置标识符

为了方便编程,内置了一些标识符
内置标识符

分支

使语言更具有可读性,一般为大写字母
分支

变量

也是更具有可读性,不用在其他地方声明,一般为小写字母,而分支需要在其他地方声明
变量

迭代

用以上功能实现迭代的功能
迭代

指针

A寄存器实际上就是一个指针的功能
指针

Week5 电脑架构

5.1 整体架构图

架构图
架构图细节

5.2 CPU内部具体实现

非常优雅,值得细品
CPU实现

Week6 汇编器Assembler

用汇编器将汇编语言变成机器语言,可以用高等语言去写,前提是有其他电脑被造出来了。
如果没有电脑,只能手工去费时费力的去转化。

汇编器的架构:
汇编器架构