Nand2Tetris - Week 1 依据基本原理构建现代计算机

第一周

cover

介绍

这是啥?

这是一个由希伯来大学的 Shimon Schocken与 Noam Nisan讲授的课程。
教你从最简单的与非门实现计算机,并在计算机上实现操作系统,最后在构建的计算机上完成俄罗斯方块的制作。

官网主页:http://www.nand2tetris.org

Coursera课程主页:https://www.coursera.org/learn/build-a-computer

我将它的视频课程搬运到了B站,方便大家学习:https://space.bilibili.com/69824765/#/channel/detail?cid=56426

如果能科学上网的话,也可以在youtube搜索Nand2Tetris。

什么是Nand2Tetris

Nand就是与非门电路:

Nand

Tetris就是俄罗斯方块。

我们知道计算机就是由各种门电路组成的,所以作者的这个课程就是从最基础的与非门电路开始,构建一个计算机,在计算机上实现操作系统,然后在操作系统中玩俄罗斯方块。是不是很有意思?

开始

开始之前,要做点准备工作:

1. 下载初始代码与测试工具
2. 下载JDK

作者给我们提供了一个硬件模拟工具,我们通过编辑.hdl文件来描述一个门电路的逻辑,然后使用测试工具就可以测试我们设计的门电路是否正确。由于测试工具是基于Java的,需要下载安装JDk,怎么安装请自行百度。

初始代码与测试工具都在这里下载:https://www.nand2tetris.org/software

第一周01

其实第一周应该是00,但是00其实是作者为了让学者熟悉环境用的,所以我就跳过了。

.hdl文件

这个项目中,门电路是由.hdl文件来实现的,就是下面这样:

.hdl文件

在中间的注释部分,告诉了你这个门的输入输出的关系,你需要完成PARTS。

下面的IN就是输入端,OUT就是输出端。PARTS中写上如何将信号a与b输出即可(具体怎么写继续看下去)。

目标

这一周主要是完成四个门电路,以及他们的多位复合电路:

1. Not  非门
2. And  与门
3. Or   或门
4. Xor  异或门
5. Mux  多路选择器/多路开关
6. DMux 数据分配器
7. And16 16位的与门
8. DMux4Way 4通道的数据分配器
9. DMux8Way 8通道的数据分配器
10. Mux16 16位多路选择器
11. Mux4Way16 4通道的16位多路选择器
12. Mux8Way16 8通道的16位多路选择器
13. Not16 16位的非门
14. Or16 16位的或门
15. Or8Way 8通道的或门

1. Not - 非门

我们现在只有一个门,就是Nand门,看一下这个东西的真值表:

a b out
0 0 1
0 1 1
1 0 1
1 1 0

观察第二行与第四行,b为1的时候,out总是等于非a。
所以就这样实现非门了:

Not

然后来测试一下,打开Tools文件夹下的 HardwareSimulator.bat (macOS下打开HardwareSimulator.sh, 如果打开不了检查java环境是否配好)

HardwareSimulator

点击红色旗子旁边的脚本按钮,选择 nand2tetris > 01 > Not.tst,然后按左边的第三个前进按钮

image

然后脚本就会自动导入你写的Not.hdl,然后测试这个门到底正不正确,如果输入1输出也是1的话,肯定就会错了。如果没有问题,就会一直跑完,这样:

成功

这样就完成了一个门,然后我们现在有两个门了,Nand与非门与Not非门,再用这两个门来完成其他的门电路。

其他And、Or这几个门就不多说了自己做吧,直接来说Mux。

Mux 多路选择器

这个门有三个输入,a,b,sel。

当sel = false时,输出a,当sel=true时输出b。

这里我们可以自己想出一个公式,至于公式怎么出来的,可以百度一下卡诺图化简。

out = Or(
    And(
        Not(sel), a
    ),
    And(
        sel, a
    )
)

所以最后实现Mux:

Mux

基础门

基础门这里就详细写两个,其他的And,Or,Dmux都自己想办法通过已经实现的门来实现吧。如果遇到问题,可以在百度搜索卡诺图化简通过真值表化简出公式,再不济就去github上面搜索Nand2Tetris,看看别人都是怎么实现的。

复合多路门我这里也只详细介绍And16与DMux4Way,参考这两个实现其他的就好。

And16

在And16.hdl中,它是这样描述的:

And16

即: out[i] = And(a[i], b[i])

所以每个都写一遍出来就好了,不要想循环啊啥的,现在你手头只有Nand,And,Not,Or这几个门电路,所以只能手写。

最后实现方案:

And16

DMux4Way

看看介绍:

DMux4Way - 介绍

前面已经实现了DMux,当sel=0时输出{in, 0}sel=1时输出{0, in}。也就是说是sel来决定in在左边还是在右边。

在4Way中,可以看作两次选择:

PS: 在.hdl中,如果sel = 01,则sel[1] = 0,sel[0] = 1,也就是倒序的。

sel[1]决定in出现在前两个还是后两个的位置中。

sel[0]决定in出现在两个中的前一个还是后一个位置。

我们把输出{a, b, c, d}分成两部分{a, b}{c, d}

先根据sel[1]将这两部分的元素都置为相同的in或0

DMux(in=in, sel=sel[1], a=left1, b=right1); ①
DMux(in=in, sel=sel[1], a=left2, b=right2); ②

这样的结果将会是{0, 0, in, in}{in, in, 0, 0}

left1和left2肯定是相同的,right1和right2肯定是相同的。

然后根据sel[0]将前两个和后两个部分设置出来,:

DMux(in=left1,  sel=sel[0], a=a, b=b);
DMux(in=right1, sel=sel[0], a=c, b=d);

OK

基础门和复合门都可以参照这几个有代表性的来做,写完之后使用工具测试一下写的对不对,测试都通过,这一周的门电路就算全部完成了。

结语

这一周实现的这些基础电路后面会再次封装,变成功能更强大的工具。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容