From Nand to Tetris Week2 2021 超详细笔记
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 超详细笔记相关推荐
- 学习javascript这一篇就够了超详细笔记(建议收藏)上
学习javascript这一篇就够了超详细笔记(建议收藏)上 1.初识 计算机基础导读 编程语言 计算机基础 初识js 浏览器执行 js组成 js初体验-三种书写位置 js注释 js输入输出语句 2. ...
- Java并发编程(中下篇)从入门到深入 超详细笔记
接上一篇博客笔记:Java并发编程(中上篇)从入门到深入 超详细笔记_未来很长,别只看眼前的博客-CSDN博客https://blog.csdn.net/weixin_53142722/article ...
- SPRING注解驱动开发-雷神课程超详细笔记
SPRING注解驱动开发-雷神课程超详细笔记 时间:2021-03-21 2022-04-06更新:最近翻起一年多前写的笔记复习,还是收获颇多,很多当时无法理解的知识现在慢慢能理解了,可能是工作一年的 ...
- 清晰易懂!关于PS入门的超详细笔记!
给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂
- (超详细笔记整理)动力节点_老杜 | JavaSE零基础 :P329(方法) - P479
JAVA基础学习 第二篇文章的连接: (超详细笔记整理)动力节点_老杜 | JavaSE进阶 [P486之后]. 文章目录 JAVA基础学习 方法 Java的主要内存空间 栈数据结构 **栈数据结构: ...
- android如何实现qq登陆和qq分享,2021超详细mob平台图解教程?
android如何使用mob平台实现QQ登录以及分享功能 1.在mob平台配置ShareSDK环境 1.如何在mob平台创建应用 2.获取你的`App Key`和`App Secret`(建议用自己的 ...
- 计算机网络入门网课推荐+超详细笔记
建议看湖南科技大学的网课,讲得十分清晰明了 https://www.bilibili.com/video/BV1c4411d7jb?p=1&vd_source=ac571aae41aa0b58 ...
- 前端面试题2021(超详细)
真的是一篇好文章,好文就要收藏~ 晟小明 身为三本的我就是凭借这些前端面试题拿到百度京东offer的,前端面试题2021及答案
- 2021超详细的Dart语言基础总结~你值得拥有~
文章目录 前言:dart语言简介 一.变量 1.1.类型推导 1.2.默认值 1.3.Final 和 const修饰符 二.内建类型 2.1.数据类型 2.2.集合的相关操作 三.函数 3.1.函数的 ...
最新文章
- dojo在ASP.NET中使用Ajax初步
- PHP如何复制前端传递的json数据
- 第三次学JAVA再学不好就吃翔(part2)--基础语法之注释
- 信息的Raid存储方式,更安全的保障,更花钱的保障!
- linux编程手册读书笔记第一章(20140329)
- java对象和json对象之间互相转换
- 《Python编程从入门到实践》记录之读取文件
- 求二进制数中1的个数(转)
- 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
- 软件著作权申请文档模版
- 持久层框架Hibernate和Mybatis对比
- 招聘中的热门技术技能:SQL、Java、Python 和 Linux
- 16、先天八卦与后天八卦各自有什么用途?
- 图像灰度共生矩阵cooc_feature_image.hdev
- 心形函数的正确打开方式(Unity3D Shader)
- Swift基础——数组Array
- 角色动画中的骨骼蒙皮技术
- js直接调用系统打印机进行打印
- 利用opencv带你玩转人脸识别-下篇(人脸录入,数据训练,人脸识别小案例快速入门)
- setTimeout和cleartimeout(),再settimeout执行到一半后,正确的使用cleartimeout()删除
热门文章
- DataCastle[职位预测竞赛]冠军——我们都爱苍老师
- ppt python 图表_利用python分析weibo数据做成图表放入PPT中
- 人工智能Java SDK:声纹识别
- 百度测试开发岗面试题(2019秋招)
- 教程篇(7.0) 02. FortiGate安全 安全架构 ❀ Fortinet 网络安全专家 NSE 4
- Caffe学习笔记二 Extracting Features
- 字节跳动全链路压测(Rhino)的实践
- Oracle同英超联赛数据统计和展示的结合
- 定积分的性质——积分中值定理
- 单片机实例1——闪烁灯(硬件电路图+汇编程序+C语言程序)