From Nand To Tetris 从与非门到俄罗斯方块

13、P1 W2 U2.4 ALU 算术逻辑单元

2019-07-30  本文已影响0人  shazizm

视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W2U2.4 - Arithmetic Logic Unit

软件:
全课程所需软件项目包官方下载:
https://www.nand2tetris.org/software
备了一份软件项目包放在CSDN了,版本2.6支持Mac、Linux、Windows:
https://download.csdn.net/download/shazizm/11268147

经过一周多的基础知识的学习和枯燥的坚持。今天终于有了猛料了。
在下图看到熟悉的CPU了。
今天就一探CPU的核心部分ALU(Arithmetic Logic Unit 算术逻辑单元)

上图架构:1945年 冯诺依曼 提出的 计算机架构。对比我在第一篇文章里写到的“我的世界”里季文瀚搭建出的计算机,使用的是哈佛结构,而非更常见的冯·诺依曼结构。程序储存器和数据储存器分开放置。

下图是 ALU 的示意图(只是示意,后面有详细的介绍),像其他逻辑门一样:
左边2个输入,
右边1个输出。
上方1个 f 代表 也是输入。

ALU由很多操作组成,例如:清零、置一、加、减、与、或、非、等等。

那么 f 就是说,选择ALU中哪些操作,来对左边2个输入进行算术或逻辑运算。

另外这里提到了一个取舍问题。因为有些操作是可以在软件部分处理的。
那么哪些该用硬件实现,哪些该用软件间接实现。
对应计算性能和架构复杂度就成了一个取舍的问题。


取舍问题,我们就不考虑了,老师已经选好了

下图 是这次老师为“HACK”小电脑,特别定制准备的“HACK”ALU,也是学生要去实现的作业。

下图右侧可以看出老师设计了18 种 操作。

如下图:

x、y: 两个输入操作数 (16位的补码表示的二进制,方便负数加法和溢出,参考:P1 W2 U2.3 负数 与 减法

out:输出结果 (16位二进制)

zx 、nx、 zy、 ny、 f、 、no:功能位(不同的基础功能组合,可以得出不同的运算。这很像Mux里的sel)

zr、ng:输出控制位(一会儿解释)


可以大概对应理解 x、y 送进来的就是 “数据”。zx、nx、zy、ny、f、no 送进来的就是“程序”。

下图给出了
zx、nx、zy、ny、f、no
out
真值表


已知上图,求...

关于 ALU 和 真值表。是怎么回事。老师用了 硬件模拟器 举了两个例子:算术运算(减),逻辑运算(与)。

算术运算:20 - 30 = ?

000111 对应上图真值表 就是 选了 y - x 这种操作。
设值 y - x = 20 - 30 = -10。


如图显示 20-30 的操作,该如何设置,并 运算出 结果

逻辑运算:11110 & 10100 (“&”表示 与运算)

找到 x&y 对应真值表为 000000

点击运算按钮 核对结果


x与y

大概了解了ALU的输入输出端口和使用。我最疑惑的就是这6个功能位。
那么接下来就来一探究竟吧。

休息下,打开黑盒

下图先说 6个功能位:

对X预处理操作
zx(Zero X): 如果 zx = 1 那么 x = 00000... (全部清零)
nx(Negate X) : 如果 nx = 1 那么 x = !x (全部取反)

注意1:如果 zx、nx = 0 那么就对输入的 x 不进行任何操作。
注意2:这个操作是有顺序的从左往右,如果 zx=1 nx=1,那么先 清零,在取反,也就是实现了 全置1的目的了。

对Y预处理操作(同理X)
zy(Zero Y): 如果 zy = 1 那么 y = 00000... (清零)
ny(Negate Y) : 如果 ny = 1 那么 y = !y (取反)

算术加、逻辑与
f (Function):如果 f =1 那么 out = x+y ,否则 f = 0 那么 out = x&y

后处理 out
no (Negate Out) :如果 no =1 那么 out = !out (取反)

从6个控制位的英文名,可以猜出对应的功能

那么这6个控制真的能对应实现 之前给出的18种运算吗?

如下图举例: !x
假设 x = 1100 , y = 1011。6位控制 = 001101

按照上图讲的,可以自己推一遍。

神奇真香,x确实取反了

再举例:y - x
假设 x = 0010(2),y = 0111 (7)。6位控制 = 000111

神奇真香

2个输出控制位:
如果 out 的 十进制 等于 0,那么zr = 1,否则 zr = 0
如果 out 的 十进制 小于 0,那么ng = 1,否则 ng = 0

这里并没有过多解释,它俩会在之后的整体架构设计中扮演重要的角色。


zr、 ng 下次讲解

最后,回顾ALU的18种运算,除了x+y和x-y。

其它都是逻辑运算。而这些逻辑门如何实现,之前课程已经完成了。(如果你做完作业了)

而x-y 又可以 表示成 x+(-y)。所以只用一个Adder加法器(我们也在这周重点突破实现了) 又解决了所有 算术运算的问题。

老师提供的ALU的设计,简单,优雅。当然,工业上用ALU肯定比这个复杂多了。

但做为启发思考

方便理解

在此

才更是可贵!

大道至简 Simplicity is the ultimate sophistication
上一篇下一篇

猜你喜欢

热点阅读