TheWinds / nand2tetris

learning nand2tetris course

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

nand2tetris

记录 nand2tetris 的学习过程

thewinds

第零周

当然是从0开始,哈哈哈

对整个课程进行简单的介绍,整个课程分12周进行,前六周主要是偏向硬件实现,后六周基于硬件(Computer)设计操作系统等。 我们一旦完成了上一层的实现,就不必关心上一层的细节。在更高的层级上我们要充分利用前面的实现。

第一周

用HDL实现与、或、非、异或门,选择器和分配器(DMux)

这一周主要介绍了HDL(Hardware Description Language)并且要求我们用HDL来实现芯片。HDL已经在Appdiex中有详细说明,另外我们要注意的是 : 1.HDL中的代码是不区分顺序的(😅和我们平时使用的编程语言不太一样),这能让我们更好理解后面的时序逻辑电路。 2.HDL中的参数(pin)赋值可以进行部分赋值,例如 in[0..15]=xxxx。 3.传出参数也可以进行部分赋值例如 out[0..3]=a,out[4..7]=b。 4.可以用true来表示全部置为1,false来表示全部置为0。

第二周

实现ALU,半加器、全加器、加法器以及自增器

这周的主要目标是实现ALU和自增器(Inc16),ALU是算数逻辑单元,是一种组合逻辑电路,给定两个输入以及操作码即可得出计算结果。本课程实现的ALU包括置0,置1,置-1,取反,取复数,相加,相减和与、或等操作。对于复杂的操作比如乘法触发我们将在更上层进行实现。

  • 另外如果对补码不熟悉的话,应该先去熟悉一下补码。

对于半加器和全加器只需稍加思考可以比较容易的用逻辑门来实现。

第三周

从这周开始引入了时序逻辑电路,这样便获得了储存信息的能力,这周主要实现了Bit位进而实现寄存器,PC(程序计数器),和RAM(随机存储器)

这周所有的原件都是基于时钟D触发器(DFF)来实现的,D触发器的特性很简单就是存储一位信息。特别需要理解的是关于时钟周期的概念,因为时钟D触发器只能在上升沿(或者下降沿)时触发变动,因此当前周期产生的影响要到下一个周期才能被触发,理解这个之后后面的试验就比较容易进行了。

用Bit组成Register,然后用Register组成RAM。在组成不同大小RAM的时候要灵活的使用Mux和DMux来减少工作量。

对于PC(程序计数器),是用来进行代码的加载和跳转的。所以相对于普通的Register除了加载之外还应该有自增和置0功能。

第四周

这一周主要了解了机器语言和Hack Machine Language,代码不过是0101...,我们终究是要通过0、1才能让计算机进行计算

Hack Machine Language是一种简单的汇编语言。

  • 关键字: @ 用于取变量地址,取指定代码行

    @[数字],@[变量名],@[保留变量]最终都会转换为@+数字如 @123

    最后被转换为A指令 A-Instruction

数字将会存入到CPU中的A寄存器里,方便之后进行取用

  • 关键字: ([标签])

    设置一个标签汇编器将会识别并转换为变迁所在的代码行数

  • 语句 : dest=comp;jmp,最终被转换为C指令 C-Instruction

    • dest为计算后储存的目的地可以为 A(A-Register),M(Memory),D(D-Register)
    • comp 为计算表达式,具体可以参考C指令的符号表
    • jmp为跳转的条件,具体可以参考C指令的符号表

第五周

这一周介绍了CPU的内部结构,以及计算机运行时指令执行步骤,最终我们设计了CPU,内存并且组成了Computer!

计算机在运行时首先通过PC获取一条指令,然后再下一次时钟周期执行该指令决定是计算还是进行跳转或者是存储数据。

通过对C-Instruction的解析可以决定是否跳转,是否存储到D或者A或M中,和进行何种计算。

通过对A-Instruction的解析可以直接将指令的地址存储在A中,进而对内存数据进行读取或者参与计算。

CPU的结构和指令集是密切相关的,并且是巧妙和优雅的,因此在实现CPU前理清思路是非常重要的。

第六周

介绍了汇编器的运作机制实现汇编器 汇编代码中的指令和机器代码是一一对应的因此assembler的实现是比较简单的:

  1. 加载预定义的符号
  2. 解析JumpLable对应的行号
  3. 替换符号为数字
  4. 转换为机器码
  • 由于没有进行词法语法分析所以此汇编器并不能进行太多的语法错误检查

前六周的课程就这样落下了帷幕,从无到有一步一步实现一个�计算机的感觉是非常棒的,在前六周�主要了解了计算机底层的运作原理。接下来让我们向OS,VM,和Compiler迈进吧!🤓

About

learning nand2tetris course


Languages

Language:Assembly 66.1%Language:Scilab 23.4%Language:HTML 6.7%Language:Go 3.8%