计算机组成原理
武汉科技大学
计算机科学与技术学院
第二章 运算方法与运算器
本章内容
2.1 数据与文字的表示方法
2.2 定点加法减法运算
2.3 定点乘法运算
2.4 定点除法运算
2.5 定点运算器的组成
2.6 浮点运算方法和浮点运算器
2.1 数据与文字的表示方法
2.1.1 数据格式
数据表示格式有两种
定点格式
浮点格式
定点格式容许的数值范围有限,但要求的处理硬件比较简单.浮点格式容许的数值范围很大,但要求的处理硬件比较复杂
1.定点数的表示方法
定点:小数点位置约定在固定的位置,不显式表示.
格式:x=x0x1x2…xn 其中x0为符号位
定点小数:小数点位于x0和x1之间,表数范围:
0≤|x|≤1-2-n
定点整数:小数点位于xn右边,表数范围: 0≤|x|≤2n-1
目前计算机中多采用定点纯整数表示,因此将定点数表示的运算简称为整数运算.
浮点:小数点位置可在一定范围内移动.
目的:扩大表数范围,例如电子的质量(9×10-28克)和太阳的质量(2×1033克)相差甚远,在定点计算机中无法直接来表示这个数值范围,故用浮点数表示.
浮点表示法:把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示,这种把数的范围和精度分别表示的方法,数的小数点位置随比例因子的不同而在一定范围内自由浮动.
任意一个十进制数 N 可以写成 N=10E.M
其中:M :尾数,是一个纯小数.
E :比例因子的指数,称为浮点的指数,是一个整数.
同样,在计算机中一个任意进制数 N 可以写成N=Re.m
其中:R :比例因子的基数,由于计算机采用的是二进计数值,
所以:一般规定R 为2,或2的整数幂(如8或16).
2. 浮点数的表示方法
一个机器浮点数由阶码和尾数及其符号位组成:
尾数:用定点小数表示,给出有效数字的位数决定了浮点数的表示精度;
阶码:用整数形式表示,指明小数点在数据中的位置,决定了浮点数的表示范围.
浮点数的表示格式:
格式1 :
M1 M2 … Mn
Ms
E1E2 ……Em
Es
阶符 阶码 尾符 尾数
浮点数所表示的范围远比定点数大.假设机器中的数由 8 位二进制数表示(包括符号位),浮点表示时,用3位表示阶码(其中含一位符号位),5位表示尾数(其中含一位符号位).两者表示范围的比较如下表所示:
-1/128
2—11×(-0.0001)
-1/128
-0.0000001
最大负数
-7.5
211×(-0.1111)
-127/128
-0.1111111
最小负数
7.5
211×0.1111
127/128
0.1111111
最大正数
1/128
2—11×O.0001
1/128
0.0000001
最小正数
十进制表示
二进制表示
十进制表示
二进制表示
浮 点 数
定 点 小 数
从上表看出,表示数的位数相同时,浮点表示的范围比定点表示的范围大得多.
当机器字长一定时,分给阶码的位数越多,尾数占用的位数就越少,则数的表示范围越大.而尾数占用的位数减少,必然会减少数的有效数位,即影响数的精度.若阶码和尾数各占4位,只考虑绝对值,则数的表示范围是2-111×0.001~2111×0.111.即为十进制数1/1024到112.这比阶码为3位时数的表示范围大得多,但尾数减少了一位,这就使尾数的精度受到了影响.
M
E
S
64位浮点数
63 62 52 51 0
格式2 :IEEE754标准
M
E
S
32位浮点数
31 30 23 22 0
其中:S—符号位,0表示正,1表示负;
E—表示阶码,用移码表示的指数,E=e+127(32位)或1023(64位)
M —表示尾数,R — 默认为2,小数点放在尾数域的最左侧
默认真值:32位浮点数x=(-1)s×(1.M)×2E-127 e=E-127
64位浮点数x=(-1)s×(1.M)×2E-1023 e=E-1023
其中:尾数域表示的值是1.M,这是为提高数据的表示精度,当尾数的值不为 0 时,其绝对值应≥0.5,即尾数域的最高有效位应为1,否则以修改阶码同时左右移小数点的办法,使其变成这一表示形式,这称为浮点数的规格化表示.因这位总为1所以默认放在小数点的最左侧,并不存储.
注意:不是 IEEE754格式的所有位样式都以通常方式解释,某些位样式用来表示特殊值.
(1) 当阶码E为全0且尾数M也为全0时,表示的真值x为零,结合符号位S为0或1,有正零和负零之分.
(2) 当阶码E为全1且尾数M为全0时,表示的真值x为无穷大,结合符号位S为0或1,有+∞和-∞之分.把溢出当成出错处理还是当无穷大数继续运算,决定权留给用户.
(3) 阶码E去掉一个全零和一个全1,其范围在1~254(32位)和1~2046(64位),表示了一个规格化的非零和非无穷的浮点数.其真值为- 126 ~ + 127和- 1022 ~ + 1023,此时有效数据为24位和53位,即默认23位小数或52位小数的小数点左边有一个隐含的1.
正上溢出
负上溢出
下溢出机器零
可表示的正数区
可表示的负数区
虽然浮点表示能扩大数据的表示范围,但因为机器字长是有限,所以它的表数范围仍然是有限的.如果在运算过程中,出现超出机器所能表示范围的数据,绝对值太大超过表数范围称为溢出,绝对值大小超过表数范围通常当成机器零.
[例1] 若浮点数x的二进制存储格式为(41360000)16,求其32位浮点数的十进制值.
[解:] 将十六进制数展开后,可得二进制数格式为
0 100 0001 0 011 0110 0000 0000 0000 0000
S 阶码(8位) 位数(23位)
指数e=阶码-127=10000010-01111111=00000011=(3)10
包括隐藏位1的尾数1.M=1.011 0110 0000 0000 0000 0000
=1.011011
于是有 x=(-1)s×1.M×2e=+(1.011011)×23
=+1011.011=(11.375)10
[例2] 将十进制数数20.59375转换成32位浮点数的二进制格式来存储
[解:] 首先分别将整数和分数部分转换成二进制数:
20.59375=10100.10011 ,然后移动小数点,使其在第1,2位之间
10100.10011=1.010010011×24 e=4
于是得到:S=0, E=4+127=131, M=010010011
最后得到32位浮点数的二进制存储格式为:
0100 0001 1010 0100 1100 0000 0000 0000=(41A4C000)16
1)字符串形式:一个字节存放一个十进制的数位或符号位.为了指明这样一个数,需要给出该数在主存中的起始地址和位数(串的长度).
2).压缩的十进制数串形式
压缩的十进制数串形式:一个字节存放两个十进制的数位.它比前一种形式节省存储空间,又便于直接完成十进制数的算术运算,是广泛采用的较为理想的方法.
用压缩的十进制数串表示一个数,要占用主存连续的多个字节.每个数位占用半个字节(即4个二进制位),其值可用二-十编码(BCD码)或数字符的ASCII码的低4位表示.符号位也占半个字节并放在最低数字位之后,其值选用四位编码中的六种冗余状态中的有关值,如用12(C)表示正号用13(D)表示负号.在这种表示中,规定数位加符号位之和必须为偶数,当和不为偶数时,应在最高数字位之前补一个0.此时,表示一个数要占用该偶数值的一半那么多个字节,例如 +123 和-12分别被表示成:
C
3
2
1
(+123)
D
2
1
0
(-12)
3.十进制数串的表示方法
自定义数据表示则用数据本身来说明数据类型.表示形式有两种,即标志符数据表示和描述符数据表示.
标志符数据表示要求对每一个数据都附加标志符,其格式如下:
数据
标识符
其中:标志符指明后面的数据所具有的类型,如整数,浮点数,BCD数,字符串等.
标志符数据表示的优点是能简化指令系统,便于程序调试和查错,缺点是数据区域占用的存储空间增加,并使指令执行的速度减慢.
描述符数据表示主要用来描述多维结构的数据类型,如向量,矩阵,记录等.其格式为:
数据块起始地址
数据块长度
特征标记
描述符标志位
描述符标志位部分指明这是一个数据描述符;特征标记部分指明数据的各种特征;长度部分指明数组中元素个数;起始地址部分指明数据块的首地址.
标志符与描述符表示的区别是:
(1)标志符与每个数据相连,二者合起来存放在一个存储单元,而描述符要和数据分开存放.
(2)描述符表示中,先访问描述符,后访问数据,至少增加一次访存.
(3)描述符是程序的一部分,而不是数据的一部分.
4. 自定义数据表示
1.原码表示法
若定点小数的原码形式为x0x1x2 …xn ,则原码表示的定义是
式中[x]原是机器数,x是真值
例如,x=+0.1001,则[x]原=0.1001
x=- 0.1001,则[x]原=1.1001
对于0,原码机器中往往有"+0","- 0"之分,故有两种形式:
[+0]原=0.000...0
[-0]原=1.000...0
[x]原=
x
1+|x|
0≤x< 1
- 1
采用原码表示法的优点:简单易懂,
缺点:(1) 加法运算复杂.这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法.而在进行减法时还要比较绝对值的大小,然后用绝对值大的数减去绝对值小的数,最后还要给结果选择符号.
(2) 零的原码不惟一.
为了解决这些矛盾,人们找到了补码表示法.
若定点整数的原码形式为x0x1x2 …xn , 则原码表示的定义是
[x]原=
x
x= 2n-x= 2n +|x|
0≤x< 2n
- 2n
-3=+9(mod12)
mod12的意思就是12模数,这个"模"表示被丢掉的数值.上式在数学上称为同余式.
上例中其所以7-3和7+9(mod12)等价,原因就是表指针超过12时,将12自动丢掉,最后得到16-12=4.从这里可以得到一个启示,就是负数用补码表示时,可以把减法转化为加法.这样,在计算机中实现起来就比较方便.
2.补码表示法
若定点小数的原码形式为x0x1x2 …xn , 则补码表示的定义是
[x]补=
x
x= 2+x=2-|x|
0≤x< 1
- 1 ≤x≤ 0
例如,x=+0.1011,则[x]补=0.1011
x=-0.1011,则[x]补=10+x=10.0000-0.1011=1.0101
对于0,[+0]补=[-0]补=0.0000_______________ (mod 2)
注意,0的补码表示只有一种形式.
采用补码表示法进行减法运算就比原码方便得多了.因为不论数是正还是负,机器总是做加法,减法运算可变为加法运算.但根据补码定义,求负数的补码要从2减去|x|.为了用加法代替减法,结果还得在求补码时作一次减法,这显然是不方便的.下面介绍的反码表示法可以解决负数的求补问题.
若定点整数的原码形式为x0x1x2 …xn , 则补码表示的定义是
[x]补=
x
x= 2n+1+x=2n+1-|x|
0≤x< 2n
- 2n ≤x≤ 0
反码,就是二进制的各位数码0变为1,1变为0.若触发器Q端输出表示原码,则其Q端输出就是反码.故可知反码是容易得到的.
对定点小数,反码表示的定义为
[x]反=
x
x= (2-2-n)+x
0≤x< 1
- 1
x
x= (2n+1-1)+x
0≤x< 2n
- 2n
由定点整数负数补码的定义和反码的定义可知:
[x]补= 2n+1+x=[x]反+ 1
结论:若要一个负数变补码,其方法是符号位置1,其余各位0变1,1变0,然后在最末位上加1即可.
3.反码表示法
移码通常用于表示浮点数的阶码.由于阶码是个n位的整数,所以假定定点整数移码形式为x0x1x2 …xn时,对定点整数,移码的定义是
[x]移=2n+x -2n ≤x< 2n
若阶码数值部分为5位,以x表示真值,则
[x]移=25+x ___ - 25 ≤xB└┘THEN└┘READ(C)
从高位字节到低位字节依次存在主存中.
[解:]
D
A
E
R
)
C
(
N
E
H
T
B
>
A
F
I
设主存单元长度由4个字节组成.每个字节中存放相应字符的ASCII值,文字表达式中的空格"└┘"在主存中也占一个字节的位置.因而每个字节分别存放十进制的73,70,32,65,62,66,32,84,72,69,78,32,82,69,65,68,40,67,41,32.
2.字符串
1.汉字的输入编码
为了能直接使用西文标准键盘把汉字输入到计算机,就必须为汉字设计相应的输入编码方法.当前采用的方法主要有以下三类:
(1)数字编码:常用的是区位码,用数字串代表一个汉字输入.区位码是将国家标准局公布的6763个两级汉字分为94个区,每个区分94位,实际上把汉字表示成二维数组,每个汉字在数组中的下标就是区位码.区码和位码各两位十进制数字,因此输入一个汉字需按键四次.
一级3755个,汉字位于16~55区;二级汉字3008个 ,位于56~87区
优点: 无重码,且输入码与内部编码的转换比较方便
缺点: 代码难以记忆.
(2)拼音码:拼音码是以汉字拼音为基础的输入方法.使用简单方便,但汉字同音字太多,输入重码率很高,同音字选择影响了输入速度.
(3)字形编码:字形编码是用汉字的形状来进行的编码.把汉字的笔划部件用字母或数字进行编码,按笔划的顺序依次输入,就能表示一个汉字.
2.1.4 汉字的表示方法
汉字内码是用于汉字信息的存储,交换,检索等操作的机内代码,一般采用两个字节表示.比如"武"字区位码为4668,其机内码为2E44H+A0A0H=CEE4H
英文字符的机内代码是七位的ASCII码,当用一个字节表示时,最高位为"0".为了与英文字符能相互区别,汉字机内代码中两个字节的最高位均规定为"1".
注意:有些系统中字节的最高位用于奇偶校验位,这种情况下用三个字节表示汉字内码.
3.汉字字模码,有16*16点阵,24*24点阵,32*32点阵
字模码是用点阵表示的汉字字形代码,它是汉字的输出形式.
根据汉字输出的要求不同,点阵的多少也不同.字模点阵的信息量很大,所占存储空间也很大.因此字模点阵只能用来构成汉字库,而不能用于机内存储.字库中存储了每个汉字的点阵代码.当显示输出或打印输出时才检索字库,输出字模点阵,得到字形.
2.汉字内码
2.1.5 校验码
1. 奇偶校验
最简单且应用广泛的检错码是采用一位校验位的奇校验或偶校验.
设x=(x1x2 …xn-1)是一个n位字,则奇校验位C定义为
C=x1 ⊕x2 ⊕…⊕xn-1 (2.15)
式中⊕代表按位加,表明当x中包含有奇数个1时,才使C=0,有偶数个1 则C=1.
同理,偶校验位C定义为
C=x1 ⊕x2 ⊕…⊕xn-1 (2.16)
即x中包含偶数个1时,才使C=0,有奇数个1则C=1 .
假设一个字x从部件 A 传送到部件 B.在源点 A,校验位C可用上面偶校验定义公式算出来,并合在一起将(x1x2 …xn-1 C)送到B.假设在B点真正接收到的是
x=(x'1x'2…x' n-1 C'),然后计算
F=x' 1⊕x' 2⊕…⊕x'n-1⊕C '
若F=1,意味着收到的信息有错,若F=0,表明x字传送正确.
注意:
奇偶校验可提供单个错误检测,但无法检测多个错误,更无法识别错误信息的位置.
[例7]已知下表中左面一栏有5个字节的数据.请分别用奇校验和偶校验进行编码,填在中间一栏和右面一栏.
[解:] 假定最低一位为校验位,其余高8位为数据位,列表如下.从中看出,校验位的值取0还是取1, 是由数据位中1的个数决定的.
1 0 1 0 1 0 1 0 -
0 1 0 1 0 1 0 0 -
0 0 0 0 0 0 0 0 -
0 1 1 1 1 1 1 1 -
1 1 1 1 1 1 1 1 -
1 0 1 0 1 0 1 0 -
0 1 0 1 0 1 0 0 -
0 0 0 0 0 0 0 0 -
0 1 1 1 1 1 1 1 -
1 1 1 1 1 1 1 1 -
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 0
0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
奇校验编码C
偶校验编码C
数 据
1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0 1
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
1 0 1 0 1 0 1 0 0
0 1 0 1 0 1 0 0 1
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 0
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 0
0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
奇校验编码C
偶校验编码C
数 据
1).模2运算
(1)._ 模2加减运算---模2加减运算就是执行按位加运算.模2加与模2减运算的结果相同.
0±0=0,0±1=1,1±0=1,1±1=0
(2)._ 模2乘运算
模2乘运算即按模2加求部分积之和,无进位.
例
1101 被乘数
× 101 乘数
1101 部分积1
0000 部分积2
1101 部分积3
111001 部分积之和
(3).模2除运算
模2除运算即按模2减求部分余数,不借位.
2. 循环冗余校验(CRC)
其上商原则是:
部分余数首位为1时,商为1,减除数;
部分余数首位为0时,商为0,减0;
当部分余数的位数小于除数的位数时,该余数为最后余数.
例12 被除数为10010,除数为101的模2除运算.
101 商
101 10010 首位为1
101 模2减,商1
011 首位为0
000 减0, 商0
110 首位为1
101 模2减,商1
11 最后余数
(1).编码方法
CRC码由有效信息位和校验位组成.它的编码方法如下:
先将k位有效信息表达为多项式M(x)
M(x)=Ck-1x k-1+ Ck-2x k-2+…+ Cix i+…+C1x+C0
式中Ci为0或1.
将M(x)左移r位,可表示成M(x)·xr.后面的r位用来放置r位校验位.
r的取值规则是:有效信息为k位时,r>log2k.
CRC码用多项式M(x)·xr除以产生校验码的生成多项式G(x)所得的余数作为校验码.为了获得r位校验码,G(x)必须是r+1位.
设商为Q(x),余数为R(x).将余数R(x)放置到M(x)·xr中右面空出的r位上,就形成了被校验信息的CRC码.其多项式为:
2).循环冗余校验
M(x)·xr+R(x)=[Q(x)·G(x)+ R(x)]+ R(x)
=[Q(x)·G(x)]+ [R(x) + R(x)]
因模2加,R(x) + R(x)=0
所以 M(x)·xr+R(x)=Q(x)·G(x)
从上式看出CRC码一定能被G(x)除尽.
例13 求有效信息1100的CRC码,选择生成多项式G(x)=1011. M(x)=x3+x2=1100
因有效信息为4位,所以r>log24,即r>2,取r=3
M(x)·x3=x6+x5=1100000
G(x)=x3+x+1=1011
M(x)·x3 1100000
G(x) 1011
按模2除法,得出商Q(x)=1110,余数R(x)=010
∴ 该信息的CRC码M(x)·xr+R(x)=1100010
这种有效信息4位(k=4),CRC码7位(n=7)的循环校验码称为(7,4)码.
1 1 0 0 0 0 0
1 0 1 1
1 1 1 0
1 0 1 1
1 1 1 0
1 0 1 1
1 0 1 0
1 0 1 1
0 0 1 0
0 0 0 0
0 1 0
发送部件将某信息的CRC码传送至接收部件,接收部件收到CRC码后,仍用约定的多项式G(x)去除,若余数为0,表示传送正确;若余数不为0,表示出错,再由余数的值来确定哪一位出错,从而加以纠正.
上例的出错模式如下表所示
2
111
1 0 0 0 0 1 0
3
110
1 1 1 0 0 1 0
4
011
1 1 0 1 0 1 0
5
100
1 1 0 0 1 1 0
6
010
1 1 0 0 0 0 0
7
001
1 1 0 0 0 1 1
_
错
_
_
误
1
101
0 1 0 0 0 1 0
无
000
1 1 0 0 0 1 0
正确
出错位
余 数
x1 x2 x3 x4 x5 x6 x7
(2).CRC的纠错
可以用表中第二列的CRC码,采用模2除法,除以生成多项式1011验证.
更换不同的待测码,其余数与出错位的对应关系不变,只与码制和生成多项式有关.
如果出错,纠错的方法是:在不为0的余数后补一个0,继续进行模2除,同时将被检测的校验字循环左移.在除的过程中会发现,各次余数将按上表中余数的顺序循环.所以将这种码称为"循环码".
假设第一位x1出错,余数为101.101后面补0,为1010,再除以1011.余数为001.补0后再除,余数为010.以后的余数依次为100,011,…111,重复循环.每除一次,CRC校验字循环左移一位.当余数为111时,出错位移到了第二位的位置.可用异或门将其纠正,下一次左移就会将正确的代码送至第一位.对于(7,4)码,共循环左移7次,即可得到纠正后的代码.
1 0 1 1
0 1 0 1 0
0 0 0 0
1 0 0 0
1 0 1 1
0 1 1 1
0 0 0 0
1 1 1 0
0 0 1 0
0 1 0 0
0 1 0 0 0 1 0
1 0 1 1
1 0 1 0
1 0 1 1
0 0 0 0
1 0 0 0 1 0 0
0 0 0 1 0 0 1
0 0 1 0 0 1 0
0 0 0 0
1 0 0 0
0 1 0 0 1 0 0
1 0 1 1
0 1 1 0
1 0 0 1 0 0 0
0 0 0 0
0 0 1 0 0 0 1
1 1 0 0
1 0 1 1
1 1 1
1 1 0 0 0 1 0
对于CRC校验中的生成多项式有一些特殊要求:
i. 任何一位发生错误都能产生一个不为0的余数;
ii. 不同位发生错误时,产生的余数应该不同;
iii.对余数继续作模2除时,应使余数循环.
10011
111010001
(x4+x+1)
(x4+x+1)(x4+x3+x2+x+1)
11
7
15
1011
1101
_
11101
10111
G1(x)=x3+x+1
或=x3+x2+1
G2(x)=G1(x)(x+1)
=(x3+x+1)(x+1)
或=(x3+x2+1)(x+1)
4
3
7
G(x)的二进制码
G(x)生成多项式
k
n
(3).生成多项式
2.2 定点加法减法运算
2.2.1 补码加法
负数用补码表示后,可以和正数一样来处理.这样,运算器里只需要一个加法器就可以了,不必为了负数的加法运算,再配一个减法器.
补码加法的公式是 [x]补+[y]补=[x+y]补 (mod 2)
现分四种情况来证明.假设采用定点小数表示,因此证明的先决条件是
|x|<1, |y|<1, |x+y|<1.
(1)x>0,y>0,则x+y>0.
相加两数都是正数,故其和也一定是正数.正数的补码和原码是一样的,可得
[x]补+[y]补=x+y=[x+y]补 (mod 2)
(2)x>0,y<0,则x+y>0或x+y0时,2 + (x+y) > 2,进位2必丢失,又因(x+y)>0,故
[x]补+[y]补=x+y=[x+y]补 (mod 2)
当x+y<0时,2 + (x+y) < 2,又因(x+y)<0,故
[x]补+[y]补=2+(x+y)=[x+y]补 (mod 2)
(3)x0,则x+y>0或 x+y<0.
这种情况和第2种情况一样,把x和y的位置对调即得证.
(4)x<0,y<0,则x+y<0.
相加两数都是负数,则其和也一定是负数.
∵ [x]补=2+x, [y]补=2+y
∴ [x]补+[y]补=2+x+2+y=2+(2+x+y)
上式右边分为"2"和(2+x+y)两部分.既然(x+y)是负数,而其绝对值又小于1,那么(2+x+y)就一定是小于2而大于1的数,进位"2"必丢失.又因(x+y)<0, 所以
[x]补+[y]补=2+(x+y)=[x+y]补 (mod 2)
至此我们证明了,在模2意义下,任意两数的补码之和等于该两数之和的补码.这是补码加法的理论基础,其结论也适用于定点整数
[例8] x=0.1001, y=0.0101,求x+y.
[解:] [x]补=0.1001, [y]补=0.0101
[x]补 0.1001
+[y]补 0.0101
[x+y]补 0.1110
所以 x+y=+0.1110
[例9] x=+0.1011, y=-0.0101,求x+y.
[解:] [x]补=0.1011, [y]补=1.1011
[x]补 0.1011
+[y]补 1.1011
[x+y]补 10.0110
所以 x+y=0.0110
由以上两例看到,补码加法的特点,一是符号位要作为数的一部分一起参加运算,二是要在模2的意义下相加,即超过2的进位要丢掉.
2.2.2 补码减法
负数的减法运算也要设法化为加法来做,其所以使用这种方法而不使用直接减法,是因为它可以和常规的加法运算使用同一加法器电路,从而简化了计算机的设计.
数用补码表示时,减法运算的公式为
[x-y]补=[x]补-[y]补=[x]补+[-y]补
只要证明[-y]补=-[y]补,上式即得证.现证明如下:
∵ [x+y]补=[x]补+[y]补 (mod 2)
∴ [y]补 =[x+y]补-[x]补 (2.19a)
∵ [x-y]补=[x+(-y)]补=[x]补+[-y]补
∴ [-y]补=[x-y]补-[x]补 (2.19b)
将式(2.19a)与(2.19b)相加,得
[-y]补+[y]补 =[x+y]补+[x-y]补-[x]补-[x]补
=[x+y+x-y]补-[x]补-[x]补
=[x+x]补-[x]补-[x]补=0
故 [-y]补=-[y]补 (mod 2) (2.20)
从[y]补求[-y]补的法则是:对[y]补包括符号位"求反且最末位加1",即可得到[-y]补.写成运算表达式,则为
[-y]补=「[y]补+2-n (2.21)
其中符号「表示对[y]补作包括符号位在内的求反操作,2-n表示最末位的1
[例10] 已知x1=-0.1110,x2=+0.1101,
求:[x1]补,[-x1]补,[x2]补,[-x2]补.
[解:] [x1]补=1.0010
[-x1]补=「[x1]补+2-4=0.1101+0.0001=0.1110
[x2]补=0.1101
[-x2]补=「[x2]补+2-4=1.0010+0.0001=1.0011
[例11] x=+0.1101,y=+0.0110 , 求x-y.
[解:] [x]补=0.1101 [y]补=0.0110, [-y]补=1.1010
[x]补 0.1101
+[-y]补 1.1010
[x-y]补 10.0111
所以 x-y=+0.0111
2.2.3 溢出概念与检测方法
在定点小数机器中,数的表示范围为|x|x≥0
4+x 0>x≥-2 (2.22)
或用同余式表示 [x]补=4+x (mod 4)
下式也同样成立: [x]补+[y]补=[x+y]补 (mod 4)
为了得到两数变形补码之和等于两数之和的变形补码,同样必须:
两个符号位都看作数码一样参加运算
两数进行以4位模的加法,即最高符号位上产生的进位要丢掉.
[x]补=
判断"溢出"是否发生的方法
用变形补码后,如果两个数相加的其结果的符号位出现"01"或"10"两种组合时,表示发生溢出.这是因为两个绝对值小于1的数相加,其结果不会大于或等于2,所以最高符号位永远表示结果的正确符号.
[例14] x=+0.1100, y=+0.1000,求x+y.
[解:] [x]补=00.1100, [y]补=00.1000
[x]补 00.1100
+[y]补 00.1000
01.0100
两个符号位出现"01",表示已溢出,即结果大于+1.
[例15] x=-0.1100, y=-0.1000,求x+y.
[解:] [x]补=11.0100, [y]补=11.1000
[x]补 11.0100
+[y]补 11.1000
10.1100
两个符号位出现"10",表示已溢出,即结果小于-1.
由此可以得出如下结论:
1. 当以模4补码运算,运算结果的二符号位相异时,表示溢出;相同时,表示未溢出.故溢出逻辑表达式为 V=Sf1⊕Sf2,其中Sf1和Sf2分别为最高符号位和第二符号位.此逻辑表达式可用异或门实现.
2. 模4补码相加的结果,不论溢出与否,最高符号位始终指示正确的符号.
第二种溢出检测方法是采用单符号位法.从例14和例15中看到,当最高有效位产生进位而符号位无进位时,产生上溢;当最高有效位无进位而符号位有进位时,产生下溢.故溢出逻辑表达式为V=Cf⊕Co,其中Cf为符号位产生的进位,Co为最高有效位产生的进位.此逻辑表达式也可用异或门实现.
在定点机中当运算结果发生溢出时,机器通过逻辑电路自动检查出溢出,并进行中断处理.
2.2.4 基本的二进制加法/减法器
两个二进制数字Ai,Bi和一个进位输入Ci相加,产生一个和输出Si,以及一个进位输出Ci+1.
表2.2中列出一位全加器进行加法运算的输入输出真值表.根据表2.2所示的真值表,三个输入端和两个输入端可按如下逻辑方程进行联系:
输入
输出
Ai
Bi
Ci
Si
Ci+1
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
表2.2 一位全加器真值表
Si=Ai⊕Bi⊕Ci
Ci+1=AiBi+BiCi+CiAi
= AiBi+(Bi⊕Ai ) Ci
按此表达式组成的一位全加器示图2.2(a).
补码运算的二进制加法/减法器的逻辑结构图如下图所示:
由图看到,n个1位的全加器(FA)可级联成一个n位的行波进位加减器.
M为方式控制输入线,当M=0时,作加法(A+B)运算;当M=1时,作减法(A-B)运算,在后一种情况下,A-B运算转化成[A]补+[-B]补运算,求补过程由B+1来实现.因此,图中最右边的全加器的起始进位输入端被连接到功能方式线M上,作减法时M=1,相当于在加法器的最低位上加1.另外,图中左边还表示出单符号位法的溢出检测逻辑;当Cn=Cn-1时,运算无溢出;而当Cn≠Cn-1时,运算有溢出,经异或门产生溢出信号.
对一位全加器(FA)来说,Si的时间延迟为6T(每级异或门延迟3T),Ci+1的时间延迟为5T,其中T被定义为相应于单级逻辑电路的单位门延迟.T通常采用一个"与非"门或一个"或非"门的时间延迟来作为度量单位.
现在我们计算一个n位的行波进位加法器的时间延迟.假如采用图2.2(a)所示的一位全加器并考虑溢出检测,那么n位行波进位加法器的延迟时间ta为
ta=n·2T+9T=(2n+9)T (2.22)
9T为最低位上的两极"异或"门再加上溢出"异或"门的总时间,2T为每级进位链的延迟时间.
当不考虑溢出检测时,有
ta=(n-1)·2T+9T (2.23)
ta意味着加法器的输入端输入加数和被加数后,在最坏情况下加法器输出端得到稳定的求和输出所需的最长时间.显然这个时间越小越好.
注意:加数,被加数,进位与和数都是用电平来表示的,因此,所谓稳定的求和输出,就是指稳定的电平输出.
1.一位BCD加法器
十进制加法器可由BCD码(二-十进制码)来设计,它可以在二进制加法器的基础上加上适当的"校正"逻辑来实现,该校正逻辑可将二进制的"和"改变成所要求的十进制格式.
产生进位进位Ci+1 的情况有两种:
设 被加数为:xi+3xi+2xi+1xi+0
加数为: yi+3yi+2yi+1yi+0
进位输入为: Ci
和 si+3si+2si+1si+0
进位输出: Ci+1
一是 s'i+3s'i+2s'i+1s'i+0 =xi+3xi+2xi+1xi+0 + yi+3yi+2yi+1yi+0 的值大于9小于等于15,即和为 : 1010 ~1111.此时为应进位而未进位,所以需要加6修正;
二是s'i+3s'i+2s'i+1s'i+0 =xi+3xi+2xi+1xi+0 + yi+3yi+2yi+1yi+0的值小于9但却已经产生了进位C'i+1 , 即和值大于1111,应此时的进位是因为大于等于16产生,所以也需要加6修正.
2.2.5 十进制加法器
第一种情况由卡诺图化简可得:
s'i+1s'i+0
s'i+3s'i+2
00
01
11
10
11
10
01
00
1
1
1
1
1
1
s'i+3s'i+2 +s'i+3s'i+1
结合第二种情况即可得加6修正的逻辑表达式如下:
Ci+1 = C'i+1 + s'i+3s'i+2 +s'i+3s'i+1
由此可得相应的一位BCD加法器电路图
C'i+1
Ci+1
Ci
Si
Xi
Yi
n位行波进位BCD加法器
n位BCD码行波式进位加法器的一般结构如图2.3(a)所示,它由n级组成,每一级将一对4位的BCD数字相加,并通过一位进位线与其相邻级连接.而每一位十进制数字的BCD加法器单元的逻辑结构示于图2.3(b).
2. n位BCD加法器
在十进制运算时,当相加二数之和大于9时,便产生进位.可是用BCD码完成十进制数运算时,当和数大于9时,必须对和数进行加6修正.这是因为,采用BCD码后,在二数相加的和数小于等于9时,十进制运算的结果是正确的;而当相加的和数大于9时,结果不正确,必须加6修正后才能得出正确的结果.因此,当第一次近似求值时,可将它看成每一级是一个4位二进制加法器来执行,就好像xi和yi是普通4位二进制数一样.设S'i代表这样得到的4位二进制数和,C'i+1为输出进位,而Si代表正确的BCD和,Ci+1代表正确的进位,那么当xi+yi+Ci<10时,
Si=S'i
当Xi+Yi+Ci≥10时, Si=S'i+6
显然,当C'i+1=1或S'i≥10时,输出进位Ci+1=1.因此,可利用Ci+1的状态来产生所要求的校正因子:Ci+1=1时校正因子为6;Ci+1=0时校正因子为0.在图2.3(b)中,4位行波式进位的二进制加法器计算出和S'i,然后S'i经过第二级二进制加法器加上0或6,则产生最终结果Si.
2.3 定点乘法运算
2.3.1 原码乘法
1.人工算法与机器算法的同异性
在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积.
设n位被乘数和乘数用定点小数表示(定点整数也同样适用)
被乘数 [x]原=xf .xn-1…x1x0
乘数 [y]原=yf .yn-1…y1y0
则乘积 [z]原=(xf⊕yf)+(0.xn-1…x1x0)(0.yn-1…y1y0)
式中,xf为被乘数符号,yf为乘数符号.
乘积符号的运算法则是:同号相乘为正,异号相乘为负.由于被乘数和乘数和符号组合只有四种情况(xfyf=00,01,10,11),因此积的符号可按"异或"(按位加)运算得到.
数值部分的运算方法与普通的十进制小数乘法类似,不过对于用二进制表达式的数来说,其乘法规则更为简单一些.
设x=0.1101,y=0.1011.先用习惯方法求其乘积,其过程如下:
设x=0.1101,y=0.1011.让我们先用习惯方法求其乘积,其过程如下
运算的过程与十进制乘法相似:从乘数y的最低位开始,若这一位为"1",则将被乘数x写下;若这一位为"0",则写下全0.然后在对乘数y的高一位进行乘法运算,其规则同上,不过这一位乘数的权与最低位乘数的权不一样,因此被乘数x要左移一位.以此类推,直到乘数各位乘完为止,最后将它们统统加起来,变得到最后乘积z.
如果被乘数和乘数用定点整数表示,我们也会得到同样的结果.
问题:人们习惯的算法对机器并不完全适用.
原因之一:机器通常只有n位长,两个n位数相乘,乘积可能为2n位.
原因之二:只有两个操作数相加的加法器难以胜任将n各位积一次相加起来的运算.
被乘数x=0.1101,乘数y=0.1011.
从乘数的最低位开始,部分积从0000开始,若乘数的相应位是1,加被数后右移一位;若乘数的相应位是0,加0000后右移一位.起到进行完所有乘数位运算.
0 0 0 0
1 1 0 1
1 1 0 1
0 1 1 0 1
1 1 0 1
1 0 0 1 1
1 0 0 1 1 1
0 0 0 0
1 0 0 1
0 1 0 0 1 1 1
1 1 0 1
1 0 0 0 1
1 0 0 0 1 1 1 1
早期计算机中为了简化硬件结构,采用串行的1位乘法方案,即多次执行"加法—移位"操作来实现.这种方法并不需要很多器件.然而串行方法毕竟太慢,自从大规模集成电路问世以来,出现了各种形式的流水式阵列乘法器,它们属于并行乘法器.
设有两个不带符号的二进制整数:
A=am-1…a1a0 m位
B=bn-1…b1b0 n位
它们的数值分别为a和b,即
m-1 n-1
a =∑ai 2i b =∑bj 2j
i=0 j=0
在二进制乘法中,被乘数A与乘数B相乘,产生m+n位乘积P:
P=pm+n-1…p1 p0 m + n位
乘积P 的数值为
实现这个乘法过程所需要的操作和人们的习惯方法非常类似:
2.不带符号的阵列乘法器
a4 a3 a2 a1 a0
b4 b3 b2 b1 b0
a4b1 a3b1 a2b1 a1b1 a0b1
a4b0 a3b0 a2b0 a1b0 a0b0
a4b2 a3b2 a2b2 a1b2 a0b2
a4b3 a3b3 a2b3 a1b3 a0b3
a4b4 a3b3 a2b4 a1b4 a0b4
p9 p8 p7 p6 p5 p4 p3 p2 p1 p0
×
=A
=B
=P
上述过程说明了在m位乘n位不带符号整数的阵列乘法中,"加法—移位"操作的被加数矩阵.每一个部分乘积项(位积)aibj叫做一个被加数.
这m×n个被加数{ai bj | 0≤i≤m-1和0≤j≤n-1}可以用m×n个"与"门并行地产生.显然,设计高速并行乘法器的基本问题,就在于缩短被加数矩阵中每列所包含的1的加法时间.
对于n位×n位的乘法器,实现时,需要n(n-1)个全加器和n2个"与"门.该乘法器的总的乘法时间可以估算如下:
令Ta为"与门"的传输延迟时间,Tf为全加器(FA)的进位传输延迟时间,假定用2级"与非"逻辑来实现FA的进位链功能,那么我们就有
Ta = Tf = 2T
从演示中可知,最坏情况下延迟途径,即是沿着矩阵最右边的对角线和最下面的一行.因而得n位×n位不带符号的阵列乘法器总的乘法时间为:
tm=Ta+[(n-1)+(n-1)]×Tf=2T+(2n-2)×2T=(4n-2)×2T
[例16] 参见上CAI演示,已知两个不带符号的二进制整数A = 11011,B = 10101,求每一部分乘积项aibj的值与p9p8……p0的值.
[解:]
a4b0=1 a3b0=1 a2b0=0 a1b0=1 a0b0=1
a4b1=0 a3b1=0 a2b1=0 a1b1=0 a0b1=0
a4b2=1 a3b2=1 a2b2=0 a1b2=1 a0b2=0
a4b3=0 a3b3=0 a2b3=0 a1b3=0 a0b3=0
a4b4=1 a3b4=1 a2b4=0 a1b4=1 a0b4=1
P=p9p8p7p6p5p4p3p2p1p0=512+32+16+7=1000110111 (56710)
问题:带符号数加,减法用的是补码,乘法是否也直接用补码进行
解决方法:一是将补码转成原码再用前面的无符号数乘法器方案;
二是设计一种直接用补码进行乘法运算的新型乘法器.
对2求补器电路--将补码表示的带符号数转换成无符号绝对值
我们先来看看算术运算部件设计中经常用到的求补电路.一个具有使能控制的二进制对2求补器电路图演示 ,其逻辑表达式如下:
0≤i≤n
3.带符号的阵列乘法器
在对2求补时,要采用按位扫描技术来执行所需要的求补操作.令A=an…a1a0是给定的(n+1)为带符号的数,要求确定它的补码形式.进行求补的方法就是从数的最右端a0开始,由右向左,直到找出第一个"1",例如ai=1, 0≤i≤n.这样,ai以左的每一个输入位都求反,即1变0,0变1.最右端的起始链式输入C-1必须永远置成"0".当控制信号线E为"1"时,启动对2求补的操作.当控制信号线E为"0"时,输出将和输入相等.显然,我们可以利用符号位来作为控制信号.
例如,在一个4位的对2求补器中,,如果输入数为1010,那么输出数应是0110,其中从右算起的第2位,就是所遇到的第一个"1"的位置.用这种对2求补器来转换一个(n+1)为带符号的数,所需的总时间延迟为
tTC=n·2T+5T=(2n+5)T (2.28)
其中每个扫描级需2T延迟,而5T则是由于"与"门和"异或"门引起的.
(n+1)×(n+1)位带求补器的阵列乘法器逻辑方框图演示
(2) 带符号的阵列乘法器
通常,把包括这些求补级的乘法器又称为符号求补的阵列乘法器.在这种逻辑结构中,共使用三个求补器.其中两个算前求补器的作用是:将两个操作数A和B在被不带符号的乘法阵列(核心部件)相乘以前,先变成正整数.而算后求补器的作用则是:当两个输入操作数的符号不一致时,把运算结果变成带符号的数.
设A=anan-1…a1a0和B=bnbn-1…b1b0均为用定点表示的(n+1)位带符号整数.在必要的求补操作以后,A和B的码值输送给n×n位不带符号的阵列乘法器,并由此产生2n位真值乘积:
A·B=P=p2n-1…p1p0
p2n=an⊕bn
其中P2n为符号位.
上面CAI演示所示的带求补级的阵列乘法器既适用于原码乘法,也适用于间接的补码乘法.不过在原码乘法中,算前求补和算后求补都不需要,因为输入数据都是立即可用的.而间接的补码阵列乘法所需要增加的硬件较多.为了完成所必需的求不予乘法操作,时间大约比原码阵列乘法增加1倍.
[例17] 设x=+15,y=-13,用带求补器的原码阵列乘法器求出乘积x·y=
[解:] 设最高位为符号位,则输入数据为
[x]补=01111 [y]补 = 10011
符号位单独考虑,算前求补级后 |x|=1111,|y|=1101
算后经求补级输出并加上乘积符号位1,则原码乘积值为111000011.
符号位运算:0 ⊕ 1= 1
换算成二进制数真值是
x·y =( -11000011)2
=-( 128+64+3 )=(-195)10
十进制数验证:
x×y= 15× (-13)
= -195 相等.
[例18] 设x= - 15,y=-13,用带求补器的原码阵列乘法器求出乘积x·y=
[解:] 设最高位为符号位,则输入数据为
[x]补=10001 [y]补= 10011
符号位单独考虑,算前求补级后 |x|=1111, |y|=1101
算后经求补级输出并加上乘积符号位0,则原码乘积值为011000011.
所以乘积的真值是
x·y =(11000011)2
=(195)10
十进制数验证:x×y
= ( -15 ) × ( -13 ) = 195 相等.
2.3.2 补码乘法
1.补码与真值的转换公式
补码乘法因符号位参与运算,可以完成补码数的"直接"乘法,而不需要求补级.这种直接的方法排除了较慢的对2求补操作,因而大大加速了乘法过程.
首先说明与直接的补码乘法相联系的数学特征.对于计算补码数的数值来说,一种较好的表示方法是使补码的位置数由一个带负权的符号和带正权的系数.
设定点补码整数:[N]补=an-1an-2…a1a0 , 其中an-1是符号位.
根据[N]补的符号,补码数[N]补和真值N的关系可以表示成:
如果我们把负权因数-2n-1强加到符号位an-1上,那么就可以把上述方程组中的两个位置表达式合并成下面的统一形式:
[例19] 已知: [N]补 = 01101,[-N]补=10011,求[N]补,[-N]补具有的数值.
[解:] [N]补=01101 具有的数值为:
N=-0×24+1×23+1×22+0×21+1×20=(+13)10
[-N]补=10011 具有的数值为:
-N=-1×24+0×23+0×22+1×21+1×20=(-13)10
常规的一位全加器可假定它的3个输入和2个输出都是正权.这种加法器通过把正权或负权加到输入/输出端,可以归纳出四类加法单元.如右表,0类全加器没有负权输入;1类全加器有1个负权输入和2个正权输入;依次类推.对0类,3类全加器而言有:
S=XYZ+XYZ+XYZ+XYZ
C=XY+YZ+ZX
对1类,2类全加器,则有
S=XYZ+XYZ+XYZ+XYZ
C=XY+XZ+YZ
2.一般化的全加器形式
注意:
0类和3类全加器是用同一对逻辑方程来表征的,它和普通的一位全加器(0类)是一致的.这是因为3类全加器可以简单地把0类全加器的所有输入输出值全部反向来得到,反之亦然.
1类和2类全加器之间也能建立类似的关系.由于逻辑表达式具有两级与一或形式,可以用"与或非"门来实现,延迟时间为2T.
利用混合型的全加器就可以构成直接补码数阵列乘法器.设被乘数A和乘数B是两个5位的二进制补码数,即
A=(a4)a3a2a1a0
B=(b4)b3b2b1b0
它们具有带负权的符号位a4和b4,并用括号标注.如果我们用括号来标注负的被加项,例如(aibj),那么A和B相乘过程中所包含的操作步骤如下面矩阵所示:
(a4) a3 a2 a1 a0 =A
×) (b4) b3 b2 b1 b0 =B
(a4b0) a3b0 a2b0 a1b0 a0b0
(a4b1) a3b1 a2b1 a1b1 a0b1
(a4b2) a3b2 a2b2 a1b2 a0b2
(a4b3) a3b3 a2b3 a1b3 a0b3
+) a4b4 (a3b4) (a2b4) (a1b4) (a0b4) p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 =P
5位乘5位的直接补码阵列乘法器逻辑原理演示
1
0
0
0
a0b0
a2b0
a1b0
a4b0
a3b0
a0b1
a1b1
a2b1
a3b1
1
0
0
a0b2
a1b2
a2b2
a3b2
1
1
0
a1b3
a2b3
a3b3
1
1
a1b4
a2b4
a3b4
2
2
2
2
2
2
2
2
a4b4
a4b3
a4b2
a4b1
a0b3
a0b4
0
0
0
0
0
p0
p1
p2
p3
p4
p5
(p9 )
p8
p7
p6
其中使用不同的逻辑符号来代表0类,1类,2类,3类全加器.2类和1类全加器具有同样的结
构,但是使用不同的逻辑符号可使乘法阵列的线路图容易理解.
在5位乘5位的情况下,该乘法器需要
6个0类全加器(右上角);
6个1类全加器(左上角);
8个2类全加器(最下两行);
总数仍为5*4=20个全加器
[解:]
(0) 1 1 0 1 = + 13
×) (1) 1 0 1 1 = - 5 (0) 1 1 0 1
(0) 1 1 0 1
(0) 0 0 0 0
(0) 1 1 0 1
0 (1) (1) (0) (1)
0 (1) 0 1 1 1 1 1 1
(1) 1 0 1 1 1 1 1 1 = - 65
验证:
-1×27+0×26+1×25+1×24+1×23+1×22+1×21+1×20
=-128+(32+16+8+4+2+1)
=-65
(13)×(-5)=-65
扩充符号位
符号位
[例20] 设[A]补=(01101)2,[B]补=(11011)2,求[A×B]补=
2.4.1 原码除法运算原理
2.4 定点除法运算
两个原码表示的数相除时,商的符号由两数的符号按位相加求得,商的数值部分由两数的数值部分相除求得.
设有n位定点小数(定点整数也同样适用):
被除数x,其原码为 [x]原=xf .xn-1…x1x0
除数y,其原码为 [y]原=yf .yn-1…y1y0
则有商q=x/y,其原码为
[q]原=(xf⊕yf)+(0.xn-1…x1x0/0.yn-1…y1y0)
商的符号运算qf=xf⊕yf与原码乘法一样,用模2求和得到.商的数值部分的运算,实质上是两个正数求商的运算.根据我们所熟知的十进制除法运算方法,很容易得到二进制数的除法运算方法,所不同的只是在二进制中,商的每一位不是"1"就是"0",其运算法则更简单一些.
下面仅讨论数值部分的运算.设被除数x=0.1001,除数y=0.1011,模仿十进制除法运算,以手算方法求x÷y的过程如下:
0.1 1 0 1 商q
0.1 0 1 1 _0.1 0 0 1 0 x(r0),被除数小于除数,商0
-0.0 1 0 1 1 2-1y除数右移1位,减除数,商1_
0.0 0 1 1 1 0 r1 得余数r1
-0.0 0 1 0 1 1 2-2y 除数右移1位,减除数,商1
0.0 0 0 0 1 1 0 r2 得余数r2
-0.0 0 0 0 0 0 0 2-3y 除数右移1位,不减除数,商0
0.0 0 0 0 1 1 0 0 r3 得余数r3
-0.0 0 0 0 1 0 1 1 2-4y 除数右移1位,减除数,商1
-0.0 0 0 0 0 0 0 1 r4 得余数r4
得x÷y的商q=0.1101,余数为r=0.00000001.
上面的笔算过程可叙述如下:
1. 判断x是否小于y 现在x2-1y,表示够减,小数点后第一位商"1",作r0-2-1y,得余数r1.
3. 比较r1和2-2y,因r1>2-2y,表示够减,小数点后第二位商"1",作r1-2-2y,得余数r2.
4. 比较r2和2-3y,因r22-4y,表示够减,小数点后第四2位商"1",作r3-2-4y,得余数r4,共求四位商,至此除法完毕.
用计算机实现手算过程时的问题:
小数点固定;
运算长度为2n;
够减与否不可先知,要通过试减才知道.
改进方法:
将被除数和余数不动,除数右移(相当于除2)改为除数不动(小数点固定),使被除数和余数左移(相当于乘2),并将上商和余数左移结合起来.
相应算法:
恢复余数法;
加减交替法;
0.1 1 0 1 商q
0.1 0 1 1 0_0.1 0 0 1 x(r0)
+ 1 1.0 1 0 1 减y,加上[-y]补 商1
0 0.0 1 1 1 r1 得余数r1
0 0.1 1 1 0 2 r1 r1左移1位
+ 1 1.0 1 0 1 减y,加上[-y]补 商1
0 0.0 0 1 1 r2 得余数r2
0 0.0 1 1 0 2 r2 r2左移1位
0 0.0 0 0 0 因2 r2 小于y 商0
0 0.0 1 1 0 r3 得余数r3
0 0.1 1 0 0 2 r3 r3左移1位,
+ 1 1.0 1 0 1 减y,加上[-y]补 商1
0 0.0 0 0 1 r4 得余数r4
得x÷y的商q=0.1101,余数为r= r4 ×2-4
= 0.0001 ×2-4 = 0.00000001
设x=0.1001,y=0.1011,则[-y]补 =11.0101,求x÷y
对计算机而言,是否够减,必须先减了才知道.
相减后若余数为正,则够减,商上1;
相减后若余数为负,则不够减,商上0,再加上除数(即恢复余数);
0 0.1 0 0 1 x
+[-y]补 1 1.0 1 0 1 减y,加上[-y]补
1_ 1.1 1 1 0 余数r0 0,商1
0 0.1 1 1 0 01 余数和商左移一位
+[-y]补 1 1.0 1 0 1 2r1 - y,
0 0.0 0 1 1 1 余数r2 > 0,商1
0 0.0 1 1 0 011 余数和商左移一位
+[-y]补 1 1.0 1 0 1 2r2 - y,
1 1.1 0 1 1 0 余数r3 0,商1
问题:
运算步数不确定
恢复余数法
分析恢复余数法的执行过程可知,除数每一步所得的余数ri 可以由前一步的余数ri-1(第一步r0 =x)左移一位减去y得到,即
ri=2ri-1 - y
若ri <0,商上0,并恢复余数(即加y),然后左移一位(即乘2)再做减y的运算,所以可写成
ri+1=2(ri+y) - y =2ri + y
这说明,第i步除法运算的余数ri=2ri-1 - y若为负时,要求得下一步的余数ri+1,不必恢复余数,只要将ri左移一位(乘2)再加上除数y即可直接得ri+1,然后再由ri+1 的正负决定上商的值.
由此可得加减交替法的运算规则:
当余数为正时,商"1",余数左移一位,减除数;
当余数为负时,商"0",余数左移一位,加除数.
加减交替法
0 0.1 0 0 1 x
+[-y]补 1 1.0 1 0 1 减y,加上[-y]补
1_ 1.1 1 1 0 0 余数r0 0,商1
0 0.1 1 1 0 01 余数和商左移一位后减y
+[-y]补 1 1.0 1 0 1 2r1 - y,
0 0.0 0 1 1 1 余数r2 > 0,商1
0 0.0 1 1 0 011 余数和商左移一位减y
+[-y]补 1 1.0 1 0 1 2r2 - y,
1 1.1 0 1 1 0 余数r3 0,商1
0 0.0 0 0 1 01101
3.直接补码阵列乘法器
2.4.2 并行除法器
1.可控加法/减法(CAS)单元
和阵列乘法器非常相似,阵列式除法器也是一种并行运算部件,采用大规模集成电路制造.与早期的串行除法器相比,阵列除法器不仅所需的控制线路少,而且能提供令人满意的高速运算速度.
阵列除法器有多种多样形式,如不恢复余数阵列除法器,补码阵列除法器等等.
首先介绍可控加法/减法(CAS)单元,它将用于并行除法流水逻辑阵列中,它有四个输出端Si, Ci+1 ,Bi,P和四个输入端Ai,Bi,P,Ci .当输入线P=0时,CAS作加法运算;当P=1时,CAS作减法运算.
CAS单元的输入与输出的关系可用如下一组逻辑方程来表示:
Si=Ai⊕(Bi⊕P)⊕Ci
Ci+1=(Ai+Ci)·(Bi⊕P)+AiCi (2.32)
当P=0时,方程式(2.32)就等于式(2.23),即得我们熟悉的一位全加器(FA)的公式: Si=Ai⊕Bi⊕Ci
Ci+1=AiBi+BiCi+AiCi
当P=1时,则得求差公式:
Si=Ai⊕Bi⊕Ci 其中Bi=Bi⊕1 Ci+1=AiBi+BiCi+AiCi (2.33)
在减法情况下,输入Ci称为借位输入,而Ci+1称为借位输出.
为说明CAS单元的实际内部电路实现,将方程式(2.32)加以变换,可得如下形式:
Si=Ai⊕(Bi⊕P)⊕Ci
=AiBiCiP+AiBiCiP+AiBiCiP
+AiBiCiP+AiBiCiP+AiBiCiP
+AiBiCiP+AiBiCiP
Ci+1=(Ai+Ci)(Bi⊕P)+AiCi
=AiBiP+AiBiP+BiCiP
+BiCiP+AiCi
在这两个表达式中,每一个都能用一个三级组合逻辑电路(包括反向器)来实现.因此每一个基本的CAS单元的延迟时间为3T单元.
1/0
0/1
0/1
0
1
1
1
1/0
0/1
1
1
1
1/0
0/1
0/1
1
0
1
0/1
1/0
0/1
0
0
1
1/0
0/1
0/1
1
1
0
0/1
1/0
0/1
0
1
0
0/1
1/0
0/1
1
0
0
0
0/1
0/1
0
0
0
Ci+1
Si
P
Ci
Bi
Ai
输 出
输 入
假定所有被处理的数都是正的小数.
不恢复余数的除法也就是加减交替法.在不恢复余数的除法阵列中,每一行所执行的操作究竟是加法还是减法,取决于前一行输出的符号与被除数的符号是否一致.当出现不够减时,部分余数相对于被除数来说要改变符号.这时应该产生一个商位"0",除数首先沿对角线右移,然后加到下一行的部分余数上.当部分余数不改变它的符号时,即产生商位"1",下一行的操作应该是减法.下图示出了4位除4位的不恢复余数阵列除法器的逻辑原理图.其中
被除数 x=0.x1x2x3x4x5x6 (双倍长)
除数 y=0.y1y2y3
商数 q=0.q1q2q3
余数 r=0.00r3r4r5r6
字长 n+1=4
2.不恢复余数的阵列除法器
1
P=1时减y即加[-y]补也就是加上-y+1
yi 右移作为一次操作数
由图看出,该阵列除法器是用一个可控加法/减法(CAS)单元所组成的流水阵列来实现的.推广到一般情况,一个(n+1)位除(n+1)位的加减交替除法阵列由(n+1)2个CAS单元组成,其中两个操作数(被除数与除数)都是正的.
单元之间的互连是用n=3的阵列来表示的.这里被除数x是一个6位的小数(双倍长度值):
x=0.x1x2x3x4x5x6
它是由顶部一行和最右边的对角线上的垂直输入线来提供的.
除数y是一个3位的小数:
y=0.y1y2y3
它沿对角线方向进入这个阵列.这是因为,在除法中所需要的部分余数的左移,可以用下列等效的操作来代替:即让余数保持固定,而将除数沿对角线右移.
商q是一个3位的小数:
q=0.q1q2q3
它在阵列的左边产生.
余数r是一个6位的小数:r=0.00r3r4r5r6
它在阵列的最下一行产生.
最上面一行所执行的初始操作经常是减法.因此最上面一行的控制线P固定置成"1".减法是用2的补码运算来实现的,这时右端各CAS单元上的反馈线用作初始的进位输入.每一行最左边的单元的进位输出决定着商的数值.将当前的商反馈到下一行,我们就能确定下一行的操作.由于进位输出信号指示出当前的部分余数的符号,因此,它将决定下一行的操作将进行加法还是减法.
对不恢复余数阵列除法器来说,在进行运算时,沿着每一行都有进位(或借位)传播,同时所有行在它们的进位链上都是串行连接.而每个CAS单元的延迟时间为3T单元,因此,对一个2n位除以n位的不恢复余数阵列除法器来说,单元的数量为(n+1)2,考虑最大情况下的信号延迟,其除法执行时间为
td=3(n+1)2T (2.34)
其中n为尾数位数.
[例20] x=0.101001, y=0.111, 求x÷y.
[解:] [-y]补=1.001
被除数x 0.1 0 1 0 0 1
减y 1.0 0 1 ______________
余数为负 1.1 1 0 0 0 1 0 q1=1
余数左移 0.1 1 0 1
减y 1.0 0 1 ____ _
余数为负 1.1 1 1 1 0 q3=1
故得 商 q=q0.q1q2q3=0.101
余数 r=(0.00r3r4r5r6)=0.000110
2.5 定点运算器的组成
2.5.1 逻辑运算
计算机中除了进行加,减,乘,除等基本算术运算外,还可对两个或一个逻辑数进行逻辑运算.所谓逻辑数,是指不带符号的二进制数.利用逻辑运算可以进行两个数的比较,或者从某个数中选取某几位等操作.计算机中的逻辑运算,主要是指逻辑非,逻辑加,逻辑乘,逻辑异四种基本运算.
1.逻辑非运算
逻辑非也称求反.对某数进行逻辑非运算,就是按位求它的反,常用变量上方加一横来表示.
设一个数x表示成: x=x0x1x2…xn
对x求逻辑非,则有 x=z=z0z1z2…zn
zi=xi (i=0,1,2,…n)
[例21] x1=01001011, x2=11110000,求x1 , x2
[解:] x1=10110100 x2=00001111
2.逻辑加运算
对两个数进行逻辑加,就是按位求它们的"或",所以逻辑加又称逻辑或,常用记号"V"或"+"来表示.
设有两数 ,它们表示为
x=x0x1…xn
y=y0y1…yn
若 x∨y=z=z0z1z2…zn
则 zi=xi∨yi, (i=0,1,2,…,n)
[例22] x=10100001,y=10011011, 求x∨y.
[解:]
1 0 1 0 0 0 0 1 x
∨ 1 0 0 1 1 0 1 1 y
1 0 1 1 1 0 1 1 z
即 x∨y = 10111011
对两数进行逻辑乘,就是按位求它们的"与",所以逻辑乘又称"逻辑与",常用记号"∧"或"·"来表示.
设有两数x和y,它们表示为
x=x0x1…xn
y=y0y1…yn
若 x∧y=z=z0z1z2…zn
则 zi=xi∧yi , (i=0,1,2,…,n)
[例23] x=10111001,y=11110011,求x∧y.
[解:]
1 0 1 1 1 0 0 1 x
∧ 1 1 1 1 0 0 1 1 y
1 0 1 1 0 0 0 1 z
即 x∧y = 10110001
3.逻辑乘运算
对两数进行异就是按位求它们的模2和,所以逻辑异又称"按位加",常用记号"⊕"表示.
设有两数x和y:x=x0x1…xn
y=y0y1…yn
若x和y的逻辑异为z:
x⊕y=z=z0z1z2…zn
则 zi=xi⊕yi, (i=0,1,2,…,n)
[例24] x=10101011,y=11001100,求x⊕y.
[解:] 1 0 1 0 1 0 1 1 x
⊕ 1 1 0 0 1 1 0 0 y
0 1 1 0 0 1 1 1 z
即 x⊕y = 01100111
事实上,逻辑加还可以通过逻辑乘和逻辑非来实现:
同样,逻辑乘也可以用逻辑加和逻辑非来实现 :
4.逻辑异运算
2.5.2 多功能算术/逻辑运算单元(ALU)
行波进位加法器的问题:
一是由于串行进位,它的运算时间很长.假如加法器由n位全加器构成,每一位的进位延迟时间为20ns,那么最坏情况下, 进位信号从最低位传递到最高位而最后输出稳定,至少需要n*20ns,这在高速计算中显然是不利的.
二是就行波进位加法器本身来说,它只能完成加法和减法两种操作而不能完成逻辑操作.本节我们介绍的多功能算术/逻辑运算单元(ALU)不仅具有多种算术运算和逻辑运算的功能,而且具有先行进位逻辑, 从而能实现高速运算.
1.基本思想
一位全加器(FA)的逻辑表达式为
Fi=Ai⊕Bi⊕Ci
Ci+1=AiBi+BiCi+CiAi (2.35)
上式中进位下标用n+i代替原来以为全加器中的i,i代表集成在一片电路上的ALU的二进制位数.对于4位一片的ALU,i=0,1,2,3.n代表若干片ALU组成更大字长的运算器时每片电路的进位输入,例如当4片组成16位字长的运算器时,n=0,4,8,12.
图2.10 ALU的逻辑结构原理框图
我们将Ai和Bi先组合成由控制参数S0,S1,S2,S3控制的组合函数Xi和Yi,然后再将Xi,Yi和下一位进位数通过全加器进行全加.这样,不同的控制参数可以得到不同的组合函数,因而能够实现多种算术运算和逻辑运算.因此,一位算术/逻辑运算单元的逻辑表达式为
Fi=Xi⊕Yi⊕Cn+i
Cn+i+1=XiYi+YiCn+i+Cn+iXi
2.逻辑表达式 控制参数S0 ,S1 ,S2 ,S3 分别控制输入Ai 和Bi ,产生Yi和Xi的函数.其中Yi是受S0 ,S1控制的Ai和Bi的组合函数,而Xi是受S2 ,S3控制的Ai和Bi组合函数,其函数关系如表2.4所示.
表2.4 Xi,Yi与控制参数和输入量的关系
根据上面所列的函数关系,即可列出Xi和Yi的逻辑表达式
Xi=S2S3+S2S3(Ai+Bi)+S2S3(Ai+Bi)+S2S3Ai
Yi=S0S1Ai+S0S1AiBi+S0S1AiBi
进一步化简并代入前面的求和与进位表达式,可得ALU的某一位逻辑表达式如下
1
Ai+Bi
Ai+Bi
Ai
0 0
0 1
1 0
1 1
Ai
AiBi
AiBi
0
0 0
0 1
1 0
1 1
Xi
S2 S3
Yi
S0 S1
AiBi
AiBi
s0s1
00
01
11
10
11
10
01
00
1
1
1
1
1
1
s2s3
00
01
11
10
11
10
01
00
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
Xi=S2S3+S2S3(Ai+Bi)+S2S3(Ai+Bi)+S2S3Ai
Xi= S3AiBi + S2AiBi
Xi= S3AiBi + S2AiBi
Yi=S0S1Ai+S0S1AiBi+S0S1AiBi
Yi=Ai+S0Bi+S1Bi
Yi=Ai+S0Bi+S1Bi
由:Xi= S3AiBi + S2AiBi
Yi=S3AiBi + S2AiBi
Xi Yi =(S3AiBi + S2AiBi)( S3AiBi + S2AiBi )
= S3AiBi + S2AiBi + S3S0AiBi + S1S2AiBi
= S3AiBi + S2AiBi
= Xi
将上式两边同是加上Yi 得
Yi + Xi Yi = Xi + Yi
Yi = Xi + Yi 所以有 Yi = Xi Yi
所以:Xi Yi = Yi
Cn+i+1=XiYi+YiCn+i+Cn+iXi
=Yi+YiCn+i+Cn+iXi
=Yi+XiCn+i
由此可得ALU的一位逻辑表达式为
Xi= S3AiBi + S2AiBi
Yi=Ai+S0Bi+S1Bi
Fi=Xi⊕Yi⊕Cn+i
Cn+i+1=Yi+XiCn+i
4位之间采用先行进位公式,根据式(2.36),每一位的进位公式可递推如下:
第0位向第1位的进位公式为Cn+1=Y0+X0Cn
其中Cn是向第0位(末位)的进位.
第1位向第2位的进位公式为
Cn+2=Y1+X1Cn+1=Y1+Y0X1+X0X1Cn
第2位向第3位的进位公式为
Cn+3=Y2+X2Cn+2=Y2+Y1X1+Y0X1X2+X0X1X2Cn
第3位的进位输出(即整个4位运算进位输出)公式为
Cn+4=Y3+X3Cn+3=Y3+Y2X3+Y1X2X3+Y0X1X2X3+X0X1X2X3Cn
设 G=Y3+Y2X3+Y1X2X3+Y0X1X2X3
P=X0X1X2X3
则 Cn+4=G+PCn (2.37)
这样,对一片ALU来说,可有三个进位输出.其中G称为进位发生输出,P称为进位传送输出.在电路中多加这两个进位输出的目的,是为了便于实现多片(组)ALU之间的先行进位,为此还需一个配合电路,称之为先行进位发生器(CLA),下面还要介绍.
Cn+4是本片(组)的最后进位输出.
X0
X1
X2
X3
Y3
Y2
Y1
Y0
Cn+1
Cn+2
Cn+3
逻辑表达式表明,这是一个先行进位逻辑.换句话说,第0位的进位输入Cn可以直接传送到最高位上去,因而可以实现高速运算.
用正逻辑表示的4位算术/逻辑运算单元(ALU)的逻辑电路图演示 ,它是根据上面的原始推导公式用TTL电路实现的.这个期间的商业标号为74181ALU.
3.算术逻辑运算的实现
上演示图中除了S0-S3四个控制端外,还有一个控制端M,它使用来控制ALU是进行算术运算还是进行逻辑运算的.
当M=0时,M对进位信号没有任何影响.此时F不仅与本位的被操作数Y和操作数X有关,而且与本位的进位输出,即C有关,因此M=0时,进行算术操作.
当M=1时,封锁了各位的进位输出,即C =0,因此各位的运算结果F 仅与Y 和X 有关,故M=1时,进行逻辑操作.
图2.11(b)示出了工作于负逻辑和正逻辑操作数方式的74181ALU方框图.显然,这个器件执行的正逻辑输入/输出方式的一组算术运算和逻辑操作与负逻辑输入/输出方式的一组算术运算和逻辑操作是等效的.
表2.5列出了74181ALU的运算功能表,它有两种工作方式.对正逻辑操作数来说,算术运算称高电平操作,逻辑运算称正逻辑操作(即高电平为"1",低电平为"0").对于负逻辑操作数来说,正好相反.由于S3 -S0 有16种状态组合,因此对正逻辑输入与输出而言,有16种算术运算功能和16种逻辑运算功能.同样,对于负逻辑输入与输出而言,也有16种算术运算功能和16种逻辑运算功能.
表2.5 74181ALU算术/逻辑运算功能表
说明:(1)H=高电平,L=低电平.(2)*表示每一位均移到下一个更高位,即A*=2A
说明:
(1)对正逻辑操作数而言,算术运算称为高电平操作;逻辑运算称为正逻辑操作;对负逻辑操作数而言,正好相反.
(2)表中算术运算操作是用补码表示法来表示的.其中"加"是指算术加,运算时要考虑进位,而符号"+"是指"逻辑加".
(3)减法是用补码方法进行的,其中数的反码是内部产生的,而结果输出"A减B减1",因此做减法时需在最末位产生一个强迫进位(加1),以便产生"A减B"的结果.
(4)"A=B"输出端可指示两个数相等,因此它与其他ALU的"A=B"输出端按"与"逻辑连接后,可以检测两个数的相等条件.
前面说过,74181ALU设置了P和G两个本组先行进位输出端.如果将四片74181的P,G输出端送入到74182先行进位部件(CLA),又可实现第二级的先行进位,即组与组之间的先行进位.
假设4片(组)74181的先行进位输出依次为P0,G0,G1 ,P1,P2,G2,P3,G3 ,那么参考式(2.37)的进位逻辑表达式,先行进位部件74182CLA所提供的进位逻辑关系如下:
Cn+x=G0+P0Cn
Cn+y=G1+P1Cn+x=G1+G0P1+P0P1Cn
Cn+z=G2+P2Cn+y=G2+G1P2+G0P1P2+P0P1P2Cn
Cn+4 =G3+P3Cn+z=G3+G2P3+G1P1P2+G0P1P2P3+P0P1P2P3Cn
=G*+P*Cn
其中 P*=P0P1P2P3
G*=G3+G2P3+G1P1P2+G0P1P2P3
根据以上表达式,用TTL器件实现的成组先行进位部件74182的逻辑电路图如所示 ,其中G*称为成组进位发生输出,P*称为成组进位传送输出.
4.两级先行进位的ALU
如何用若干个74181ALU位片,与配套的74182先行进位部件CLA在一起,构成一个全字长的ALU
下图示出了用两个16位全先行进位部件级联组成的32位ALU逻辑方框图.在这个电路中使用了八个74181ALU和两个74182CLA器件.很显然,对一个16位来说,CLA部件构成了第二级的先行进位逻辑,即实现四个小组(位片)之间的先行进位,从而使全字长ALU的运算时间大大缩短.
图2.13 用两个6位全先行进位部件级联组成的32位ALU
_ 总线(BUS)--信息传送公共通路.
由于计算机内部的主要工作过程是信息传送和加工的过程,因此在机器内部各部件之间的数据传送非常频繁.为了减少内部的传送线并便于控制,通常将一些寄存器之间数据传送的通路加以归并,组成总线结构,使不同来源的信息在此传输线上分时传送.
根据总线所在位置,总线分为内部总线和外部总线两类.内部总线是指CPU内各部件的连线,而外部总线是指系统总线,即CPU与存储器,I/O系统之间的连线.本节只讨论内部总线.
按总线的逻辑结构来说,总线可分为单向传送总线和双向传送总线.所谓单向总线,就是信息只能向一个方向传送.所谓双向总线,就是信息可以分两个方向传送,既可以发送数据,也可以接收数据.
2.5.3 内部总线
图2.14 由三态门组成的双向数据总线
图2.14(a)是带有缓冲驱动器的4位双向数据总线.其中所用的基本电路就是三态逻辑电路.当"发送"信号有效时,数据从左向右传送.反之,当"接收"信号有效时,数据从右向左传送.这种类型的缓冲器通常根据它们如何使用而叫作总线扩展器,总线驱动器,总线接收器等等.
图2.14(b)所示的是带有锁存器的4位双向数据总线.它主要由一个DE触发器和一个三态缓冲器组成.DE触发器是在一个普通D触发器上另加一个E输入端(允许端)而构成的.
此处E输入端用以控制D的输入.若E=0,即使D为"1",也不能输入.当接收数据,E=1,三态门被禁止,因而数据总线上的数据被接收到锁存器.当发送数据时,E=0,三态门被允许,因而锁存器的数据发送至数据总线上.
图2.14 由三态门组成的双向数据总线
运算器包括ALU\阵列乘除器\寄存器\多路开关\三态缓冲器\数据总线等逻辑部件.
运算器的设计,主要是围绕ALU和寄存器同数据总线之间如何传送操作数和运算结果进行的.
在决定方案时,需要考虑数据传送的方便性和操作速度,在微型机和单片机中还要考虑在硅片上制作总线的工艺. 计算机的运算器大体有如下三种结构形式
_ 1.单总线结构的运算器
单总线结构的运算器如(a)所示.由于所有部件都接到同一总线上,所以数据可以在任何两个寄存器之间,或者在任一个寄存器和ALU之间传送.如果具有阵列乘法器或除法器,那么它们所处的位置应与ALU相当.对这种结构的运算器来说,在同一时间内,只能有一个操作数放在单总线上.为了把两个操作数输入到ALU,需要分两次来做,而且还需要A,B两个缓冲寄存器.这种结构的主要缺点是
2.5.4 定点运算器的基本结构
操作速度较慢.虽然在这种结构中输入数据和操作结果需要三次串行的选通操作,但它并不会对每种指令都增加很多执行时间.只有在对全都是CPU寄存器中的两个操作数进行操作时,单总线结构的运算器才会造成一定的时间损失.但是由于它只控制一条总线,故控制电路比较简单.
双总线结构的运算器如(b)所示.
在这种结构中,两个操作数同时加到ALU进行运算,只需一次操作控制,而且马上就可以得到运算结果.图中,两条总线各自把其数据送至ALU的输入端.特殊寄存器分为两组,它们分别与一条总线交换数据.这样,通用寄存器中的数就可进入到任一组特殊寄存器中去,从而使数据传送更为灵活.ALU的输出不能直接加到总线上去.这是因为,当形成操作结果的输出时,两条总线都被输入数占据,因而必须在ALU输出端设置缓冲寄存器.为此,操作的控制要分两步完成:
1.在ALU的两个输入端输入操作数,形成结果并送入缓冲寄存器;
2.把结果送入目的寄存器.假如在总线1,2和ALU输入端之间再各加一个输入缓冲寄存器,并把两个输入数先放至这两个缓冲寄存器,那么,ALU输出端就可以直接把操作结果送至总线1或总线2上去.
通用寄
存器组
特 殊
寄存器
特 殊
寄存器
A
L
U
缓冲器
总线1
总线2
2.双总线结构的运算器
三总线结构的运算器如演示(C)所示.在三总线结构中,ALU的两个输入端分别由两条总线供给,而ALU的输出则与第三条总线相连.这样,算术逻辑操作就可以在一步的控制之内完成.由于ALU本身有时间延迟,所以打入输出结果的选通脉冲必须考虑到包括这个延迟.另外,设置了一个总线旁路器.如果一个操作数不需要修改,而直接从总线2传送到总线3,那么可以通过控制总线旁路器把数据传出;如果一个操作数传送时需要修改,那么就借助于ALU.很显然,三总线结构的运算器的特点是操作时间快.
通用寄
存器组
特 殊
寄存器
总线
旁路器
总线1
总线2
ALU
总线3
3.三总线结构的运算器
2.6 浮点运算方法和浮点运算器
2.6.1 浮点加法,减法运算
设有两个浮点数x和y,它们分别为
x=2Ex·Mx
y=2Ey·My
其中Ex和Ey分别为数x和y的阶码,Mx和My为数x和y的尾数.
两浮点数进行加法和减法的运算规则是
x±y=(Mx2Ex-Ey±My)2Ey, Ex0,表示Ex>Ey;若△E<0,表示Ex
(3) 尾数求和运算
对阶结束后,即可进行尾数的求和运算.不论加法运算还是减法运算,都按加法进行操作,其方法与定点加减法运算完全一样.
(4) 结果规格化
浮点数规格化数的定义是尾数M应满足
≤|M|<1
显然,对于正数而言,有M=00.1ф…ф
对于负数而言,有M=11.0ф…ф
当运算运算结果出现
M=00.0ф…ф 或11.1ф…ф
M=01.ф…ф 10.ф…ф
则需要规格化.
最高数值位与符号位不同
最高数值位与符号位相同
两个符号位不同
当浮点加减运算时,尾数求和的结果出现01.ф…ф或10.ф…ф,即两符号位不等时,这在定点加减法运算中称为溢出,是不允许的.但在浮点运算中,它表明尾数求和结果的绝对值大于1,向左破坏了规格化.此时将运算结果右移以实现规格化表示,称为向右规格化.规则是:尾数右移1位,阶码加1.
当浮点加减运算时,尾数求和的结果出现00.0ф…ф或11.1ф…ф时,即说明尾数的绝对值小于1/2,此时,应放大尾数,即左移尾数,每左移一位,阶码减1,直至尾数满足规格数定义为止.这称为向左规格化.
(5) 舍入处理
在对阶或向右规格化时,尾数要向右移位,这样,被右移的尾数的低位部分会被丢掉,从而造成一定误差,因此要进行舍入处理.简单的舍入方法有两种:一种是"0舍1入"法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位加"1".另一种是"恒置一"法,即只要数位被移掉,就在尾数的末尾恒置"1".
在IEEE754标准中,舍入处理提供了四种可选方法:
就近舍入 其实质就是通常所说的"四舍五入".例如,尾数超出规定的23位的多余位数字是10010,多余位的值超过规定的最低有效位值的一半,故最低有效位应增1.若多余的5位 是01111,则简单的截尾即可.对多余的5位10000这种特殊情况:若最低有效位现为0,则截尾;若最低有效位现为1,则向上进一位使其变为 0.
朝0舍入 即朝数轴原点方向舍入,就是简单的截尾.无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小.这种方法容易导致误差积累.
朝+∞舍入 对正数来说,只要多余位不全为0则向最低有效位进1;对负数来说则是简单的截尾.
朝-∞舍入 处理方法正好与 朝+∞舍入情况相反.对正数来说,只要多余位不全为0则简单截尾;对负数来说,向最低有效位进1.
(6) 浮点数的溢出
下图表示了浮点机器数在数轴上的分布情况.
当机器浮点数值大于最大正数A值,或小于最小负数B值时,称为上溢,这两种情况意味着阶码运算值超出了它所表示的范围,机器必须做中断处理.
当机器浮点数值小于最小正数a值,或大于最大负数b值时,称为下溢.下溢不是一个严重问题,通常看作为机器零.
_
机器浮点数表示
浮点数的溢出是以其阶码的溢出表现出来的.在加,减运算过程中要检查是否产生了溢出:若阶码正常,加(减)运算正常结束,若阶码溢出,则要进行相应处理,另外对尾数的溢出也需要处理.
阶码上溢 超过了阶码可能表示的最大值的正指数值,一般将其认为是+∞和-∞.
阶码下溢 超过了阶码可能表示的最小值的负指数值,一般将其认为是0.
尾数上溢 两个同符号尾数相加产生了最高位向上的进位,将尾数右移,阶码增1来重新对齐.
尾数下溢 在将尾数右移时,尾数的最低有效位从尾数域右端流出,要进行舍入处理.
[例25] 设x=2010×0.11011011,y=2100×(-0.10101100),
求x+y.
[解:]为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位,则它们的浮点表示分别为
[x]浮=00 010, 0.11011011
[y]浮=00 100, 1.01010100
求阶差并对阶
△E=Ex-Ey=[Ex]补+[-Ey]补=00 010+11 100=11 110
即△E为-2,x的阶码小,应使Mx右移两位,Ex加2,
[x]浮=00 100,0.00110110(11)
其中(11)表示Mx右移2位后移出的最低两位数.
尾数求和
0 0. 0 0 1 1 0 1 1 0 (11)
+ 1 1. 0 1 0 1 0 1 0 0
————————————————
1 1. 1 0 0 0 1 0 1 0 (11)
规格化处理:尾数运算结果的符号位与最高数值位同值,应执行左规处理,结果为11.00010101(1),阶码为 00 011.
舍入处理:采用0舍1入法处理,则有
1 1. 0 0 0 1 0 1 0 1
+ 1
————————————————
1 1. 0 0 0 1 0 1 1 0
判溢出:阶码符号位为00,不溢出,故得最终结果为
x+y=2011×(-0.11101010)
2.6.2 浮点乘法,除法运算
1.浮点乘法,除法运算规则
设有两个浮点数x和y: x=2Ex·Mx
y=2Ey·My
浮点乘法运算的规则是 x×y=2(Ex+Ey)·(Mx×My) (2.40)
即乘积的尾数是相乘两数的尾数之积,乘积的阶码是相乘两数的阶码之和.当然,这里也有规格化与舍入等步骤.
浮点除法运算的规则是 x÷y=2(Ex-Ey)·(Mx÷My) (2.41)
商的尾数是相除两数的尾数之商,商的阶码是相除两数的阶码之差.也有规格化和舍入等步骤.
2.浮点乘,除法运算步骤
浮点数的乘除运算大体分为四步:
第一步,0 操作数检查;第二步,阶码加/减操作;第三步,尾数乘/除操作;第四步,结果规格化及舍入处理.
1) 浮点数的阶码运算
对阶码的运算有+1,-1,两阶码求和,两阶码求差四种,运算时还必须检查结果是否溢出.在计算机中,阶码通常用补码或移码形式表示.补码运算规则和判定溢出的方法,前面已经讲过.这里只对移码的运算规则和判定溢出的方法进行讲解.
移码的定义为 [x]移=2n+x -2n ≤x< 2n
按此定义,则有 [x]移+[y]移=2n+x+2n+y
=2n+(2n+(x+y))
=2n+[x+y]移
即直接用移码实现求阶码之和时,结果的最高位多加了个1,要得到正确的移码形式结果,必须对结果的符号再执行一次求反.
当混合使用移码和补码时,考虑到移码和补码的关系:对同一个数值,其数值位完全相同,而符号位正好完全相反.而[y]补的定义为 [y]补=2n+1+y
则求阶码和用如下方式完成:
[x]移+[y]补=2n+x+2n+1+y
= 2n+ (2n+1+ (x+y)) = 2n+ [x+y]补= [x+y]移
即 [x+y]移=[x]移+[y]补 (mod 2n+1) (2.42)
同理 [x-y]移=[x]移+[-y]补 (2.43)
上二式表明执行阶码加减时,对加数或减数 y来说,应送移码符号位正常值的反码.
如果阶码运算的结果溢出,上述条件则不成立.此时,使用双符号位的阶码加法器,并规定移码的第二个符号位,即最高符号位恒用 0 参加加减运算,则溢出条件是结果的最高符号位为1.
此时,当低位符号位为 0时,表明结果上溢,为1时,表明结果下溢.当最高符号位为0时,表明没有溢出;低位符号位为 1,表明结果为正;为 0 时,表明结果为负.
[例26] x=+011,y=+110,求[x+y]移 和 [x-y]移,并判断是否溢出.
[解:] [x]移=01 011, [y]补=00 110, [-y]补=11 010
[x+y]移=[x]移+[y]补=10 001, 结果上溢.
[x-y]移=[x]移+[-y]补=00 101, 结果正确,为-3.
(2) 尾数处理
浮点加减法对结果的规格化及舍入处理也适用于浮点乘除法.
第一种简单方法是,无条件地丢掉正常尾数最低位之后的全部数值.这种办法被称为截断处理,好处是处理简单,缺点是影响结果的精度.
第二种简单办法是,运算过程中保留右移中移出的若干高位的值,最后再按某种规则用这些位上的值修正尾数.这种处理方法被称为舍入处理.
当尾数用原码表示时,舍入规则比较简单.最简便的方法,是只要尾数的最低位为1,或移出的几位中有为1的数值位,就是最低位的值为1.另一种是0舍1入法,即当丢失的最高位的值为1时,把这个1加到最低数值位上进行修正,否则舍去丢失的的各位的值.这样处理时,舍入效果对正数负数相同,入将使数的绝对值变大,舍则使数的
绝对值变小.
当尾数是用补码表示时,所用的舍入规则,应该与用原码表示时产生相同的处理效果.具体规则是:
当丢失的各位均为0时,不必舍入;
当丢失的最高位为0 时,以下各位不全为0 时,或者丢失的最高位为1,以下各位均为0时,则舍去丢失位上的值;
当丢失的最高位为1,以下各位不全为0 时,则执行在尾数最低位入1的修正操作.
[例27] 设[x1]补=11.01100000,[x2]补=11.01100001,[x3]补=11.01101000,[x4]补=11.01111001,求执行只保留小数点后4位有效数字的舍入操作值.
[解:] 执行舍入操作后,其结果值分别为
[x1]补=11.0110 (不舍不入) [x2]补=11.0110 (舍)
[x3]补=11.0110 (舍) [x4]补=11.1000 (入)
[例28] 设有浮点数x=2-5×0.0110011,y=23×(-0.1110010),阶码用4位移码表示,尾数 (含符号位)用8位补码表示.求[x×y]浮.要求用补码完成尾数乘法运算,运算结果尾数保留高8位(含符号位),并用尾数低位字长值处理舍入操作.
[解:]移码采用双符号位,尾数补码采用单符号位,则有
[Mx]补=0.0110011, [My]补=1.0001110,
[Ey]移=01 011, [Ey]补=00 011, [Ex]移=00 011,
[x]浮=00 011, 0.0110011, [y]浮=01 011, 1.0001110
求阶码和
[Ex+Ey]移=[Ex]移+[Ey]补=00 011+00 011=00 110,值为移码形式-2.
(2) 尾数乘法运算可采用补码阵列乘法器实现,即有
[Mx]补×[My]补=[0.0110011]补×[1.0001110]补
=[1.1010010,1001010]补
(3) 规格化处理
乘积的尾数符号位与最高数值位符号相同,不是规格化的数,需要左规,阶码变为00 101(-3),
尾数变为 1.0100101,0010100.
(4) 舍入处理
尾数为负数,取尾数高位字长,按舍入规则,舍去低位字长,故尾数为1.0100101 .
最终相乘结果为 [x×y]浮=00 101,1.0100101
其真值为 x×y=2-3×(-0.1011011)
1.流水线原理
计算机的流水处理过程同工厂中的流水装配线类似.为了实现流水,首先必须把输入的任务分割为一系列的子任务,使各子任务能在流水线的各个阶段并发地执行.将任务连续不断地输入流水线,从而实现了子任务的并行.因此流水处理大幅度地改善了计算机的系统性能,是在计算机上实现时间并行性的一种非常经济的方法.
在流水线中,原则上要求各个阶段的处理时间都相同.若某一阶段的处理时间较长,势必造成其他阶段的空转等待.因此对子任务的划分,是决定流水线性能的一个关键因素,它取决于操作部分的效率,所期望的处理速度,以及成本价格等等.
假定作业 T 被分成 k 个子任务,可表达为
T={T1,T2,···,Tk}
各个子任务之间有一定的优先关系:若i>k 时, Ck->k .这就是说,理论上k级线性流水线处理几乎可以提高k倍速度.但实际上由于存储器冲突,数据相关,这个理想的加速比不一定能达到.
2.流水线浮点加法器
从图2.16可以看出,浮点数加减法由0操作数检查,对阶操作,尾数操作,结果规格化及舍入处理共4步完成,因此流水线浮点加法器可由4个过程段组成.图2.18仅示出了除0操作数检查之外的3段流水线浮点加法器框图.
假设有两个规格化的浮点数
X=1.1000×22___ Y=1.1100×24
当此二数相加时,因X具有较小的阶码,首先应使它向Y对阶,从而得到X=0.0110×24,然后尾数再相加,即
其结果要进行规格化,将尾数向右移1位,阶码加1.即规格化的结果为1.0001×25.
在图2.18所示的流水线浮点加法器框图中,标出了上述例子在每一个过程段和锁存器L中保存的流水运算结果值.
[例29]上述演示中 ,(1)假设每个过程段所需的时间为:求阶差 τ1=70ns,对阶 τ2=60ns,相加τ3=90ns,规格化 τ4=80ns,缓冲寄存器L的延时为 tl=10ns,求 4 级流水线加法器的加速比为多少 (2)如果每个过程段的时间相同,即都为75ns,(包括缓冲寄存器时间),加速比是多少
[解:]
(1)加法器的流水线时钟周期至少为
τ=90ns+10ns=100ns
如果采用同样的逻辑电路,但不是流水线方式,则浮点加法所需的时间为
τ1+τ2+τ3+τ4 =300ns
因此,4级流水线加法器的加速比为
Ck=300/100=3
(2) 当每个过程段的时间都是75ns时,加速比为
Ck=300/75=4
[例30] 已知计算一维向量x,y的求和表达式如下:
[解:]
运算流水线对向量计算显示出很大的优越性,即流水线被填"满"时具有较高的加速比和吞吐率.我们用字母 C,S,A,N 分别表示流水线的阶码比较,对阶操作,尾数相加,规格化四个段,那么向量加法计算的流水时空图如演示所示 ______.图中左面表示Xi,Yi两个元素输入流水线的时间,右面表示求和结果Zi输出流水线的时间.每隔一个时钟周期,流水线便吐出一个运算结果.
试用4段的浮点加法流水线来实现一维向量的求和运算,这4段流水线是阶码比较,对阶操作,尾数相加,规格化.只要求画出向量加法计算流水时空图.
1.CPU之外的浮点运算器
80×87是美国Intel公司为处理浮点数等数据的算术运算和多种函数计算而设计生产的专用算术运算处理器.由于它们的算术运算是配合80×86CPU进行的,所以又称为协处理器.
现以80×87浮点运算器为例,说明其特点和内部结构.
(1)以异步方式与80386并行工作,80×87相当于386的一个I/O部件,本身有它自己的指令,但不能单独使用,它只能作为386主CPU的协处理器才能运算.因为真正的读写主存的工作不是80×87完成,而是由386执行的.如果386从主存读取的指令是80×87浮点运算指令,则它们以输出的方式把该指令送到80×87,80×87接受后进行译码并执行浮点运算.80×87进行运算期间,
386可取下一条其他指令予以执行,因而实现了并行工作.如果在80×87执行浮点运算指令过程中386又取来了一条80×87指令,则80×87以给出"忙"的标志信号加以拒绝,使386暂停向80×87发送命令.只有待80×87完成浮点运算而取消"忙"的标志信号以后,386才可以进行一次发送操作.
2.6.4 浮点运算器实例
(2)可处理包括二进制浮点数,二进制整数,和压缩十进制数串三大类7种数据,其中浮点数的格式符合IEEE754标准.7种数据类型在寄存器中表示如下:
此处S为一位符号位,0代表正,1代表负.三中浮点数阶码的基值均为2.阶码值用移码表示,尾数用原码表示.浮点数有32位,64位,80位三种.80×87从存储器取数和向存储器写数时,均用80位的临时实数和其他6种数据类型执行自动转换.全部数据在80×87中均以80位临时数据的形式表示.因此80×87具有80位字长的内部结构,并有八个80位字长以"先进后出"方式管理的寄存器组,又称寄存器堆栈.
图2.20示出80×87的内部结构逻辑框图.由图看出,它不仅仅是一个浮点运算器,还包括了执行数据运算所需要的全部控制路线.就运算部分讲,有处理浮点数指数部分的部件和处理尾数
部分的部件,还有加速移位操作的移位器路线,它们通过指数总线和小数总线与八个80位字长的寄存器堆栈相连接.这些寄存器按"先进后出"方式工作,此时栈顶被用作累加器;也可以按寄存器的编号直接访问任何一个寄存器.
为了保证操作的正确执行,80×87内部还设置了三个各为16位字长的寄存器,即特征寄存器,控制寄存器和状态寄存器.
特征寄存器用每两位表示寄存器堆栈中每个寄存器的状态,即特征值为00—11四种组合时表明相应的寄存器有正确数据,数据为0,数据非法,无数据四种情况.
控制字寄存器用于控制80287的内部操作.
状态字寄存器用于表示80287的结果处理情况,例如当"忙"标志为1时,表示正在执行一条浮点运算指令,为0则表示80×87空闲.状态寄存器的低6位指出异常错误的6种类型,与控制寄存器低6位相对应.当对应的控制寄存器位为0(未屏蔽)而状态寄存器位为1时,因发生某种异常错误而产生中断请求.
2.CPU之内的浮点运算器
奔腾CPU将浮点运算器包含在芯片内.浮点运算部件采用流水线设计.
指令执行过程分为8段流水线.前4 段为指令预取(DF),指令译码(D1),地址生成(D2),取操作数(EX),在U,V流水线中完成;后4段为执行1(X1),执行2(X2),结果写回寄存器堆(WF),错误报告(ER),在浮点运算器中完成.一般情况下,由U流水线完成一条浮点数操作指令.
浮点部件内有浮点专用加法器,乘法器和除法器,有8个80位寄存器组成的寄存器堆,内部的数据总线为80位宽.因此浮点部件可支持IEEE754标准的单精度和双精度格式的浮点数.另外还使用一种称为临时实数的80位浮点数.对于浮点数的取数,加法,乘法等操作,采用了新的算法,其执行速度是80486的10倍多.
定点整数与定点小数格式
原码,反码,补码,移码表示法
定点数的补码加法与减法运算及溢出判断
定点数的补码阵列乘法运算
定点数除法的加减交替运算
浮点数的加法与减法运算
定点运算器的组成与先行进位的实现
本章要点