cs_notes

Nand To Tetris Coursera Course Part 1

https://www.youtube.com/playlist?list=PLNMIACtpT9BfztU0P92qlw8Gd4vxvvfT1

1. Unit 0 0 Introduction Hebrew University of Jerusalem Course

介绍课程内容与目的

本课程将在7周内帮助学生从零开始建立一整套完整的通用计算机系统,包括硬件和软件两个部分。

课程将分为两部分进行:

课程设置

本单元概要

本单元简要介绍了本门课程的整体设计目的与框架设置,重点阐述了将采取分期从硬件开始逐步构建计算机系统的学习方法。

2. Unit 0 1 The Road Ahead Hebrew University of Jerusalem Course

本课程框架

本课程将分为两个部分进行,第一部分7个周期构建计算机硬件系统,第二部分构建软件层次结构运行应用程序。

第一部分内容

第一部分从很基础的逻辑门NAND门开始,逐步构建计算机组件,形成可以运行汇编程序的计算机系统。每个周期实现一个简单模块,构建下一层抽象。

第一部分步骤

7个周期分别是:1)逻辑门2)复杂芯片3)CPU 4)内存体系结构5)输入/输出6)操作系统7)编译原语。

第二部分内容

第二部分以第一部分构建的硬件为基础,搭建软件层次化结构,能运行任何高级语言编写的程序,例如乐得进制。

第二部分未开放

Coursera上的课程只开放第一部分内容,如果无法等待,可以参考教材自行学习第二部分。

下一步 proceeded

未来两单元将进一步介绍第一二部分各步骤详情,并从下周开始,按step by step的方式进行实践与构建。

3. Unit 0 2 从NAND门到HEC计算机 希伯来大学耶路撒冷课程

本课程目标

本课程的目标是从最基础的逻辑门开始,逐步构建一个完整的通用计算机系统HEC。

计算机系统结构

HEC计算机包含CPU、RAM等主要组件。连接键盘、显示器后可以运行各种程序,比如Tetris。

本课程设计

课程分为两部分:第一部分构建HEC硬件,第二部分将构建软件层次结构。本课程只讨论第一部分内容。

从逻辑门开始

从最基础的NAND门开始,利用组合逻辑和时序逻辑来逐步构建更复杂的组件,比如 registers 和CPU。

模拟实验环境

通过下载免费的硬件模拟软件,使用描述语言对组件进行规格化设计,通过测试调试完成各组件和计算机。

六个项目安排

分别构建逻辑门、ALU、存储器系统、编写HEC机器语言程序、设计HEC结构、开发HEC汇编器。

无门槛学习

本课程假设学生无任何计算机科学专业知识,所有必要知识将在课程中提供。

下一个单元

将概览从HEC计算机到运行Tetris游戏的整个流程。

4. Unit 0 3 从HEC计算机到Tetris游戏 希伯来大学耶路撒冷课程

本课程第二部分内容

第二部分将介绍如何实现高级编程语言、编译器和运行时系统,将HEC计算机与真正的程序开发环境连接起来。

高级语言与低级语言差异

与汇编语言相比,高级语言具有丰富的功能如循环、数据类型、抽象等。它更符合程序员习惯。

实现高级语言需要的内容

开发Jack高级编程语言、为Jack编写编译器、构建运行时类库和小型操作系统。

实现之后

此时环境就是一个真正的编程入门课程需要的环境。开发人员可以使用高级语言进行常规开发了。

第二部分内容未开放

本课程仅提供第一部分内容。若无法等待,可参考课程书和网站自行学习第二部分。

下一单元预告

将介绍本课程第一个项目的内容,包括如何找到课程网站和提交练习作业。然后正式启动计算机构建学习。

5. Unit 0 4 项目0概览 希伯来大学耶路撒冷课程

项目0任务

项目0包含2项任务:

  1. 下载NanoTetris软件包。

  2. 提交文件file.txt完成项目0。

下载软件包

进入NanoTetris官网,点击软件下载页面,下载并解压zip文件到桌面。

软件包目录

目录包含tools和projects两个文件夹:

项目0文件

打开projects文件夹下的零零零文件夹,找到单文件file.txt。

完成项目0

将file.txt通过Coursera页面提交,检查学生是否可以正常提交作业。

下一步

下载并理解软件包目录结构后,就可以完成项目0的提交任务了。下一单元将开始构建计算机。

6. Unit 1 1 逻辑代数 希伯来大学耶路撒冷课程

0和1作为基本单元

计算机内部只使用0和1来表示和存储信息。0和1分别代表两个不同的物理量,可以被系统保持。

逻辑运算

0和1可以进行AND、OR、NOT等基本逻辑运算:

真值表

可以用真值表来描述逻辑公式对应每个输入组合的输出结果。

逻辑公式

可以用逻辑运算组合成更复杂的逻辑公式,并且通过真值表或代换来求解公式。

逻辑恒等式

Boolean Algebra中有一些恒等式,如交换律、结合律、分配律等。它们可以用于简化或等价转换逻辑公式。

使用逻辑代数

可以使用逻辑恒等式来操作和计算布尔表达式,进而得到简化或等价的表达式形式,也可以直接使用真值表验证等价性。

分析函数

可以定义接受多个逻辑输入的函数,并用真值表完整描述该函数的输入输出关系。

7. Unit 1 2 逻辑函数的综合 希伯来大学

从真值表构造逻辑函数表达式

给定一个函数的真值表,我们可以通过以下步骤构造对应的表达式:

  1. 按照真值表中值为1的行,写出一个子表达式,使其只在该行值为1。

  2. 对每个值为1的行重复上述步骤,获得多个子表达式。

  3. 将所有子表达式用或运算连接起来,作为最终表达式。

通过真值表重组表达式

得到表达式后,还可以通过观察真值表重新整理表达式,例如合并相同输入的子表达式。

表达能力的理论保证

任何函数都可以用与、或、非三个二元逻辑门表达出来。甚至只需要一个隐式二元门NAND就可以。

从逻辑门到计算机逻辑

掌握了逻辑函数的构造原理后,我们开始将它转化为计算机实际逻辑电路的思考模式。

项目0概述

本单元结束后,开始项目0学习如何获取与提交第一个作业。之后将开始构建计算机硬件。

8. Unit 1 3 逻辑门 希伯来大学耶路撒冷课程

NAND门

NAND门是本课程使用的基础逻辑门,它有2个输入和1个输出。当两个输入都为1时,输出为0;其他情况下输出为1。

其他逻辑门

还将提到AND门、OR门和NOT门。AND门输出为1需要两个输入都为1;OR门输出为1需要其中一个输入为1;NOT门用于逻辑求反。

复合逻辑门

可以组合基础逻辑门构建更复杂的逻辑门,比如3输入的AND门。

逻辑门接口与实现

接口定义逻辑门功能,实现描述内部构成。同一个接口可能有多种实现方式。

电路实现

可以用继电器等电路配件实现逻辑门硬连接电路。但本课程不讨论物理实现细节。

使用HDL描述电路

将在下一模块介绍HDL语言,用于描述和构建更复杂的逻辑电路与 Chips。这一模块给出逻辑门基础知识。

项目展望

将使用HDL语言实现基础逻辑门电路,逐步构建计算机系统。下一单元将介绍HDL语言。

9. Unit 1 4 硬件描述语言 希伯来大学

HDL语言概述

HDL(Hardware Description Language)是一种专门用于描述数字电路和硬件设计的硬件描述语言。

HDL的主要用途

  1. 描述数字电路的结构和行为。

  2. 作为电路设计的文档。

  3. 作为电路仿真的输入,可以验证电路设计是否符合需求。

  4. 作为电路综合的输入,实现电路设计。

HDL的主要类型

  1. 結構描述語言(SDL):描述硬件結構。

  2. 行為描述語言(BDL):描述硬件行為。

  3. 混合語言:支援結構和行為描述。

本课程使用的HDL

将使用结合结构和行为描述特点的Verilog语言进行硬件描述。

Verilog关键特点

  1. 模块与端口描述结构。

  2. 逻辑判断描述行为。

  3. 支持时序与并发描述。

  4. 可以进行仿真与结合来实现电路。

下一步内容

将学习Verilog基本语法,并使用Verilog描述基础逻辑门电路设计。

10. Unit 1 5 硬件仿真 希伯来大学耶路撒冷

硬件仿真的重要性

设计电路前需要验证其是否符合功能要求,这需要用仿真软件对设计进行测试。

仿真软件

主流仿真软件包括ModelSim、Xilinx ISE/Vivado等。它们能对Verilog、VHDL文件进行功能验证和时序分析。

仿真流程

  1. 使用HDL对电路进行描述

  2. 编译HDL文件生成诸如“test bench”等测试环境

  3. 指定输入和期待的输出值

  4. 仿真软件运行test bench对电路进行模拟

  5. 检查输出是否与期望结果匹配

  6. 分析错误原因,修改HDL代码重新仿真

示例仿真案例

将使用ModelSim软件对NAND门电路进行功能和时序验证,检查其输出是否符合逻辑表描述。

逻辑性与时序性

功能仿真检查逻辑功能是否正确,时序仿真检查信号在不同时钟边沿之间的关系。

后期内容

随着设计复杂程度的增加,将学习更多高级仿真技巧,如崩溃分析等。后续也将应用仿真于后续项目开发。

11. Unit 1 6 多位总线 希伯来大学耶路撒冷课程

多位总线概念

多位总线指多个位同时作为一个实体进行操作的信号集合。它能提高设计水平的抽象层次。

HDL对多位总线的支持

HDL需要支持对多位总线的定义、赋值和操作。Verilog通过方括号定义总线的长度。

添加器示例

以16位二进制加法器为例,使用两Input和一个Output定义多位输入输出形式。

三数加法器示例

内嵌使用16位加法器,通过临时变量操作多位总线进行三个数相加。

访问总线单个位

通过在名下标位号可访问总线指定位,如取4位总线的最后一位。索引从0开始。

并行位操作

定义多个逻辑门并行操作两个总线对应位,实现按位逻辑运算如与运算。

分割与组合总线

可将一个总线分割成子总线,也可以组合子总线构造新的总线。通过指定范围定义子总线。

其他语法细节

允许重叠子总线、自动推断内部信号宽度、用true/false批量置总线等细节。

项目内容预览

介绍本周项目将实现多种多位运算单元,包括多路复用器等,利用多位总线概念进行高层次描述。

12. Unit 1 7 项目1概览 希伯来大学耶路撒冷

项目要求

使用Verilog描述和实现多种多位数字电路模块,测试是否符合设计规格。

模块类型

  1. 多路复用器:选择一个输入通道输出。

  2. 缩放器:缩放输入总线的位数。

  3. 减法器:实现二进制数的减法运算。

  4. 控制器:根据控制输入选择模块的操作方式。

设计流程

  1. 明确模块接口和功能。

  2. 使用Verilog描述模块结构和行为。

  3. 编写测试环境进行功能验证。

  4. 交叉比对设计与测试结果。

  5. 分析不符合原因进行修改。

评估标准

模块是否按规格实现iface定义和功能,测试结果是否一致。

提交要求

将Verilog代码以及测试报告通过指定途径提交评审。

后续内容

项目完成后学习数字电路优化方法,深入探讨复杂电路设计方法论。

wrap up

总结本周学习内容,预期下周项目工作流程。此项目为后续学习踏脚石。

13. Unit 1 8 Perspectives 希伯来大学耶路撒冷课程

在每周课程最后的这一单元,将回答设计硬件和软件系统时经常提出的问题。

本周课程设计基础逻辑门后的常见问题包括:

  1. 是否可以使用非NAND门作为计算机的基本构成单元?答案是可以的,也可以使用NOR等门。

  2. 如果需要真正实现NAND门,应该怎样做?使用MOS晶体管可以构成简单的NAND门电路。

  3. HDL与实际工程中使用的HDL有何不同?工业级HDL如Verilog更复杂,但本课程设计了简单的HDL满足学习需要。

  4. 如何设计包含几百个组成部分的复杂集成电路?没有通用方法,需要分解问题,利用优化工具及不同技术逐步实现。

  5. 其他问题也欢迎提出,学生可以在课程论坛互相解答。讨论不涉及具体物理实现细节,着重计算机科学概念。

本单元解答问题的同时,也介绍了硬件开发中常见的一些思路和方法。学生可以提出任何与课程相关的问题进行探讨。

14. Unit 2 1 二进制数制 希伯来大学耶路撒冷课程

数字的二进制表示

使用0和1来表示数字,每个位置代表2的不同幂,从右到左依次是1、2、4、8等。

二进制数到十进制数的转换

根据每个位置对应2的幂来求和,即为该二进制数对应的十进制值。

十进制数到二进制数的转换

将数字表示为2的不同幂之和,对应位置为1,否则为0,即为其二进制表示。

8位二进制数字的表示范围

8位二进制数最高表示127,因为需要预留符号位表示正负数。

二进制与十进制转换的应用

了解二进制表示对计算机科学非常重要,数字在计算机内部仅以二进制表示。

下一步内容

学习如何在二进制数制下进行基本的算术运算,如二进制加法。这为后续学习码表示和电路设计奠定基础。

小结

概述本模块主要内容为理解任意进制下的数字表示方法,以及在计算机系统内数字的二进制表示形式。

15. Unit 2 2 Binary Addition Hebrew University of Jerusalem Co

二进位数字的表示与操作

上一单元我们学习了如何用二进制位表示数字。现在我们学习如何对二进制数字进行加法运算。数字的操作是计算机最重要的基础,我们主要学习加法,其他操作如减法、乘法、除法也将依此而来。

二进制数字的加法原理

和小学时学加法一样,二进制数字加法从个位开始依次相加。但二进制只有0和1两个值,1+1=10需要进位。例如1+1=0,携带1。这样一位一位相加完成。

单比特加法器

为了实现二进制加法,我们先学习如何对两比特进行加法。不带进位时,就是半加器。它接收两个比特a和b,输出和与进位。有8种输入组合,输出明确规定。

完整比特加法器

考虑到可能有前面位产生的进位,我们再构建完整加法器。它接收三个比特a,b和进位c作为输入,输出和与新的进位。其工作过程与半加法器相同。

N比特加法器

要实现任意长度二进制数字的加法,我们使用多个完整加法器连接起来,依次从低位到高位相加。半加器处理最低两比特,其余使用完整加法器。这样重复N次即可完成N比特的二进制加法。

溢出问题

在实际运算中,如果最后的进出值无法存储,会产生溢出。计算机直接舍弃超过长度的部分,做模运算。但这实际上不是整数加法,而是模数加法。用户需要了解此限制。

总结

通过学习单比特和多比特加法器的工作原理,以及加法器连接组成多比特加法器,我们掌握了二进制数字的基本加法知识。这是计算机中进行其他操作的基础。

16. Unit 2 3 Negative Numbers Hebrew University of Jerusalem C

负数的二进制表示

正整数我们使用n位二进制表示0到2^n-1之间整数,但计算机也需要处理负整数。我们可以用第一位作为符号位表示正负,但会出现负0等问题,不直观。

二补数表示法

二补数表示法使用n位表示-2^{n-1}到2^{n-1}-1之间整数。如果要表示负数-x,则表示正数2^n-x。例如4位二进制,负3表示为13(即1001)。

二补数加法与减法

利用二补数表示法,我们可以直接使用之前设计的正数加法电路进行加减运算。原因在于二补数本身也采用模2^n运算,加法结果也同样是模2^n。这样正负数运算都可以通过加法来实现。

求负数运算

要求一个数的负值,可以利用2^n-1全部为1的特点,先将输入数从2^n-1中减去,得到其补码,然后再加1即为负值。这对硬件来说是一个很简单的操作。

总结

通过二补数表示法,我们可以将负整数很好地表示在计算机中。什么操作对正整数有效,对负整数也同样适用,都可以通过加法来实现。这为计算机算术逻辑单元的设计打下了良好基础。

17. Unit 2 4 Arithmetic Logic Unit Hebrew University of Jerusa

算术逻辑单元

算术逻辑单元(ALU)是计算机中执行算术和逻辑运算的主要部件。它能进行加减乘除与非或非等基本操作。

ALU的基本概念

ALU以二进制数作为输入,包含操作码以决定进行何种运算。它执行完计算后输出结果。多数ALU同时支持8位与16位操作长度。

ALU内部概述

ALU内主要包含加法器与逻辑门电路。加法器能完成加法与减法。逻辑门电路支持与非或非等逻辑运算。内部还包含控制电路根据操作码选择计算逻辑。

具体设计

加法器采用全加器或半加器组成。逻辑电路使用与非或非门实现。控制电路通过解码操作码选择输入数输出方式。部分ALU还包含状态标志输出倍增或是否产生进位等信息。

二补数表示在ALU中的应用

通过二补数表示负数,ALU原有加法电路即可完成加减运算,无需再增加电路。这大大简化了ALU的设计。ALU设计完全获得负数运算语义,为CPU工作提供了重要基础。

18. Unit 2 5 Project 2 概览 希伯来大学耶路撒冷

项目2需要实现的电路芯片

本项目需要实现半加器、全加器、16位加法器、加一器和ALU5种电路芯片。

半加器

半加器实现两比特与运算,输出和和进位。可以使用与门和异或门构成。

全加器

实现三比特与运算,可以由两个半加器和额外门电路构成。

16位加法器

由16个全加器串联组成,将进位传递到下一级。

加一器

对单个输入加1,输出结果。

ALU

根据操作码进行算术/逻辑运算,包含加减乘除与非或非等运算。

项目要求

使用Verilog描述上述电路,通过仿真验证功能是否正确。

实现方式

可以引用项目1实现的基本门电路,使用仿真器内置版本实现其他未描述电路。

提交内容

Verilog代码和测试报告。

19. Unit 2 6 Perspectives Hebrew University of Jerusalem Cours

本周内容回顾

本周我们设计了ALU,探讨了计算机系统功能分层的概念。ALU实现基本运算功能,更复杂运算由操作系统提供。

标准电路与本课程ALU

半加器、全加器等基本电路标准化。本课程ALU实现简单,适合课程目的。实际ALU功能较复杂。

ALU为何不包含乘除法

乘除法运算通过操作系统数学库提供。软硬件功能分层设计,使得程序开发更简单高效。

是否提高ALU效率的可能

除了加法器可采用提前产生进位的做法外,其他部分实现已比较高效。

使用内置电路 advantages

使用内置电路能进行单元测试,提高问题定位效率。避免运行效率低下的情况。

本课程设计总结

通过分层设计,采用抽象模块化思想,实现了计算机系统从基础电路到ALU的设计,为下一课程奠定基础。

20. Unit 3 1 序列逻辑 希伯来大学耶路撒冷C

时序逻辑与组合逻辑的区别

组合逻辑是输入随后产生输出,输出仅与当前输入有关。时序逻辑可以记住过去输入,输出与当前和过去输入有关。

时序逻辑的基本概念

时序逻辑使用时钟将连续时间切割成离散的时钟周期。每个时钟周期内,逻辑电路根据上一时钟周期输入计算输出。

时序逻辑实现状态变化

时序逻辑允许使用同一线路记录输入输出,通过更新过去值实现状态的变化。例如周期性更新单比特线路值,从一个状态转到另一个状态。

时序逻辑电路的工作原理

时钟驱动电路按时钟周期工作。每个周期内读取上一周期输入,输出在本周期计算并保存,成为下一个周期的输入。这样可以记忆并积累过去信息。

序列逻辑的应用

通过记录内部状态,时序逻辑可以实现复杂功能,如计数器、存储器和CPU等。为计算机系统提供基础,但需要考虑时钟速度与逻辑门延迟之间的匹配关系。

21. Unit 3 2 联接件 希伯来大学耶路撒冷Courser

简单RS联接件

RS联接件可以存储一个bit,具有两个输入R(设置)和S(重置),以及输出Q。当R=1,S=0时,下一个时钟边沿Q=1;当R=0,S=1时,Q=0;其他情况Q保持不变。

D联接件

D联接件用于存储数字信息。它具有一个数据输入D,一个时钟输入CLK。在时钟上升沿,输出Q同步追随D的电平变化。

普通 usage

若时钟周期较长,可以以半个周期为一组,第一组设置D值,第二组让Q追随D。可实现在一个时钟边沿内完成数据写入和提取。

边沿触发与水平触发

边沿触发设备仅在时钟边沿响应,水平触发设备则在整个时钟电平期间响应。D触发器为边沿触发,响应时钟的上升或下降沿。

触发器的组合

通过组合多个触发器,可以存储多bit信息。例如4个D触发器组合成一个4位寄存器,可存储4bit数据。这为CPU和存储器等器件提供了底层支撑。

22. Unit 3 3 内存单元 希伯来大学耶路撒冷Cours

RAM

RAM是随机存储器,允许任意顺序读取和写入数据。它使用行列地址来访问单个字存储单元。

SRAM

SRAM使用反相触发器实现存储单元,速度快但面积大。数据保持在翻转状态直到被更新。

DRAM

DRAM使用电容来储存每个比特,读取速度快但脱电快,需要周期性刷新保持数据。占地面积小,成本低。

存储单元

包含位线用来读取数据和控制线用来选择单元。每个单元包含一个储存元素和访问裁决来选择读取写入数据的单元。

读写过程

向地址线上提供行和列地址可唯一选中单元。读取时检测位线电平,写入时拉低写入控制线定制数据电平。

内存纠错

由于动态数据脱漏,添加校验位检测和纠正单个错误比特。ECC技术能检测和更正多比特错误。

缓存

CPU和内存速度差异大,使用高速缓存提升平均访问速度。缓存读取命中率高可大幅提升系统性能。

23. Unit 3 4 计数器 希伯来大学耶路撒冷Coursera

计数器的用途

计数器用于产生一系列数字,控制程序顺序执行。比如烤奶酪配方中每一步骤对应的数字,计数器输出给机器人执行。

计数器的基本操作

初始化(reset)计数器为0,默认递增(inc)计数值+1,可指定加载(load)给定值。支持从头开始、指定某步及跳过步骤等多种控制流程。

硬件实现计数器

以16位计数器为例。输入16位值和3个控制线(reset、load、inc),根据控制线状态输出值或计算值得下一个状态。

仿真计数器运行

加载内置的16位计数器硬件模块,设置输入值和控制线,观察输出值的变化。支持reset、load给定值、inc递增,演示其基本功能。

计数器在系统中的应用

作为程序计数器,计数器记录软件执行的当前位置,支持顺序和分支执行。作为定时器,计数器实现时间触发功能。

本课概述

介绍计数器在系统中的应用场景和作用,以16位计数器为例详细说明其工作原理和硬件实现方法。给出计数器模组的运行示例。

24. Unit 3 5 项目3概述 希伯来大学耶路撒冷

项目3内容

项目3是基于项目1和2设计的基础组件,设计记号存储器(Register)、串联片(RAM)等多个器件。

1位寄存器

它包含数据输入D和时钟CLK,CLK上升沿时Q追随D变化。

16位寄存器

由16个1位寄存器组合而成,可以存储16bit数据。

8 x 1bit RAM

包含8个1位寄存器,有地址输入addr可选择读写其中一个寄存器。

64 x 1bit RAM

由8个8 x 1bit RAM组合成,地址输入分为上下段选择合适RAM和内部寄存器。

512 x 1bit RAM

依次扩展地址位数,层层组合前级RAM得出。

16K x 1bit RAM

最终建立16,000个1bit存储单元的大型RAM。

计数器

模拟CPU程序计数功能,支持设置值、递增、停止等操作。

项目实现

基于给定的接口定义和HDL模块,分层实现各器件,并进行功能验证。

25. Unit 3 6 Perspectives 希伯来大学耶路撒冷课程

编写Flip-flop门

使用两个互相连接的NAND门可以实现记忆功能,输出根据上次输入状态的值保持稳定。最后用外围电路完善Flip-flop特性。

计算机内存类型

RAM用于存储数据和指令,损失电源后内容消失。ROM读只存,非易失,存储启动程序。Flash兼具RAM和ROM优点。Cache实现快速内存的功能。

问答质疑点概述

回答常见问题,解释本周概念:NAND门原理只是一种,现实中用各种物理方法;内存不止RAM,还有ROM、Flash等不同类型;逻辑上看各内存相同,外形不同。

内存性能优化

Cache用于解决内存速度与成本的平衡,利用高访存率将重用数据存储在快速缓存中。CPU包含多级缓存,速度越快尺寸越小。

本课概述

回答经常询问的问题,总结本周重点,说明各类内存在逻辑上均采RAM结构。强调理解内存原理比关注具体实现更重要。

26. Unit 4 1 汇编语言概述 希伯来大学

计算机结构层次

计算机系统从低到高分为物理层、数学逻辑层、汇编层和高级语言层。

汇编语言特点

汇编语言直接映射到机器码指令,将机器语言带入符号名称。与机器码对应,但使用简单的记号名称表示指令。

汇编语言程序实施

汇编过程将汇编源代码翻译成机器码对象文件或可执行文件。目标文件包含代码及数据段信息。链接器将对象文件链接成可加载运行的可执行程序。

常见汇编器指令类型

包含数据操作指令、控制转移指令、运算指令等。指令操作数包括寄存器、内存位置及立即数。支持条件跳转和循环结构。

汇编与机器码比较

汇编语言采用简短符号纪录机器码指令功能,使用相对人性化记号表达机器底层指令功能,便于程序员阅读和编写。但仍与机器直接对应。

汇编语言的应用

用于低级系统编程,嵌入式系统编程,操作系统内核开发以及性能优化等场景。 mastery汇编能力对系统编程人员很重要。

27. Unit 4 2 机器语言元素 希伯来大学

指令格式

包含操作码、寻址方式和操作数。操作码指定执行指令类型,寻址方式表示操作数位置,操作数为数据。

机器码表示

使用二进制位模式组织表示指令及参数。操作码存储在指令开始的数个bit位,后续bit表示操作数。

寻址方式分类

根据操作数位置分为立即数方式、寄存器方式和内存寻址方式。内存寻址按方法分为直接寻址、寄存器相对寻址、基址寻址等。

指令示例

如加法指令ADD:操作码为0010,寻址方式为立即数方式,操作数为8位二进制数。移动指令MOV:操作码1001,寻址方式为寄存器寻址,源寄存器和目的寄存器编号。

计算机组成结构

包含控制单元、算术逻辑单元(ALU)和寄存器单元。控制单元将指令解码成控制信号,ALU完成算术运算,寄存器用于储存中间结果。

程序计数器

专用寄存器存储当前执行指令地址,在指令执行后自动加1完成序数递增,实现程序顺利执行。指令寻址始终基于程序计数器地址。

中央处理单元工作过程

从程序计数器读指令->解码指令->产生控制信号->执行指令->修改状态->更新程序计数器地址->循环下次指令执行。

28. Unit 4 3 Hack计算机与机器语言 希伯来大学

Hack计算机系组成

central processing unit(CPU)、256字节内存和16个16位寄存器。通用目的累加器为寄存器R0,其他寄存器用于存储中介数据。

CPU工作方式

CPU工作周期有FETCH(取指令)、DECODE(译码)、EXECUTE(执行)三个阶段。每次从内存取一条指令进行处理。

Hack指令格式

包含3个字节,第一字节为操作码,后两字节为操作数ocamp00格式:XXX AAA(X为操作码,A为操作数地址)。

机器码指令类型

包含算术运算指令、移位指令、加载指令、存储指令、跳转指令等。支持立即数寻址、寄存器寻址、直接寄存器寻址模式。

寻址方式

根据第二字节高4位A(地址)确定操作数地址计算方法。000-110为直接寻址,其他为寄存器寻址法。

硬件接口

硬件提供16根地址线和16根数据线,CPU通过这些线路控制内存和寄存器通讯,读写数据。

汇编与机器码之间映射

汇编指令符号对应功能清晰的机器码操作指令,两者一对一对应执行序列成为计算机程序运行的基础。

29. Unit 4 4 黑克语言规范 希伯来大学

黑克机器语言规范

前几单元已经描述了A指令和C指令的符号语法和二进制表达形式。本单元将总结黑克机器语言所有内容。

A指令格式

操作码为0,后跟15位二进制数代表要加载到A寄存器的值(0-2^15-1范围)。

C指令格式

操作码为1,后续比特指定计算、目标和跳转条件。计算用7位,目标3位,跳转3位。每部分都有映射表对应二进制码。

程序举例

程序由一系列指令组成,允许空行和注释以提高可读性。此例程不需要理解内容,只用于看程序格式。

程序 translating

程序需翻译成二进制码才能在计算机上运行。人工或程序可以执行这一步。二进制程序加载后直接执行。

错误处理

如果程序运行有误,需要 debug 原程序、重新编译、重装并运行,直到满意为止。这套流程构成软件开发基本流程。

总结

本单元总结黑克机器语言所有元素,并举例阐述如何将程序翻译并运行。为下一单元入门IO控制打下基础。

30. Unit 4 5 输入输出 希伯来大学耶路撒冷课程

计算机与外部世界交互

计算机需要与外部设备进行通信,同时对输入输出进行控制管理。IO系统实现这一功能。

Hack计算机IO系统

采用IO端口作为数据与指令的传输通道。端口地址范围0-15,低地址由显示屏占据,高地址由键盘占据。

显示输出

通过设置端口0-7的值实现输出,每个端口对应LED一个亮度级数。值越大,亮度越高。端口值写入后立即反应。

键盘输入

按下键后,键值保存到端口14-15。读端口值即可获取键值。读到新值后,原值清零以示该键已被读取。

C指令控制IO

C指令计算域可以指定IO操作,如把端口写为1表示输出1到显示屏的LED。条件跳可以等待键盘输入触发。

软件控制硬件

通过设置IO端口的值,软件可以控制硬件设备的工作。这为计算机与外界进行信息交换奠定了基础。

总结

IO系统实现计算机与外设信息交互。黑克计算机设置专用端口进行输入输出控制。C指令可以对IO进行管理与操作。

31. Unit 4 6 黑克编程(一) 希伯来大学耶路撒冷

本单元目标

介绍HOW程序设计基本概念。利用之前学习的黑克语言进行编程实现简单功能。

输入功能程序

通过读取键盘端口获取按键值,如果键值不为0则重复读取直到换行结束程序。运行过程需要人工输入按键。

输出功能程序

通过设置显示屏端口可以输出字符。程序将字母A输出到屏幕以检验 basal功能。

计算功能程序

利用A等指令进行简单数学运算,如加法、减法等。程序实现1+2的运算过程。

控制结构程序

通过循环和条件控制结构可以实现更复杂任务。本例通过if-goto实现是否大于10的判断。

程序开发流程

编写源代码、手动汇编成二进制、加载运行测试、调试修改源代码、重新汇编、重复上述步骤至满意为止。

总结

初步掌握HOW流程,利用黑克语言实现简单单元任务。为后续学习提供基础,并掌握软件开发基本流程。

32. Unit 4 7 黑克编程(二) 希伯来大学耶路撒冷

程序重复结构

利用C指令定址跳转,可以实现循环功能。例程通过while实现打印1到3的循环。

递归函数

通过自调用实现递归。例程计算阶乘函数,调用时传参到寄存器中。

子程序

通过跳转调用带入参和跳回的子程序。阶乘例程实现递归版本的同时利用子程序设计封装计算细节。

利用内存作为栈空间,入栈时下移指针写入新值,出栈时指针上移读取原值并移除。

高级结构

程序设计随难度的增长需要更复杂的模块化。例如面向对象、并行等高级结构。

总结

掌握更复杂的控制流程和结构设计,以面向过程的方式进行模块化编程。为后续学习数据结构和算法奠定基础。

33. Unit 4 8 黑克编程(三) 希伯来大学耶路撒冷

前置知识回顾

回顾前面学习的黑克指令、结构以及开发流程。

数组

利用内存连续区域实现数组存储。例程计算数字和存储在数组中。

字符串

定长字符串存储在数组中,操作包括比拼、连接等。例程实现两字符串连接。

结构体

通过内存块连续存储不同类型数据来实现结构体的抽象封装。

数据结构

数组、栈、队列等常见数据结构,利用内存有效组织和操作数据。

函数封装

面向过程的模块化思想,通过参数传递实现独立可复用的功能单元。

程序样例

例如模仿计算器实现加减乘除等基础运算。

总结

掌握黑克语言强大功能,利用数据结构与函数来设计模拟现实应用。为后续学习算法奠定基础。

34. Unit 4 9 项目四概述 希伯来大学耶路撒冷

项目内容

利用前述黑克编程知识完成一个较大规模的程序设计项目。

项目要求

  1. 使用黑克语言完成。
  2. 实现相对复杂的功能模拟。
  3. 使用程序结构和数据结构。
  4. 包含注释与文档说明程序流程。
  5. 可自动运行并实现功能。

参考项目实例

  1. 记事本应用
  2. 计算器
  3. 2048小游戏
  4. 排序和搜索算法实现
  5. 简单操作系统模块

项目开发流程

  1. 确定需求与设计计划
  2. 编写代码与测试
  3. 反复完善直至验收
  4. 提交与展示

评价标准

  1. 完成程度
  2. 代码结构与可读性
  3. 功能实现难易度
  4. 流畅度与错误处理
  5. 总体质量

总结

通过独立完成项目,锻炼实践能力,并获得阶段评价。项目开发为后续学习与工作奠定基础。

35. Unit 4 10 观点 分享 希伯来大学耶路撒冷课程

回顾黑克机器语言与典型机器语言区别

黑克语言简单,设计用于简单平台。其它机器语言指令更丰富,类型多样。但软件层更高层次也可实现。

黑克语言指令结构

16位指令限制无法一条指令指定操作与操作数。需分两条指令指定。这一点与其它机器语言不同。

编程方式

黑克语言需要先指定地址,再指定操作。其它语言可一条指令指定。这是由16位长度限制造成的。

语法选择

考虑硬件直接操作内存与寄存器,语法设计简洁高效。与乐意保持一定区别。

真正编程

程序员编写高级语言代码,由编译器将其转换成机器码。了解机器码有利于优化。少部分应用需直接修改机器码。

总结

回顾黑克机器语言特点,解释其与传统机器语言的区别与选择原因。概述真正的程序开发流程,说明机器语言与高级语言的关系。

36. Unit 5 1 范纽曼架构 希伯来大学耶路撒冷

上周内容回顾

回顾了计算机的基本功能和架构设计。

范纽曼计算机架构

指一个计算机只需一个处理器即可运行任意软件,实现通用计算。它将程序和数据存储在同一块内存中。

计算机组成部件

主要由算数逻辑单元(ALU)、寄存器、内存及控制线组成。内存还有程序存储区和数据存储区。

数据流动

数据、地址和指令通过总线在部件间传输。如数据总线、地址总线和控制总线。

ALU工作原理

ALU通过数据总线输入输出操作数,通过控制总线获取指令类型,执行算术或逻辑运算。

寄存器工作原理

寄存器通过数据总线读写数据,部分寄存器通过地址总线输出内存地址。

内存工作原理

通过地址总线接收地址,通过数据总线读写程序指令和数据。

总结

阐述了范纽曼计算机架构的基本组成和数据传输方式,为下一步介绍指令执行过程奠定基础。

37. Unit 5 2 指令取指执行周期 希伯来大学耶路撒冷

计算机的基本工作原理

计算机按顺序执行一条指令后另一条。取指后执行指令的周期叫做“取指执行周期”。

取指阶段

从程序内存中取出下一条指令,程序计数器(PC)保存下个指令地址,写入内存地址端,读出指令码。

执行阶段

指令码经控制总线控制ALU运算、数据来源等。例如加减法、寄存器或内存读写等。

内存空间冲突

取指阶段取程序,执行阶段取数据,但程序和数据同在内存,地址端只能输入一个。

解决方案

使用多路分选器选择地址来源。取指阶段PC输入,执行阶段数据地址输入。指令保存在指令寄存器供后期使用。

其他方法

隔离程序内存和数据内存,分别设置地址,不需切换。称为哈佛结构。

总结

详细阐述计算机基本运行流程,取指执行周期的原理以及内存空间分配冲突的解决方案。

38. Unit 5 3 中央处理器 单元 希伯来大学耶路撒冷

CPU的组成部件

CPU是计算机的核心执行部件,主要由内部总线、ALU、寄存器组和控制单元组成。

内部总线

传输指令、数据和地址,包括指令总线、数据总线和地址总线。

ALU

算术逻辑单元,执行加减乘除与非等运算指令,输出计算结果。

寄存器组

存储临时数据和地址,包括程序计数器(PC)、指令寄存器等。

控制单元

根据指令码控制其他单元运行时序,例如读取源操作数、执行运算、写入目的操作数等。

工作流程

1) 指令总线输入指令码

2) 控制单元根据指令码控制ALU和寄存器组

3) 执行计算或数据移动操作

4) 写回结果,完成一个指令的执行

总结

阐述CPU是计算机的核心,其组成部件和基本工作流程,以实现指令的取指和执行。

39. Unit 5 4 德克计算机 希伯来大学耶路撒冷

引入黑克计算机

为了学习计算机结构原理,我们将使用一款简单的16位教学计算机——黑克计算机。

计算机体系结构

黑克计算机也基于范纽曼结构,主要组成是:内存、寄存器、ALU和控制单元。

内存

容量为64个16位存储单元,存储数据和机器指令。

寄存器

包括16个16位通用寄存器R0-R15和程序计数器PC。

ALU

执行加减乘除与非等算术逻辑运算。支持16个指令。

控制单元

根据当前指令控制数据的传输和运算流程。

实现特点

  1. 指令长度固定为16位

  2. 两条指令实现单条指令功能

  3. 简化寻址模式

总结

介绍了黑克计算机的规模、结构组成、功能特点,作为学习计算机结构的示例。

40. Unit 5 5 第五项目概述 希伯来大学耶路撒冷

本周内容回顾

回顾了计算机体系结构以及每个组件的实现。

项目五内容

将各个组件(CPU、内存、ROM)通过HDL连接成完整计算机系统。

CPU实现

根据指令控制信号设计逻辑将各部分CPU组件连接起来。

内存实现

利用RAM和屏幕/键盘存储区域将地址翻译到相应内存单元。

ROM

直接使用提供的只读内存芯片组件。

连接计算机组成部分

通过HDL将CPU、内存、ROM连接起来形成整体结构。

调试测试

使用仿真环境加载程序并测试计算机运行是否正常。

项目要求

读懂注释、文件结构,按照结构图实现计算机体系结构设计。

提供资源

项目说明、文件目录、CPU/内存启动文件等。

项目完成条件

成功构建计算机系统,完成测试程序运行。

41. Unit 5 6 希伯来大学耶路撒冷课程观点分享

彭南总结福尼曼架构与哈佛架构的主要区别

哈佛架构将只读程序内存和可读写数据内存分离,而福尼曼架构将程序和数据存放在同一内存中。

采用哪种架构的考量

哈佛架构对嵌入式计算机更合适,而通用计算机需要福尼曼架构来方便更换程序。两者差异不大。

使用有限状态机描述计算机运行状态变化

有限状态机用状态圈和状态变换箭头描述计算机各状态下的行为和状态转换条件。

状态寄存器实现状态机描述

增加状态寄存器记录当前状态,组合逻辑根据状态和其他条件决定下个状态。

连接外设设备

通过内存映射外设,由CPU或专用控制器管理外设操作,如图形卡管理显示屏显示。

总结

回顾计算机架构差异,描述有限状态机对计算机运行流程建模方法,以及如何连接和管理外设设备。

42. Unit 6 1 汇编语言与汇编器 希伯来大学耶路撒冷

计算机的三个级别

  1. 硬件级别:物理电路aboool和组合逻辑。

  2. 汇编语言级别:使用指令名称对CPU操作进行监督。

  3. 高级语言级别:使用变量和函数进行更抽象编程。

汇编语言

用指令名称和操作数表示法来描述CPU的机器语言指令,人类可以阅读和书写。

汇编器

软件可以把汇编语言转换成目标机器码,完成汇编工作。

汇编语言优点

执行效率高,对硬件具有很好控制力。

高级语言优点

编程难度低,可移植性好,开发效率高。

操作

一条汇编语言包含操作码和操作数,例如ADD R1,R2对寄存器R1和R2做加法。

总结

介绍计算机三个级别,汇编语言与高级语言的区别和汇编器的功能。

43. Unit 6 2 HEK汇编语言 希伯来大学耶路撒冷

HEK语言组成

HEK语言包括指令、符号和白色空格。

指令

A级指令和C级指令都有符号和二进制语法格式,之间有对应表进行转换。

符号

预定义和用户自定义符号,使用LABEL指令进行声明。

程序示例

展示了指令、符号和注释的使用。使用红色标记不同元素。

编写汇编器需要掌握知识

  1. 两种语法的语法规则

  2. 分析词法元素

  3. 理解语义

  4. 循环转换生成目标语言

优化翻译顺序

先处理没有符号的程序,再引入符号进行处理。

汇编器实现步骤

  1. 处理无符号程序

  2. 添加符号处理能力

  3. 将基础汇编器扩展成全功能汇编器

当前步骤

忽略空白和注释,简化为指令序列转换问题。下一步解决指令转换。

44. Unit 6 3 汇编过程:处理指令 希伯来大学耶路撒冷

汇编器面临的挑战

将符号汇编语言转换成二进制机器码。

前期工作

忽略空白符处理,推迟处理符号。

处理A级指令

将常数值转换成等长的二进制码。

处理C级指令

将指令解析成目标字段、计算字段和跳转字段。通过查表对应每个字段的二进制码。

指令转换过程

以示例指令分解文件、查表对应二进制码,拼接成16位二进制字符串。

总体流程

解析每条指令,生成对应的二进制字符串,写入输出文件。完成汇编工作。

待解决问题

目前还未处理源代码中的符号,下一阶段将解决这个问题。

45. Unit 6 4 汇编过程:处理符号 希伯来大学耶路撒冷

处理符号的重要性

源代码中含有用户定义和预定义符号,需要对应到内存地址。

熟悉符号的功能

定义符号以标记内存位置,方便跳转或引用该位置的数据。

符号表

用于记录每个符号对应的内存地址或常数值。

汇编过程中的符号处理

  1. 识别源代码中的标签指令并记录符号

  2. 生成目标代码时将符号对应到内存地址或常数

  3. 在生成的目标代码中替换符号为具体值

符号处理流程

  1. 首次读取程序提取标签并构建符号表

  2. 第二次读取程序将符号替换为数值

  3. 输出带地址的目标代码

提高处理效率方法

  1. 采用树形结构组织符号表

  2. 符号定义后立即解析其值

  3. 多次扫描减少替换次数

汇编器基本完成

能正确处理完整汇编程序,包括指令和符号。

46. Unit 6 5 开发Hack汇编器 希伯来大学耶路撒冷

汇编器功能概述

解析源代码,生成目标二进制文件。

汇编器结构

主要模块有:词法分析器、语法分析器、代码生成器等。

词法分析器功能

将源代码切分为tokens(标记),如指令、操作数等。

语法分析器功能

解析tokens,检查语法结构是否正确。

符号表

记录符号名与值的对应关系。

代码生成器

根据语法树生成目标指令序列。

汇编过程概述

  1. 词法和语法解析

  2. 构建中间语法树

  3. 生成目标代码及符号表

  4. 写入目标文件

开发重点

设计类和数据结构,实现各模块算法。

组织架构

定义清晰层次化的模块,明确它们的职责。

测试与优化

针对不同用例进行测试和优化。

47. Unit 6 6 项目6概述:编程选项 希伯来大学耶路撒冷

项目内容

开发一个符合规范的Hack汇编器。

工作方式

个人完成或组成二三人小组共同开发。

汇编器功能

  1. 识别Hack指令集

  2. 处理程序中的符号

  3. 生成目标二进制文件

  4. 提供助手以分析目标代码

编程语言选择

C/C++、Java或Python等多种语言都可以实现。

开发过程

  1. 分析和设计

  2. 编写程序

  3. 测试与调试

  4. 撰写报告说明工作

评分标准

功能完整性,代码组织结构,运行效率,报告质量等。

提交内容

源代码、测试文件、说明文档和汇报。

课后资源

提供文档和开源汇编器参考实现。

项目重要意义

锻炼编译原理应用和软件开发实践能力。

48. Unit 6 6B 项目6概述:不需要编程 的翻译 希伯来大学耶路撒冷

本次项目目标

将汇编语言代码手动翻译成机器语言代码,不需要编写程序。

翻译步骤

  1. 使用文本编辑器打开汇编语言文件和机器语言文件

  2. 根据指令表一条条翻译汇编语言指令

  3. 处理符号时参考符号位置分配规则

转码过程

  1. 不含符号的简单案例直接对应翻译

  2. 含符号案例需要消除符号,参考单元6.4规则

  3. 检验翻译是否正确,可以使用仿真器或我们提供的汇编器工具

项目难点与重要知识点

  1. 符号处理方法

  2. 指令翻译规则

  3. 验证翻译结果正确性

提交内容

翻译后的机器语言代码文件

本次项目意义

培养汇编原理应用能力,了解编译器工作原理

49. Unit 6 7 总结回顾 希伯来大学耶路撒冷

改进汇编语言的方式

  1. 引入宏指令,将常用操作翻译为一条简单命令

  2. 通过扩展汇编器处理宏指令,翻译为机器语言指令

将来是否需要使用汇编语言

极少情况下,如性能优化时可能会使用到汇编语言

大多数情况下使用高级语言进行程序开发

第一台计算机的汇编器问题

第一时期手动翻译汇编指令为机器语言指令

完成后即获得第一台计算机的汇编器

课程总结

从AND门开始搭建计算机体系结构,实现CPU、存储器等系统

开发汇编器,构建软件层次,能够运行程序如Tetris

后续工作

阐述操作系统、编译器等软件层面知识,解密软件结构

于Coursera上开设后续课程,详细介绍软件层次知识

总体项目意义

深入理解计算机系统结构知识,从硬件到软件各层次操作原理

建立计算机系统综合理解能力基础