Nand2tetris - 布尔逻辑

本文是 nand2tetris 课程的读书笔记,不会列举过多细节,仅精炼出有意思的概念,供日后查阅。

应用程序能做的事情,本质上只有字符串操作。从应用程序代码到机器码的一系列转换,也是字符串操作,因为代码本身也是字符串。

字符串在计算机系统中,都是01串。所以,任何字符串操作,都能看作01串的函数。布尔逻辑就是来描述01之间各种变换的工具。


  • 布尔逻辑的基本操作可以只有一个:nand
  • and, or, not 等操作都能以 nand 的组合来表达。
  • 任何01串到01串的映射,都能以表格(真值表)的形式表达,我们能将真值表翻译成由 and, or, not 组成的逻辑表达式。

根据这三点,我们可以得出结论:任何布尔逻辑,都能写成 nand 的组合。从简单的组件,生长为复杂的系统,是每个人都爱听的故事 :)。

屏幕快照 2019-01-06 下午11.05.59


书中提供了一个用于逻辑设计的 HDL(硬件描述语言),这是用于制造工具的工具,另外还提供了运行这种语言的硬件模拟器,可以称之为"用于生产制造工具的工具的工具“。如果你觉得工具使用效率低下,可以制造一个更高阶的工具。

CHIP Not {
    IN in;
    OUT out;

    PARTS:
    Nand(a=in, b=in, out=out);
}
CHIP And {
    IN a, b;
    OUT out;

    PARTS:
    Nand(a=a, b=b, out=outTmp);
    Not(in=outTmp, out=out);
}
CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    Not(in=a, out=notA);
    Not(in=b, out=notB);
    Nand(a=notA, b=notB, out=out);
}
CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    Or(a=a, b=b, out=orAb);
    Nand(a=a, b=b, out=not11);
    And(a=orAb, b=not11, out=out);
}
CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    Not(in=sel, out=notSel);
    // sel = 0, result = a, else resut = 1
    Or(a=a, b=sel, out=selA);
    // sel = 1, result = b else resut = 1
    Or(a=b, b=notSel, out=selB);
    And(a=selA, b=selB, out=out);
}
CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    Not(in=sel, out=notSel);
    And(a=in, b=notSel, out=a);
    And(a=in, b=sel, out=b);
}

任何能实现布尔逻辑接口的物理媒介,都能构成计算机,当然,目前主要以电位高低来表达布尔值。数字逻辑设计时,只需要将实现基础布尔逻辑的元件当作黑盒即可,布尔逻辑是电子技术与计算机技术沟通的桥梁。