-
1 教学内容
-
2 教学视频
本节教学内容:
1、定点的加法与减法运算
2、ALU单元介绍
教学目的和要求:
1、掌握补码加减法运算的基本公式;
2、掌握判断溢出的方法;
3、理解补码加减运算的控制流程;
4、理解ALU电路结构。
重点:1、补码加法运算的基本公式;
2、判断溢出的方法。
难点:1、补码加减运算的控制流程
第1讲定点数的加法与减法
一、知识要点
1、补码加减法运算的基本公式
2、判断溢出
3、补码定点加减法所需的硬件配置
二、教学安排
首先,介绍补码加减法运算的基本公式,然后通过例题来讲解公式的运用,有助于学生理解并灵活运用公式用法,然后介绍加减法运算中出现溢出的情况,以及如何判断溢出,最后,再介绍补码加减法运算的控制流程。
三、教学内容
1、补码加减法运算的基本公式
加减法运算是计算机中最基本的运算,因减法运算可看做被减数加上一个减数的负值,即A-B=A+(-B),故在此机器中的减法运算和加法运算合在一起讨论。现代计算机中都采用补码作加减法运算。
补码加法的基本公式如下

即补码表示的两个数在进行加法运算时,可以把符号位与数值位同等处理,只要结果不超出机器能表示的数值范围,运算后的结果按2n+1取模(对于正数)或按2取模(对于小数),就能得到本次加法的运算结果。
读者可根据补码定义,按两个操作数的四种正负组合情况加以证明。
对于减法,A-B=A+(-B)
则[A-B]补=[A+(-B)]补
由补码加法基本公式可得

因此,若机器数采用补码,当求A-B时,只需先求[-B]补(称[-B]补为“求补”后的减数),就可按补码加法规则进行运算。而[-B]补由[B]补连同符号位在内,每位取反,末位加1而得。
2、举例
例1:已知A= 0.1011,B= – 0.0101,求[A+ B]补。

按模2的意义,最左边的1丢掉,故[A+ B]补=0.0110,结果正确。
例2:设A= –9,B= –5,求[A+ B]补。

按模24+1的意义,最左边的1丢掉。
例3:设机器数字长为8 位(含1 位符号位),且A = 15,B = 24,用补码求A–B。

可见,不论操作数时正还是负,在做补码加减法时,只需将符号位和数值部分一起参加运算,并且将符号位产生的进位自然丢掉即可。
例4:设机器数字长为8 位(含1 位符号位),且A = –93,B = 45,用补码求A–B。

按模2n+1的意义,最左边的“1”自然丢掉,故[A-B]补=0,1110110,还原成真值得A–B=119,结果出错,这是因为A–B=-138超出了机器字长所能表示的范围。在计算机中,这种超出机器字长的现象叫溢出。为此,在补码定点加减运算过程中,必须对结果是否溢出做出明确的判断。
3、溢出判断
补码定点加减运算判断溢出有两种方法。
1)用一位符号位判断溢出
当两个以补码表示的负数相加时,会遇到两个问题。第一是两个负数的符号位相加,1+1后,本位为零,似乎负数相加变成了正数;其二是两个负数的数值部分之和,如果不向符号位进位,是不是就说明运算结果没有溢出?但不进位最终将导致两个负数相加成了正数,显然是错误的,这该怎么解释?如果两个以补码表示的负数的数值部分之和向符号位进位,会使运算结果依然为负数,那么这个运算结果是正确的吗?下面我们分析一下这个问题:
①只有真正意义上的相加才可能溢出,比如:
正+正,负+负,正-负,负-正
纯粹的减法是不可能溢出的,这一点仅需常识即可作出判断,所以遇到不是真正意义上的加法运算(当然,包括乘法和左移等)要你判断是否有溢出,直接就可以回答:OF=0;
②两正数之和的数值部分向符号位进位,显然是运算结果超过了指定位数的带符号数的表示范围,这就是典型的溢出;
③两负数之和的溢出判断是我们讨论的重点。我们先考察一下负数原码和补码数值部分之间的关系:以8位补码为例,负数原码和补码数值部分之和始终等于128(见上图)。由于这种关系,当原码数值大时对应的补码数值就小,反之也一样。所以,当两补码表示的负数的数值部分之和没有向符号位进位,说明两负数的原码之和必然向符号位进位,即发生溢出;反之,当两补码表示的负数的数值部分之和向符号位进位,那么对应两负数原码的数值之和就不可能向符号位进位,即运算结果没有溢出;并且在这种情形下补码之和的数值部分向符号位的进位,修正了两负数符号位相加本位为零的问题,使得两负数之和依然是个负数。
下面看两个负数补码相加溢出判断的实例:
例一:085h + 9ch= 10000101b + 10011100b
两数相加,数值部分不会向符号位进位,这是不是就说明没有溢出呢?但由于计算结果为正,显然不对。我们还是看看两个数的原码之和再说:
10000101b的原码= 11111011b(-123)
10011100b的原码= 11100100b(-100)
显然,原码之和的数值部分将向符号位进位,显然是溢出无疑。
例二:0e7h + 0b3h=11100111b + 10110011b
两数相加,数值部分会向符号位进位,这进位是溢出吗?还是看看原码吧!
11100111b的原码= 10011001b(-25)
10110011b的原码= 11001101b(-77)
容易看出,两数原码之和没有向符号位进位,即没有发生溢出。
下面以机器字长为4位(含1位符号位)为例,说明机器时如何判断溢出的。
机器字长为4位的补码所对应的真值范围为-8~+7,运算结果一旦超过这个范围即为溢出。下表列出了四种溢出情况。

这自然说明了:
⑴不是同号数相加,则不可能溢出;
⑵同号数相加有可能溢出;
⑶同号数相加如果结果的符号位和两加数不同,即是溢出。
2)用两位符号位判断溢出
两个补码数相加减时,若最高数值位向符号位送的进位值与符号位送向更高位的进位值不相同,也是运算结果溢出.
在采用双符号位(如定点小数的模4补码)运算时,若两个符号位的得值不同(01或10)则是溢出.01表明两个正数相加,结果大于机器所能表示的最大正数,称为"上溢";10表明两个负数相加,结果小于机器所能表示的最小负数,称为"下溢";双符号位的高位符号位,不管结果溢出否,均是运算结果正确的符号位,这个结论在乘法运算过程中是很有实际意义的.请注意,在采用双符号位的方案中,在寄存器和内存储器存储数据时,只需存一位符号,双符号位仅用在加法器线路部分。
2位符号位的补码,即变形补码,它是以4为模的,其定义为

在用变形补码作加法时,2位符号位要连同数值部分一起参加运算,而且高位符号位产生的进位自动丢失,便可得正确结果,即
![]()
变形补码判断溢出的原则是:当2位符号位不同时,表示溢出,否则,无溢出。不论是否发生溢出,高位(第1位)符号位永远代表真正的符号。
例1:设x=+,y=+
,试用变形补码求x+y。

符号位为“00”,表示无溢出。
例2:设x=+,y=+
,试用变形补码求x+y。

此时,符号位为“01”,表示溢出,又因第1位符号位为“0”,表示结果的真正符号位正,故“01”表示正溢出。
例3:设x=+,y=-
,试用变形补码求x+y。

符号位为“10”,表示溢出,又因第1位符号位为“1”,表示负溢出。
这两种不同说法是对同一个事实的略有区别的表述,实现时用到的线路可以有所区别,但问题的实质是完全一样的。
4、补码定点加减法所需的硬件配置
下图是实现补码定点加减法的基本硬件配置框图。

图中寄存器A、X、加法器的位数相等,其中A存放被加数(或被减数)的补码,X存放加数(或减数)的补码。当作减法时,由“求补控制逻辑”将X送至加法器,并使加法器的最末位外来进位为1,以达到对减数求补的目的。运算结果溢出时,通过溢出判断电路置“1”溢出标记V。GA为加法标记,GS为减法标记。
四、互动及练习
本次课采用提问的互动方式:
1、设x=,y=
,用补码求x+y?
![]()
2、设机器数字长为8 位(含1位符号位),且A =–97,B = +41,用补码求A–B。
![]()
这两个题都请同学们先自己计算,然后做完的同学将计算的结果写在黑板上,给大家参考讨论,通过讨论引入溢出的概念。
第2讲ALU电路
一、知识要点
1、补码加减运算的控制流程
2、ALU电路
二、教学安排
首先,简单的介绍补码加减运算的控制流程,然后再通过ALU的硬件框图来简单介绍ALU电路的硬件结构和工作方式。
三、教学内容
1、补码加减运算控制流程
补码加减运算控制流程如下图所示。

由图可见,加(减)法运算前,被加(减)数的补码在A中,加(减)数的补码在X中。若是加法,直接完成(A)+(X)àA(mod2或mod2n+1)的运算;若是减法,则需对减数求补,再和A寄存器的内容相加,结果送A。最后完成溢出判断。
2、ALU电路简介
算术逻辑单元(Arithmetic Logic Unit, ALU)是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate" 和"Or Gate"构成的算术逻辑单元,主要功能是进行二进制的算术运算,如加减乘(不包括整数除法)。基本上,在所有现代CPU体系结构中,二进制都以二补数的形式来表示。
算术逻辑单元(arithmetic logic unit,缩写ALU)是进行整数运算的结构。现阶段是用电路来实现,应用在电脑芯片中。
在计算机中,算术逻辑单元(ALU)是专门执行算术和逻辑运算的数字电路。ALU是计算机中央处理器的最重要组成部分,甚至连最小的微处理器也包含ALU作计数功能。在现代CPU和GPU处理器中已含有功能强大和复杂的ALU;一个单一元件也可能含有ALU。
1945年数学家冯诺伊曼在一篇介绍被称为EDVAC的一种新型电脑的基础构成的报告中提出ALU的概念。
早期发展
1946年,冯诺伊曼与同事合作为普林斯顿高等学习学院(IAS)设计计算机。随后IAS计算机成为后来计算机的原形。在论文中,冯诺伊曼提出他相信计算机中所需的部件,其中包括ALU。冯诺伊曼写到,ALU是计算机的必备组成部分,因为已确定计算机一定要完成基本的数学运算,包括加减乘除。于是他相信「(计算机)应该含有专门完成此类运算的部件。」
数字系统
ALU必须使用与数字电路其他部分使用同样的格式进行数字处理.对现代处理器而言,几乎全都使用二进制补码表示方式。早期的计算机曾使用过很多种数字系统,包括反码、符号数值码,甚至是十进制码,每一位用十个管子。以上这每一种数字系统所对应的ALU都有不同的设计,而这也影响了当前对二进制补码的优先选择,因为二进制补码能简化ALU加法和减法的运算。一个简单的能进行与或非和加运算的2位ALU。
可行性分析
绝大部分计算机指令都是由ALU执行的。ALU从寄存器中取出数据,数据经过处理将运算结果存入ALU输出寄存器中。其他部件负责在寄存器与内存间传送数据。控制单元控制着ALU,通过控制电路来告诉ALU该执行什么操作。
简单运算
大部分ALU都可以完成以下运算∶
整数算术运算(加、减,有时还包括乘和除,不过成本较高)
位逻辑运算(与、或、非、异或)
移位运算(将一个字向左或向右移位或浮动特定位,而无符号延伸),移位可被认为是乘以2或除以2。
复杂运算
工程师可设计能完成任何运算的ALU,不论运算有多复杂;问题在于运算越复杂,ALU成本越高,在处理器中占用的空间越大,消耗的电能越多。于是,工程师们经常计算一个折中的方案,提供给处理器(或其他电路)一个能使其运算高速的ALU,但同时又避免ALU设计的太复杂而价格昂贵。设想你需要计算一个数的平方根,数字工程师将评估以下的选项来完成此操作∶
设计一个极度复杂的ALU,它能够一步完成对任意数字的平方根运算。这被称为单时钟脉冲计算。
设计一个非常复杂的ALU,它能够分几步完成一个数字的平方根运算。不过,这里有个诀窍,中间结果经过一连串电路,就像是工厂里的生产线。这甚至使得ALU能够在完成前一次运算前就接受新的数字。这使得ALU能够以与单时钟脉冲同样的速度产生数字,虽然从ALU输出的结果有一个初始延迟。这被称为计算流水线。
设计一个复杂的ALU,它能够计算分几步计算一个数字的平方根。这被称为互动计算,经常依赖于带有嵌入式微码的复杂控制单元。
在处理器中设计一个简单的ALU,去掉一个昂贵的专门用于此运算的处理器,再选择以上三个选项之一。这被称为协处理器。
告诉编成人员没有协处理器和仿真设备,于是他们必须自己写出算法来用软件计算平方根。这是由软件图书馆完成的。
对协处理器进行仿真,也就是说,只要一个程序想要进行平方根的计算,就让处理器检查当前有没有协处理器。如果有的话就使用其进行计算,如果没有的话,中断程序进程并调用操作系统通过软件算法来完成平方根的计算。这被称为软件仿真。
以上给出的选项按最快和最贵到最慢和最经济排列。于是,虽然甚至是最简单的计算机也能计算最复杂的公式,但是最简单的计算机经常需要耗费大量时间,通过若干步才能完成。强大的处理器,比如英特尔酷睿和AMD64系列对一些简单的运算采用1号选项,对最常见的复杂运算采用2号选项,对极为复杂的运算采用3号选项。这是具有在处理器中构造非常复杂的ALU的能力为前提的。
输入和输出
ALU的输入是要进行操作的数据(称为操作数)以及来自控制单元的指令代码,用来指示进行哪种运算。它的输出即为运算结果。在许多设计中ALU也接收或发出输入或输出条件代码到(或来自)状态寄存器。这些代码用来指示一些情况,比如进位或借位、溢出、除数为零等。
ALU与FPU
浮点单元也对两个数值进行算术运算,但是这种运算已浮点数表示,比在ALU中一般使用的补码表示方式复杂的多。为了完成此类运算,FPU里嵌入了多个复杂电路,包括一些内部ALU。工程师一般认为ALU是处理整数型(比如补码和BCD码)算术运算的的电路,而对更为复杂的格式(比如浮点型、复数型)进行计算的电路则拥有一个更加匹配的称谓。
ALU用以计算机指令集中的执行算术与逻辑操作;
某些处理器中,将ALU切分为两部分,即算术单元(AU)与逻辑单元(LU)。某些处理器包含一个以上的AU,如,一个用来进行定点操作,另一个进行浮点操作。(个人计算机中,浮点操作有时由被称为数字协处理器的浮点单元完成)。
通常而言,ALU具有对处理器控制器、内存及输入输出设备的直接读入读出权限。输入输出是通过总线进行的。输入指令包含一个指令字,有时被称为机器指令字,其中包括操作码,单个或多个操作数,有时还会有格式码;操作码指示ALU机要执行什么操作,在此操作中要执行多少个操作数。比如,两个操作数可以进行比较,也可以进行加法操作。格式码可与操作码结合,告知这是一个定点还是浮点指令;输出包括存放在存储寄存器中的结果及显示操作是否成功的设置。如操作失败,则在机器状态字中会有相应的状态显示。
通常,输入操作数、操作数、累加和以及转换结果的存储位置都在ALU中。在算术单元中,乘除操作是通过一系列的加减运算得到的。在机器码中有多种方式用以表示负数。
在逻辑单元中,每次执行16个可能的逻辑运算中的一个。
ALU的设计是处理器设计中的关键部分。仍在不断研究如何提高指令的处理速度。
3、ALU电路框图
下图所示是ALU框图。图中Ai和Bi为输入变量;ki为控制信号,ki的不同取值可决定该电路作哪一种算术运算或哪一种逻辑运算;Fi是输出函数。

现在ALU电路已制成集成电路芯片,例如,74181是能完成4位二进制代码的算逻运算部件,外部特性如下图所示。

74181有两种工作方式,即正逻辑和负逻辑,分别如图(a)和图(b)所示。下表列出了其算术/逻辑运算功能。


该芯片的核心部件是一个容量为16字的双端口RAM和一个高速ALU电路。
四、互动及练习
本次课采用提问的互动方式:
1、ALU部件能做什么?
让同学们先谈谈自己的看法,然后引入ALU的简介,包括ALU的发展、ALU的功能、ALU的电路框图。

