Week2

为什么学这章的内容及学习目标

围绕着电脑计算展开,现在的我们知道CPU是计算机大量计算的关键部分,而在CPU内最关键处理计算的Chip是一个叫ALU(Arithmetic Logic Unit)中文名叫算术逻辑单元这样的一个东东,它的作用是处理字节运算和逻辑运算。Week2这章的内容目的是设计一个简单的ALU(属于From Nand to Tetris的一个ALU),这个ALU是专门属于你的,也是From Nand to Tetris这门课想要带给你,它被大量简化,只有加减法的计算功能。所以,难度适中,不用担心学不会的问题,但学习这个过程中带给你的爽感就像你真的设计了一个ALU,乃至未来的PC。

这章的内容以什么形式呈现

既然是计算,最简单的模型莫过于,两个分别为1个bit的信息进行相加计算了。这个模型抽象具体化为In a, b Out sum,carry

输出的结果分别为1bit的内容,carry代表的是进位,sum表示二进制相加的most significant的一位。我们将这个模型抽象为一个叫做HalfAdd的Chip。

计算不可能只计算一位吧,我们计算的内容可能是很多位进行相加。那么想想会遇到什么情况呢?当只有1位进行相加的时候,我们发现是HalfAdd的情况,But,wait.如果有很多位呢?我们将多位的情况先从最简单的方式进行思考,也就是两位的情况,会发生什么呢?我们发现如果carry为0的时候,就是HalfAdd的模型,但是当carry等于1的时候,那就相当于是有三个分别为1bit的内容进行加法计算了。

于是,有了FullAdd的模型Chip。In a,b,c Out sum, carry

有了FullAdd,你就可以进行设计多个bits的计算了。这里引入Add16,因为我们这门课最终目标是设计一个简单的16位的Hack computer.

以上都是加法运算,我们从小学就知道人手动计算的时候,我们经常将减法简化成加法进行计算,在这里,我们采用类似的思想,但是计算机的减法如何实现呢?难不成我还需要设计Subtract的Chip吗?

一个很有意思的技巧是我们将多个Bits的数的第一位作为符号位,0表示正数,1表示负数,这样对原先为n个Bits的Chip,它的取值范围为0~2n-1。再引入符号位的概念后,它的取值范围就变成了-2(n-1) ~ 2^(n-1)-1这样的一个取值范围。不过呢,这样表示还是有一点问题,举个例子,对于4-bit binary system ,1 + (-2)的结果该怎么表示呢?如果直接按照取负的思想,相加的结果为1011,对应的数为-3,不过我们都知道这个算术计算的结果应该为-1,也就是1001,问题出在了哪里?如何解决这个问题?

这里引入了一个2’s complement method(补码)的一个思想方法,这里的补码可以理解为取负的意思,注意和Bitwise negation区别开来。

这样问题就迎刃而解了,具体为什么,如果你对着感兴趣的话,可以自行学习下。

之后再看一看ALU的功能

最后还有一个Inc16的chip(这里的Inc其实是Incrementor的缩写),其功能是在16bits输入的情况下,输出In+1的情况。

ALU实现的思路:

zx,nx和zy,ny模块其实是类似等价的。nx模块用Not16 chip,zx module用 Mux16(a = , b = false,sel = zx,out = )来实现;

f的条件选择如何实现呢? 我想到了Mux16(a = x & y, b= x + y, sel = f, out= )

no module 用Not16 chip和 Mux16进行选择判断

最后根据out的结果再选择判断对zr , ng 进行输出

总结

这节最好玩的地方在于,构建的Logic gate难度加大了,HalfAdd, FullAdder, Adder16,Inc,ALU大概是这些了。难度加大,能不能不重复造轮子,利用第一次作业里的基本的chip很关键,比如说Mux,Xor等。

我自己在Bitwise negation这里卡了下,有时候我下意识地将Bitwise negation当作取负了,有时候没有,概念有点混乱。

还是挺有意思的,虽然一个人在图书馆啊。今天科三过了,hahahaha.

From Nand to Tetris Week2 2021 超详细笔记相关推荐

  1. 学习javascript这一篇就够了超详细笔记(建议收藏)上

    学习javascript这一篇就够了超详细笔记(建议收藏)上 1.初识 计算机基础导读 编程语言 计算机基础 初识js 浏览器执行 js组成 js初体验-三种书写位置 js注释 js输入输出语句 2. ...

  2. Java并发编程(中下篇)从入门到深入 超详细笔记

    接上一篇博客笔记:Java并发编程(中上篇)从入门到深入 超详细笔记_未来很长,别只看眼前的博客-CSDN博客https://blog.csdn.net/weixin_53142722/article ...

  3. SPRING注解驱动开发-雷神课程超详细笔记

    SPRING注解驱动开发-雷神课程超详细笔记 时间:2021-03-21 2022-04-06更新:最近翻起一年多前写的笔记复习,还是收获颇多,很多当时无法理解的知识现在慢慢能理解了,可能是工作一年的 ...

  4. 清晰易懂!关于PS入门的超详细笔记!

    给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂

  5. (超详细笔记整理)动力节点_老杜 | JavaSE零基础 :P329(方法) - P479

    JAVA基础学习 第二篇文章的连接: (超详细笔记整理)动力节点_老杜 | JavaSE进阶 [P486之后]. 文章目录 JAVA基础学习 方法 Java的主要内存空间 栈数据结构 **栈数据结构: ...

  6. android如何实现qq登陆和qq分享,2021超详细mob平台图解教程?

    android如何使用mob平台实现QQ登录以及分享功能 1.在mob平台配置ShareSDK环境 1.如何在mob平台创建应用 2.获取你的`App Key`和`App Secret`(建议用自己的 ...

  7. 计算机网络入门网课推荐+超详细笔记

    建议看湖南科技大学的网课,讲得十分清晰明了 https://www.bilibili.com/video/BV1c4411d7jb?p=1&vd_source=ac571aae41aa0b58 ...

  8. 前端面试题2021(超详细)

    真的是一篇好文章,好文就要收藏~ 晟小明 身为三本的我就是凭借这些前端面试题拿到百度京东offer的,前端面试题2021及答案

  9. 2021超详细的Dart语言基础总结~你值得拥有~

    文章目录 前言:dart语言简介 一.变量 1.1.类型推导 1.2.默认值 1.3.Final 和 const修饰符 二.内建类型 2.1.数据类型 2.2.集合的相关操作 三.函数 3.1.函数的 ...

最新文章

  1. dojo在ASP.NET中使用Ajax初步
  2. PHP如何复制前端传递的json数据
  3. 第三次学JAVA再学不好就吃翔(part2)--基础语法之注释
  4. 信息的Raid存储方式,更安全的保障,更花钱的保障!
  5. linux编程手册读书笔记第一章(20140329)
  6. java对象和json对象之间互相转换
  7. 《Python编程从入门到实践》记录之读取文件
  8. 求二进制数中1的个数(转)
  9. 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
  10. 软件著作权申请文档模版
  11. 持久层框架Hibernate和Mybatis对比
  12. 招聘中的热门技术技能:SQL、Java、Python 和 Linux
  13. 16、先天八卦与后天八卦各自有什么用途?
  14. 图像灰度共生矩阵cooc_feature_image.hdev
  15. 心形函数的正确打开方式(Unity3D Shader)
  16. Swift基础——数组Array
  17. 角色动画中的骨骼蒙皮技术
  18. js直接调用系统打印机进行打印
  19. 利用opencv带你玩转人脸识别-下篇(人脸录入,数据训练,人脸识别小案例快速入门)
  20. setTimeout和cleartimeout(),再settimeout执行到一半后,正确的使用cleartimeout()删除

热门文章

  1. DataCastle[职位预测竞赛]冠军——我们都爱苍老师
  2. ppt python 图表_利用python分析weibo数据做成图表放入PPT中
  3. 人工智能Java SDK:声纹识别
  4. 百度测试开发岗面试题(2019秋招)
  5. 教程篇(7.0) 02. FortiGate安全 安全架构 ❀ Fortinet 网络安全专家 NSE 4
  6. Caffe学习笔记二 Extracting Features
  7. 字节跳动全链路压测(Rhino)的实践
  8. Oracle同英超联赛数据统计和展示的结合
  9. 定积分的性质——积分中值定理
  10. 单片机实例1——闪烁灯(硬件电路图+汇编程序+C语言程序)