计算机系统要素,从零开始构建现代计算机(nand2tetris)
如果完成了本书所有的项目 你将会获得以下成就
- 构建出一台计算机(在模拟器上运行)
- 实现一门语言和相应的语言标准库
- 实现一个简单的编译器
而且,这本书的门槛非常低,只要你能熟练运用一门编程语言即可。本课程综合了数字电路,计算机组成原理,计算机体系架构,操作系统,编译原理,数据结构等的主要内容,搭建了计算机平台的构建的框架,并未深入细节,如果需要了解细节,可由本书作为主线,逐步完善的知识体系。
QQ交流群(含资料):289682057
课程连接
项目地址Github
本章要实现的逻辑门电路
- and and16 (与门,16位按位与)
- or or16 or8way (或门,16位按位或,8位全或)
- not not16 (非门,16位按位非)
- xor (异或)
- mux mux16 mux4way16 mux8way16 (2选1选择器,16位2选1选择器,16位4选1选择器,16位8选1选择器)
- dmux dmux4way dmux8way (解复用器,解4路复用,解8路复用)
实现总结
项目从最原始的Nand门出发,其他的门电路能够通过这个门电路构建得到。所以本章中所有的门电路都是基于Nand门来实现的,需要具备的基础是根据真值表设计门电路,需要会进行公式化简,当然这并不是必须的。
and门
输入管脚:a,b
输出管脚:out
公式如下:从公式来看使用两个与非门即可实现,其中一个输入是常量true。
and16
这个门是16位按位与门,对每个位执行与操作即可
输入管脚:a[16], b[16]
输出管脚:out[16];
伪码:
for i = 0..15:
out[i] = (a[i] and b[i])
not
非门,利用与非门实现
输入管脚:in
输出管脚:out
公式:
not16
16位按位非门,利用已经实现的非门对每位取非即可
输入管脚:in[16]
输出管脚:out[16]
伪码:
for i= 0..15:
out[i] = not in[i]
or
或门,利用与非门和已经实现的非门来实现
输入管脚:a[16], b[16]
输出管脚:out[16]
公式:
or16
16位按位或
输入管脚:a[16], b[16]
输出管脚:out[16]
伪码:
for i = 0..15:
out[i] = (a[i] or b[i])
or8way
8位全或
输入管脚:in[8]
输出管脚:out
伪码:
out = (in[0] or in[1] or ... or in[7])
xor
异或门,使用非门,与门,或门来实现,到最底层都是通过与非门实现的
输入管脚:a, b
输出管脚:out
公式:
mux
数据选择器,又称多路选择器,根据选择位,确定输出那个值
输入管脚:a, b, sel
输出管脚:out
公式:(根据真值表得到公式)
mux16
16位按位选择,只需对每一位分别进行选择即可
输入管脚:a[16], b[16],sel
输出管脚:out[16]
伪码:
for i = 0..15:
if sel == 0
out[i] = a[i]
if sel == 1
out[i] = b[i]
mux4way16
16为四选一选择器,类似分治的方法,先两两进行选择,然后再从选出的内容中进行选择
输入管脚:a[16], b[16], c[16], d[16], sel[2];
输出管脚:out[16]
伪码:
先根据,sel[0]进行选择,再根据sel[1]进行选择即可
out = a if sel == 00
b if sel == 01
c if sel == 10
d if sel == 11
mux8way16
16为八选一选择器,类似分治的方法,先四四进行选择,然后再从选出的两个中进行选择
输入管脚:a[16], b[16], c[16], d[16], e[16], f[16], g[16], h[16], sel[3]
输出管脚:out[16]
伪码:
先根据,sel[0…1]进行选择,再根据sel[2]进行选择即可
out = a if sel == 000
b if sel == 001
etc.
h if sel == 111
dmux
真值表
in | sel | a | b |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
输入管脚:in, sel
输出管脚:a, b
公式:
dmux4way
解4路复用,先根据sel的第一位进行解复用,然后根据剩余的sel位,进行解复用
输入管脚:in, sel[2]
输出管脚:a, b, c, d
dmux8way
解8路复用,先根据sel的前两位进行解4路复用,然后根据剩余的sel位,进行解复用
输入管脚:in, sel[3]
输出管脚:a, b, c, d, e, f, g, h
实际上:解复用器,就相当于由sel指定信号的输出路,由其中两路能确定4划分,每种划分中还包含两路,所以,根据剩余的sel位进行指定确定的路。