nand2tetris
《计算机系统要素——从零开始构建现代计算机(第2版)》学习记录
· 博客:https://woieha320r.github.io/nand2tetris
· GitHub:https://github.com/woieha320r/nand2tetris
概述
与非门 -> 与、或、非、抑或 -> 选择器、分解器
↓
半加器 -> 全加器 -> 自增、算术逻辑单元
↓ + DFF
寄存器 -> 随机访问内存、程序计数器
↓ + 机器指令设计
中央控制单元、内存 -> 计算机整体架构
↓ + 任一门语言
汇编器
汇编
↑ + 任一门语言实现Jack VM翻译器
Jack VM中间代码
↑ + Jack标准库 + 任一门语言实现Jack编译器
↑ ↑
Jack 源码 -> + 算法
要点
· 把复杂问题分解为可管理的模块,当使用下一层的模块时,专注于抽象而忽略其实现细节。
· 多位二进制的表达顺序是[n]~[0],不是[0]~[n]。
· 多注意二进制串的规律。
· HDL语法的=代表线路连接而非赋值。
· HDL语法可以直接置入多位0、1,并且内部节点不能直接使用子总线,需要先输出,下面是个综合的例子,用于判断in中是否含有有效位1。
// 描述:if in[16] contains 1; then hasTrue=1; fi
Or16(a=in, b[0..15]=false, out[0..7]=lowIn, out[8..15]=highIn);
Or8Way(in=lowIn, out=lowHasTrue);
Or8Way(in=highIn, out=highHasTrue);
Or(a=lowHasTrue, b=highHasTrue, out=out);
// 当有两个地方同时需要结果值时,可以被指定多次:Or(a=true, b=false, out=waitOtherOpt, out=out);