Files
912-notes/cod/chp1.md

25 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
计算机组成原理第一章知识脉络
=========================
本章讨论的主要内容是数据通路(data path)的设计关键在于如何实现一个ALU。
为了实现一个计算机(computing machine),首要的当然是要能够实现基本的计算功能。而为了实现计算功能,首先需要将数据在计算机中表示,这包括字符型数据,定点数(整数)以及浮点数,这里主要讨论定点数的表示。将定点数在计算机中表示,最简单直白的方法就是直接将它的二进制形式存储在计算机中,新增一位符号位来表示它的正负,这就是原码表示法。然而原码表示法具有一些致命性的缺陷,比如原码的计算不服从加法性质;为了构造一种复合加法性质的表示法,就产生了反码。反码的确是可以进行加法和减法运算的,但是在反码表示法下,`0`将具有两种反码表示,可以将反码简单加`1`来规避这种情况,这就是补码表示法。现代计算机中数据的存储几乎都是采用补码。
成功将数据在计算机中表示后,紧接着就需要讨论如何实现计算的问题。首先是最简单的加法运算,可以首先构造一个一位的全加器,其中加法的结果`S`和进位位`C1`都可以表达成两个输入`X, Y`以及上一位的进位`C0`的简单组合逻辑;通过将多个这样一位的全加器组合起来,就可以形成多位的全加器。然而,这样的全加器在计算的效率上存在缺陷,因为每一位必须等到前一位的进位计算完毕之后才可以开始计算,为了改进改进这种缺陷,产生了`超前进位`的策略,实际中采用的是分组的超前进位。
利用补码的运算法则,可以方便地通过全加器实现减法运算。由于
```
(x - y)补 = (x)补 + (-y)补
```
因此可以通过求被减数的相反数的补码,将减法转化成加法来进行。为此,只需要将被减数逐位取反再加一,再添加一些控制逻辑即可。
乘法和除法的实现则稍显复杂。对于乘法,是通过多次的加法和移位操作来实现的。乘法器的设计具有三个版本,需要把握三个版本的不同,以及优化的思想。而补码的乘法,是通过`布斯算法`来实现的。除法的逻辑电路和乘法几乎相同,只是在一些细节上有所改变,除法的实现主要有`恢复余数法``加减交替法`两种方法,后者是前者的一种改进策略,其正确性要能够证明。补码的除法的运行算法也有有所了解。
实现了基本的算术运算与逻辑运算就可以着手进行ALU的搭建。构造ALU的方法与前面的加法器是类似的首先建立一位的ALU确立其输入与输出以及必要的控制信号通过算术逻辑给出真值表从而搭建起组合逻辑电路。将多个一位的ALU组合起来即可得到多位的ALU了。
最后讨论浮点数的表示与运算。浮点数的表示分为两个部分即阶码与尾数两个部分都有自己的符号位。浮点数的表示遵循IEEE754标准为了理解这个标准关键在于各个部分的位数以及它们的位置以及相应的表示方法比如阶码采用移码表示而尾数则采用原码并且省略了规范后首位的`1`。此外IEEE754还保留了两个部分一些特殊的值来表示一些特殊情况比如`0`的表示,无穷的表示,`NaN`的表示以及非规范化浮点数的表示。此外,浮点数的加减法与乘除法的实现,也需要有一定的了解,比方说由于浮点数本身的特点,浮点加法并不满足结合律,两个浮点数之间也不能判等。
最后的最后还有一些内容,(我觉得和计算机组成真的没有什么关系),是检错纠错码。这里主要是讨论了两种检错纠错码,即奇偶检验码和汉明校验码,两种的编码方式都要非常熟悉。对于汉明校验码,其关键在于理解数据数位`k`和检验数位`r`之间满足的两个不等式关系。这里还需要把握码距的概念。