从coursera学习到了一门课,From NAND to Tetris(链接:www.coursera.org/learn/build… )只学习了part1,从中了解到了一些计算机硬件的知识。正如名字所说,从与非门到俄罗斯方块,这门课会从最简单的逻辑门开始讲起,而后一步步搭建起一个计算机。
我写此博客的目的即对我的学习作一个总结,不过我并不会纠结于各个细节(不过一些重要的地方还是会说一下的)
顺带一提,这个课程的学习,一般都是先了解abstract(这个东西要是做什么的)再去实现implement(应该怎么实现)。
Boolean Logic
课程的第一部分介绍的是各种逻辑门,这些是搭建以后ALU, CPU等的基础。
我们熟悉的逻辑门包括 and, or, not, 这三个逻辑门就足以描述一切逻辑关系(或者说,各种数字电路)。而同时,这三个门都可用nand来描述
也就是说,用nand就足以描述所有的逻辑关系(那么nand门怎么实现呢,可以利用晶体管等实现,当然,这样and,not,or也可用晶体管实现)。
依据此,又搭建出了不少门。我重点说一些其中的两个。
Mux Gate
即Multiplexor,选择器。
其结构如上,它有三个输入:a, b, sel。根据sel的不同输出a或b。
DMux Gate
即Demultiplexor, 分配器。
这是一个双输入,双输出门。根据sel的不同会把输入映射到输出的不同位置。
结合Mux和DMux可以看到,我们可以利用Mux把不同的信息串接到一根线上,再把这一根线的东西利用DMux分开。(这一点在构建后面的RAM时会用到)
之后还要把这些门扩展到多位(输入输出可能不是1个bit, 而是多个bit, 比如一个and16要对两个16bit的输入每一bit进行and运算),多路(选择器可以扩展到3选8, 通过3bit对8个输入进行选择)。
ALU
上面说到的都是逻辑运算,那么怎么进行数学运算呢?
先从最简单的一位加法说起,一个全加器(称呼为此名字是因为还有半加器,半加器没有进位输入)有三个输入(两个要相加的数,一个进位输入),两个输出(和与进位输出)
把多个这样的一位全加器串接起来(进位输出接到进位输入)就得到了多位加法器。(这样的搭建很自然,但是速度并不快,还有更快的超前进位加法器)
而要处理减法,则是对数字编码进行了调整,需要用到补码的概念和一些余数运算的知识,结果是把减法转换为了加法。(这个我会更详细的总结)
有了这些知识,就能搭建一个ALU,即算数逻辑单元了(它位于CPU中)。我们设想的电脑是16位的,设计的ALU如下:
根据控制位的不同(zx, nx, zy, ny, f, no)对两个x, y输入作不同的处理,就能得到如上表右边所示的结果。
除了这些,还有两个标志位zr和ng, 他们会反应结果的情况。zr即结果是否为0, ng即结果是否为负。