第3章 运算器与运算方法 运算器的功能: 1、可以对二进制数据进行各种算术和逻辑运算; 2、是计算机内部数据信息的重要通路。 教学内容: 重点介绍运算器的核心部件——算术逻辑运算单元ALU的组成与工作原理,以及数据在运算器的基本运算方法。
3.1 基本组成 1、算术逻辑运算单元ALU ▲ 运算器实现了对计算机中数据的加工处理;包括数值数据的算术运算和逻辑数据的逻辑操作。 ▲ 运算器中完成数据算术与逻辑运算的部件称之为算术与逻辑运算单元(Arithmetic and Logic Unit,简称ALU)。ALU是运算器的核心。 ▲ ALU通常表示为两个输入端口,一个输出端口和多个功能控制信号端的这样的一个逻辑符号。
图3.1 ALU的逻辑符号表示与多路开关
2. 通用寄存器组 ▲ 运算器内设有若干通用寄存器,构成通用寄存器组;用于暂时存放参加运算的数据和某些中间结果。 通用寄存器的数量越多,对提高运算器性能和程序执行速度越有利。 通用寄存器组是对用户开放的,用户可以通过指令使用这些寄存器。 ▲ 在运算器中用来提供一个操作数并存放运算结果的通用寄存器称作为累加器。 如:ADD AX,[1000H]
3、专用寄存器 ▲ 运算器需要记录下指令执行过程中的重要状态标记,以及提供运算前后数据的暂存缓冲等,这通过在运算器中设置若干专用寄存器来实现。 循环计数器对程序员是透明的。 程序状态字PSW(Program Status Word),它存放着指令执行结果的某些状态;如是否溢出、是否为零、是否有进位/借位、是否为负等。它对程序员是开放的。 堆栈指针SP(Stack Pointer),它指示了堆栈的使用情况。
4. 附加的控制线路 ▲ 在运算器中附加一些控制线路;以达到运算速度快,运算精度高的目的,。 如:运算器中的乘除运算和某些逻辑运算是通过移位操作来实现的。在ALU的输出端设置移位线路来实现左移、右移和直送。 移位线路是一个多路选择器。 图3.2 实现移位功能的多路选择器
3.2 算术与逻辑单元 3.2.1 半加器与全加器 ◆ 运算器中各种运算都是分解成加法运算进行的,因此加法器是计算机中最基本的运算单元。 3.2 算术与逻辑单元 3.2.1 半加器与全加器 ◆ 运算器中各种运算都是分解成加法运算进行的,因此加法器是计算机中最基本的运算单元。 1、半加器 ◆ 两个一位二进制数相加(不考虑低位的进位),称为半加。实现半加操作的电路,称为半加器。
表3.1 半加运算的真值表 表3.1 是两个一位二进制数Xi、Yi相加的真值表, Hi和Ci的逻辑表达式如下: HA 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 HA Xi Yi Xi Yi Hi Ci Hi Ci 图 3.3 (a) 逻辑图 (b) 符号表示 表3.1 是两个一位二进制数Xi、Yi相加的真值表, Hi和Ci的逻辑表达式如下:
2、全加器 ▲ 考虑低位进位的加法运算就是全加运算,实现全加运算的电路称为全加器。 表 3.2 全加运算的真值表 ▲ 根据真值表表3.2可写出Fi和Ci的逻辑表达式:
实现逻辑表达式的全加器逻辑图和全加器的符号表示 图 3.4 全加器的逻辑图和符号表示
3.2.2 串行进位与并行进位 n个全加器相连可得n位的加法器;图 3.5是串行进位或行波进位加法器。 图3.5 n位加法器
C1的表达式为: C1=X1Y1+(X1+Y1)C0 ◆ 先行进位或并行进位加法器 预先形成各位进位,将进位信号同时送到各个全加器的进位输入端。 ▲ 就4位加法器,讨论一下其进位C1、C2、C3和C4的产生条件: ① 下述条件中任一条满足就可生成C1=1: 1) X1、Y1均为“1”; 2) X1、Y1任一个为“1”,且进位C0为“1”。 C1的表达式为: C1=X1Y1+(X1+Y1)C0
② 下述条件中任一条满足,就可生成C2=1。 1) X2、Y2均为“1”; 2) X2、Y2任一个为“1”, 且进位C1为“1”。 C2的表达式为: C2=X2Y2+(X2+Y2)C1 =X2Y2+(X2+Y2)X1Y1+(X2+Y2)(X1+Y1)C0 ③ 同理,C3的表达式为: C3=X3Y3+(X3+Y3)C2 =X3Y3+(X3+Y3)[X2Y2+(X2+Y2)X1Y1+(X2+Y2)(X1+Y1)C0] =X3Y3+(X3+Y3)X2Y2+(X3+Y3)(X2+Y2)X1Y1 +(X3+Y3)(X2+Y2)(X1+Y1)C0
=X4Y4+(X4+Y4)X3Y3+(X4+Y4)(X3+Y3)X2Y2 +(X4+Y4)(X3+Y3)(X2+Y2)X1Y1 ④ 同理,可得C4的表达式为: C4=X4Y4+(X4+Y4)C3 =X4Y4+(X4+Y4)[X3Y3+(X3+Y3)X2Y2 +(X3+Y3)(X2+Y2)X1Y1+(X3+Y3)(X2+Y2)(X1+Y1)C0] =X4Y4+(X4+Y4)X3Y3+(X4+Y4)(X3+Y3)X2Y2 +(X4+Y4)(X3+Y3)(X2+Y2)X1Y1 +(X4+Y4)(X3+Y3)(X2+Y2)(X1+Y1)C0 定义两个辅助函数: Pi= Xi+Yi Gi= XiYi Pi表示进位传递函数 Gi表示进位产生函数。
C1=G1+P1C0 C2=G2+P2 G1+ P2P1C0 C3=G3+P3 G2+ P3P2G1+ P3 P2P1C0 ▲ 将Pi、Gi代入前面的C1~C4式,可得: C1=G1+P1C0 C2=G2+P2 G1+ P2P1C0 C3=G3+P3 G2+ P3P2G1+ P3 P2P1C0 C4=G4+P4 G3+ P4P3G2+ P4P3 P2G1 +P4P3 P2P1C0 ▲ “先行进位产生电路” (图 3.6 (a)) “4位先行进位加法器”的逻辑图(图 3.6 (b))
图3.6 (a) 先行进位产生电路
图3.6 (b) 4位先行进位加法器 四个4位先行进位加法器串接起来构成16位加法器 在各加法单元之间,进位信号是串行传送的,而在加法单元内,进位信号是并行传送的。
图3.7 组间为串行进位构成的16位加法器 并行进位的概念可用于16位加法器;进一步提高16位加法器的运算速度。 Cm=Gm+PmC0 Cm表示4位加法器的进位输出,Pm表示4位加法器的进位传递输出,Gm表示4位加法器的进位产生输出。
=Gm3 + Pm3Gm2 + Pm3Pm2Gm1+ Pm3 Pm2 Pm1C0 Pm= P4P3P2P1 Gm= G4 +P4 G3 + P4P3G2 +P4P3P2G1 应用于四个4位先行进位加法器,则有: Cm1=Gm1 + Pm1C0 Cm2=Gm2 + Pm2Cm1 =Gm2 + Pm2Gm1 + Pm2 Pm1C0 Cm3=Gm3 + Pm3Cm2 =Gm3 + Pm3Gm2 + Pm3Pm2Gm1+ Pm3 Pm2 Pm1C0 Cm4=Gm4 + Pm4Cm3 =Gm4 + Pm4Gm3 + Pm4Pm3Gm2 + Pm4Pm3Pm2 Gm1+ Pm4Pm3Pm2P m1C0
▲ 可将并行进位的概念用于更大位数的加法器上,随着加法器位数的增加,加法电路变得越来越复杂。 图3.8 组间由先行进位链构成的16位加法器 ▲ 可将并行进位的概念用于更大位数的加法器上,随着加法器位数的增加,加法电路变得越来越复杂。
考研试题 1、有一个八位二进制代码a0a1a2a3a4a5a6a7,需经加一固定二进制常数00001111的处理而得到一个新的数据A0A1A2A3A4A5A6A7,如图。设加常数以后最高位产生的进位为C0。 (1)写出C0=f(a0,a1,…,a7)的逻辑表达式 (2)分析C0=1的条件 (3)写出A0,A1,…,A7各位逻辑表达式 2、试用全加器和与非门,设计一种8421码十进制加法器.(10分)
3.2.3 ALU部件 74181ALU
4.两级先行进位的ALU 假设4片(组)74181的先行进位输出依次为P0,G0,G1P1,P2,G2,P3,G3,那么参考式(3-4) 前面说过,74181ALU设置了P和G两个本组先行进位输出端。如果将四片74181的P,G输出端送入到74182先行进位部件(CLA),又可实现第二级的先行进位,即组与组之间的先行进位。 假设4片(组)74181的先行进位输出依次为P0,G0,G1P1,P2,G2,P3,G3,那么参考式(3-4) 的进位逻辑表达式,先行进位部件74182CLA所提供的进位逻辑关系如下: Cn+x=G0+P0Cn Cn+y=G1+P1Cn+x=G1+G0P1+P0P1Cn Cn+z=G2+P2Cn+y=G2+G1P2+G0P1P2+P0P1P2Cn (3-7) Cn+4 =G3+P3Cn+z=G3+G2P3+G1P1P2+G0P1P2P3+P0P1P2P3Cn =G*+P*Cn 其中: G* = G3+G2P3+G1P1P2+G0P1P2P3 P* = P0P1P2P3
3.3 定点加、减法运算 计算机的一个重要特点是它只能用有限的数码位数来表示操作数和操作结果。 3.3 定点加、减法运算 计算机的一个重要特点是它只能用有限的数码位数来表示操作数和操作结果。 定点加、减法运算只有在遵守模运算规则的限制条件下其结果才是正确的,否则就会出现结果“溢出”。 制定用来表示正、负数的各种码制;通过数据编码来简化数据的运算,特别是补码,把加法和减法巧妙地结合起来。
3.3.1 补码定点加、减法 补码的加、减法运算公式: 在补码方法下,无论X、Y是正数还是负数,加、减法运算统一采用加法来处理; 3.3.1 补码定点加、减法 补码的加、减法运算公式: [X+Y]补= [X]补+[Y] 补 MOD 2n [X -Y]补= [X]补+[-Y] 补 MOD 2n 在补码方法下,无论X、Y是正数还是负数,加、减法运算统一采用加法来处理; [X]补和[Y]补的符号位和数值位一起参与求和运算,加、减运算结果的符号位也在求和运算中直接得出。
[X-Y]补= [X]补+[-Y]补 MOD 2 5 = 01001+00100 MOD 2 5 = 01101 = 00101 [X-Y]补= [X]补+[-Y]补 MOD 2 5 = 01001+00100 MOD 2 5 = 01101
◆当算术运算的结果超出了数码位数允许的数据范围时,就产生溢出。 ◆对于n位的二进制码表示的补码整数(一位符号),它可表示的数据范围为-2n-1~2n-1-1。 ◆若结果超过了允许表示的最大正数时,产生的溢出称为上溢; ◆若结果超过了允许表示的最小负数时,产生的溢出称为下溢。 ◆在运算器中应设有溢出判别线路和溢出标志位。
[例2]已知:[X]补=01010,[Y]补=01010 [X+Y]补=01010+01010 = 10100 MOD 2 5 溢出 [10]10 + [10]10= [20]10>15 产生上溢 [例3]已知:[X]补=10010,[Y]补=00100 [X-Y]补=10010+11100 = 01110 MOD 2 5 溢出 [-14]10 - [4]10= [-18]10<-16 产生下溢
◆ 溢出常用的判别方法: ① 两个补码数实现加、减运算时,若最高数值位向符号位的进位值Cn-1与符号位产生的进位输出值Cn不相同,表明加减运算产生了溢出OVR; 可以表示为: OVR= Cn-1Cn OVR=1 表示结果有溢出,OVR=0 表示结果正确。 在例1中,求[X+Y]补时:OVR=Cn-1Cn=11=0,结果正确 在例2中,求[X+Y]补时:OVR=Cn-1Cn=10=1,结果溢出 在例3中,求[X-Y]补时:OVR=Cn-1Cn=01=1,结果溢出
② 常用双符号位方法来判别加、减法运算是否有溢出,正数的双符号位是00,负数的双符号位是11。 采用模4补码运算,其运算结果的两个符号位不一致时,产生溢出。 运算结果的符号为01时,产生上溢; 运算结果的符号为10时,产生下溢。
考研试题:华中理工大考题 1、下图给出了补码加法器,图中A0,B0分别为两个操作数的符号位,A1,B1分别为操作数的最高有效,要求: (1)增加能实现减法运算的逻辑电路,并说明加、减法是如何被控制实现的。 (2)增加以变形补码进行运算,并且具有溢出检测功能的逻辑电路。
图3.15 实现补码加减法运算的逻辑电路 ◆实现补码加、减法运算的逻辑电路(图3.15) 图3.15 实现补码加减法运算的逻辑电路 ◆它的核心部件是二进制并行加法器F,它接收来自寄存器X和寄存器Y的两个操作数。
▲ 用图3.15 来实现加法[X+Y]补的逻辑操作步骤如下: ① [X]补寄存器X,[Y]补寄存器Y。 ② 给出控制信号:XF=1,YF=1,且1F=0 [X]补和[Y]补送入加法器F的两个输入端。 ③ 并行加法器F接收[X]补和[Y]补,完成[X]补+[Y]补的加法过程,输出[X+Y]补,并置溢出、进位等信号到标志寄存器。 ④ 给出控制信号:FX=1,加法器F的输出结果送入寄存器X。加法运算结束。
▲ 用图3.15 来实现减法[X-Y]补的逻辑操作步骤如下: ① [X]补寄存器X,[Y]补寄存器Y。 ② 给出控制信号:XF=1,YF=1。[X]补和[Y]补=yn-1yn-2y0送入加法器F的两个输入端。 ③给出控制信号:1F=1,并行加法器F接收[X]补、[Y]补和进位信号1,完成[X]补+yn-1yn-2 ……y0+1 =[X]补+[-Y] 补的加法过程,输出[X-Y]补,并置溢出、进位等信号到标志寄存器。 ④ 给出控制信号:FX=1,加法器F的输出结果[X-Y]补送入寄存器X。减法运算结束。
▲ 当寄存器X或寄存器Y的内容送到加法器F时,将符号位等值扩充一位,形成双符号位;双符号位只在加法器中执行加法运算时是必要的。 ▲ 将加法器和通用寄存器的二进制位数定义为计算机的字长。计算机的字长通常是8的整数倍。
考研试题
3.4 定点乘法运算 ◆ 常规的乘法运算方法(定点小数) ◆ 笔---纸乘法方法, ◆ 原码乘法, ◆ 带符号位运算的补码乘法, 3.4 定点乘法运算 ◆ 常规的乘法运算方法(定点小数) ◆ 笔---纸乘法方法, ◆ 原码乘法, ◆ 带符号位运算的补码乘法, ◆ 用组合逻辑线路构成的阵列乘法器。
3.4.1 原码一位乘法 ◆ 用原码实现乘法运算时,符号位与数值位是分开计算的; ◆ 原码乘法运算分为二步: 3.4.1 原码一位乘法 ◆ 用原码实现乘法运算时,符号位与数值位是分开计算的; ◆ 原码乘法运算分为二步: ① 第一步是计算乘积的符号位;乘积的符号为两个乘数符号的异或值。 ② 第二步是计算乘积的数值位;乘积的数值部分为两数的绝对值之积。
◆ 用数学表达式描述原码乘法运算 z1z2n= (x1xn )×(y1yn) 设:[X]原=x0x1xn,[Y]原=y0y1yn (其中x0 、y0分别为它们的符号位) [X*Y]原=z0z1z2n (其中z0 为结果之符号位) 则 z0= x0 y0 z1z2n= (x1xn )×(y1yn)
◆ 笔---纸乘法方法 [例1] X=0.1011,Y=0.1101,X×Y的笔---纸乘法过程: 因此 X×Y=0.10001111 0.1011 被乘数X=0.x1x2x3x4=0.1011 × 0.1101 乘数Y=0.y1y2y3y4=0.1101 1011 X × y4 × 2– 4 0000 X × y3 × 2– 3 1011 X × y2 × 2– 2 1011 X × y1 × 2– 1 0.10001111 因此 X×Y=0.10001111
◆ X×Y的笔---纸乘法过程中,计算两个正数的乘法特点: ① 用乘数Y的每一位依次去乘以被乘数,得X×yi,i=4、3、2、1。若yi=0,得0。若yi=1,得X。 ② 把①中求得的各项结果X×yi在空间上向左错位排列,即逐次左移,可以表示为X×yi×2-i 。 ③ 对②中求得的结果求和, 这也 就是两个正数的乘积。
◆ 就笔---纸乘法方法,为提高效率而采取的改进措施 ① 每将乘数Y 的一位乘以被乘数得X×yi后,就将该结果与前面所得的结果累加,而得到Pi,称之为部分积;这减少了保存每次相乘结果X×yi的开销。 ② 将部分积Pi右移一位与X×yi相加。加法运算始终对部分积中的高n位进行;因此,只需用n位的加法器就可实现二个n位数的相乘。 ③ 对乘数中“1”的位执行加法和右移运算,对“0”的位只执行右移运算,而不执行加法运算。可以节省部分积的生成时间。
◆ 部分积迭代法 n个2-1 ▲ 已知两正小数X和Y,Y=0.y1y2yn,则: X×Y=X×(0.y1y2yn) = X×y1×2-1+X×y2×2-2+X×y3×2-3+ … + X×yn×2-n P0 =2-1{2-1[2-1…2-1(2-1(0 + X×yn)+X×yn-1) +… + X×y2]+ X×y1} P1
显然,X×Y= Pn ▲ 上述乘法运算可以归结为循环地计算下列算式: 设P0 = 0 P1 = 2-1(P0+ X×yn) Pi+1= 2-1(Pi+ X×yn-i)(i=0,1,2,3,n-1) Pn = 2-1(Pn-1+ X×y1) 显然,X×Y= Pn
▲ 迭代过程可以归结为: 若Yn-i的值为“1”,将上一步迭代的部分积Pi 与X相加。 整个迭代过程以乘数最低位yn和P0=0开始,经过n次“判断——加法——右移”循环直到求出Pn为止。 Pn就为乘法结果。
实现这种方法的二个定点小数乘法的逻辑电路框图 图3.16 实现定点乘法运算的逻辑电路
Yes No 图3.17 两个定点小数的乘法操作流程
[例1] 已知 [X]原=11101 , [Y]原= 01011 , 若 [X×Y]原=z0z1z8 则 z0= 1 0=1 C P Y 说明 0 0000 1011 开始,设P0=0 +1101 y4=1,+X 0 1101 C,P 和Y同时右移一位 0 0110 1 101 得P1
z1z8=10001111 [X×Y]原=z0z1z8=110001111 0 0110 1 101 得P1 +1101 y3=1,+X 1 0011 C,P 和Y同时右移一位 0 1001 11 10 得P2 y2=0,不作加法 C,P 和Y同时右移一位 0 0100 111 1 得P3 +1101 y1=1,+X 1 0001 C,P 和Y同时右移一位 0 1000 1111 得P4 z1z8=10001111 [X×Y]原=z0z1z8=110001111
3.4.2 原码二位乘法 ◆ 原码二位乘法的思想 为提高乘法的速度,可以对乘数的每两位取值情况进行判断,一步求出对应于该两位的部分积。 3.4.2 原码二位乘法 ◆ 原码二位乘法的思想 为提高乘法的速度,可以对乘数的每两位取值情况进行判断,一步求出对应于该两位的部分积。 采用原码二位乘法,只需增加少量的逻辑线路,就可以将乘法的速度提高一倍。 在乘法中,乘数的每两位有四种可能的组合,每种组合对应于以下操作: 00 —— Pi+1=2-2Pi 01 —— Pi+1=2-2(Pi +X) 10 —— Pi+1=2-2(Pi +2X) 11 —— Pi+1=2-2(Pi +3X)
触发器T用来记录是否欠下+X,若是,则1T ① 分+X再+2X来进行,此法速度较低。 ② 以4X-X来代替3X运算,在本次运算中只执行-X,而+4X则归并到下一拍执行。 Pi+1=2-2(Pi +3X)= 2-2(Pi -X+4X)= 2-2(Pi -X) +X 用yi-1、yi和T三位来控制乘法操作 触发器T用来记录是否欠下+X,若是,则1T
◆ 原码两位乘法运算规则 表3.3 原码两位乘法运算规则
◆ 原码两位乘法运算过程举例 例1: 已知 [X]原=0111001 , [Y]原= 1100111 , [|X|]补=0111001 ,[-|X|]补=1000111 ; 若 [X×Y]原=z0z1z12 则 z0= 0 1=1 z1z12=111001×100111 具体过程: P Y T 说明 000 000000 100111 0 开始,P0=0,T=0 +111 000111 y5y6T=110 ,-X ,T=1 111 000111 P和Y同时右移2位
111 000111 P和Y同时右移2位 111 110001 11 1001 1 得P1 +001 110010 y3y4T=011 ,+2X ,T=0 001 100011 P和Y同时右移2位 000 011000 1111 10 0 得P2 +001 110010 y1y2T=100 ,+2X ,T=0 010 001010 P和Y同时右移2位 000 100010 101111 0 得P3 z1z12=100010101111 因此[X×Y]原=0100010101111
3.4.3 补码一位乘法 ◆ 考查两个补码乘法运算的例子 例1: 已知 X=0.1011,Y=0.0001 显然,[X×Y]补=[X]补×[Y]补
例2: 已知 X=0.1011,Y= - 0.0001 [X]补=01011 , [Y]补= 11111 [X×Y]补=111110101 [X]补×[Y]补=101010101 显然,[X×Y]补 [X]补×[Y]补 ▲ 对两个正数来说,它们补码的乘积等于它们乘积的补码。若乘数是负数时,这种情况就不成立了。
◆ 考查两个补码乘法运算的一般情况 n i=1 n i=1 n i=1 n i=1 Y= - y0+ yi2-i 若[X]补=x0x1 …… xn , [Y]补= y0y1 …… yn 根据补码定义,可得出其真值: Y= - y0+ yi2-i n i=1 n [X×Y]补= [X×(-y0+ yi2-i)] 补 i=1 n = [ (X ×yi2-i )- X×y0 ] 补 i=1 n = [X ×yi2-i] 补 +[-X×y0]补 i=1
◆ Booth(布斯)乘法 n i=1 Y= - y0+ yi2-i ▲ A.D.Booth算法思想: 相乘二数用补码表示,它们的符号位与数值位一起参与乘法运算过程,直接得出用补码表示的乘法结果,且正数和负数同等对待。 ▲ Booth算法推导: 已知[X]补=x0x1 …… xn , [Y]补= y0y1 …… yn ;根据补码定义,可得出: 根据补码定义,可得出其真值: Y= - y0+ yi2-i n i=1
n i=1 n i=1 = - y0+y12-1+y22-2+y32-3+ …… +yn2-n = - y0+(y1-y12-1)+ (y22-1-y22-2)+ …+ (yn2-(n-1)-yn2-n) = (y1-y0)+ (y2-y1)2-1+ (y3-y2)2-2+ …+(yn-yn-1 )2-(n-1) + ( 0-yn )2-n n = (yi+1-yi)2-i i=1 设yn+1=0(称为辅助位);有: [X×Y]补=[X× (yi+1-yi)2-i]补 n i=1 ={(y1-y0)X+2-1[( y2-y1)X+2-1(( y3-y2)X+…+2-1((yn-i+1-yn-i)X + …+2-1((yn-yn-1)X+2-1(yn+1-yn) X) …) …) ]}补
[Pi+1]补= [2-1(Pi + (yn-i+1-yn-i)X)]补 ( i= 0,1,2 … n) 得到如下递推公式: [Pi+1]补= [2-1(Pi + (yn-i+1-yn-i)X)]补 ( i= 0,1,2 … n) 上式中Pi为上次部分积,Pi+1为本次部分积。 令[P0]补=0,有: [P1]补=[2-1(yn+1-yn)×X]补 (i= 0) [P2]补=[2-1(P1 + (yn-yn-1)×X)]补 (i= 1) [Pn]补=[2-1(Pn-1 + (y2-y1)×X)]补 (i= n-1) [Pn+1]补=[Pn + (y1-y0)×X]补
经过比较可得 [X×Y]补=[Pn+1]补= [Pn + (y1-y0)*X]补 = [Pn ]补+ [ (y1-y0)*X]补 对乘数的连续两位yn-i和yn-i+1进行判断 若yn-iyn-i+1=01, 则[Pi+1]补=[2-1(Pi + X)]补 若yn-iyn-i+1=10, 则[Pi+1]补=[2-1(Pi - X)]补 若yn-iyn-i+1=00或11,则[Pi+1]补=[2-1Pi ]补 一个补码数据的右移是连同符号位右移,且最高位补充符号位的值。
▲ 补码一位乘法的运算规则: ①符号位参加运算,参加运算的操作数均以补码表示; ②被乘数、部分积取双符号参加运算,且部分积初值为0; ③乘数取单符号位参加运算,最低位增加一辅助位yn+1= 0; ④按下表操作 Yn(高位)Yn+1(低位) 操作 0 0 部分积右移一位 0 1 部分积加 [X]补 ,右移一位 1 0 部分积加 [-X]补 ,右移一位 1 1 部分积右移一位 ⑤共进行n+1次判断和运算,n次右移操作。
图3.18 布斯乘法运算流程图 yn yn+1 ynyn+1 开始 yn+1,P0 X补码制的被乘数 Y补码制的乘数 Cnn 是 是10 是01 否 开始 yn+1,P0 X补码制的被乘数 Y补码制的乘数 Cnn ynyn+1 P P+X Cn=0? P和Y同时右移一位 Cn Cn-1 yn yn+1 PP-X 结束 图3.18 布斯乘法运算流程图
P Y yn+1 说明 00 0000 10110 0 开始,设y5=0,[P0]补=0 y4 y5 =00,P、Y同时右移一位 ▲ 例3: 已知 [X]补=01101, [Y]补= 10110,[-X]补=10011。 用布斯乘法计算[X×Y]补的过程如下 P Y yn+1 说明 00 0000 10110 0 开始,设y5=0,[P0]补=0 y4 y5 =00,P、Y同时右移一位 00 0000 0 1011 0 得[P1]补 +11 0011 y3 y4 =10,+[-X]补 11 0011 P、Y同时右移一位 11 1001 10 101 1 得[P2]补 y2 y3 =11,P、Y同时右移一位 11 1100 110 10 1 得[P3]补
11 1100 110 10 1 得[P3]补 +00 1101 y1y2 =01,+[X]补 00 1001 P、Y同时右移一位 n为[y]补的数值位的位数 11 0111 1110 1 最后一次不右移 因此,[X × Y]补=101111110 ▲ 布斯乘法的算法过程为n+1次的“判断—加减—右移”的循环,判断的次数为n+1次,右移的次数为n次。 ▲ 在布斯乘法中,遇到连续的“1”或连续的“0”时,是跳过加法运算,直接实现右移操作的,运算效率高。
3.4.4 补码二位乘法 [Pi+1]补=2-1{[Pi]补 + (yn-i+1-yn-i)×X }补 3.4.4 补码二位乘法 ◆补码二位一乘的方法可以用布斯乘法过程来推导 [Pi+1]补=2-1{[Pi]补 + (yn-i+1-yn-i)×X }补 [Pi+2]补=2-1{[Pi+1]补+ (yn-i-yn-i-1)×X} 补 =2-2{[Pi ] 补+ (yn-i+1 +yn-i -2yn-i-1)×X } 补 ▲ 根据乘数的两位代码yn-i-1和yn-i以及右邻位 yn-i+1的值的组合作为判断依据,跳过[Pi+1]补步,即从[Pi]补直接求得[Pi+2]补。
▲补码两位乘法的运算规则: ①符号位参加运算,参加运算的操作数均以补码表示; ②部分积与被乘数均取三位符号参加运算,部分积初值为0; ③乘数取单符号位参加运算,最低位增加一辅助位yn+1= 0; ④按下表操作
乘数代码对 右邻位 加减判断规则 [Pi+2]补 yn-i-1 yn-i yn-i+1 0 0 0 0 2-2[Pi]补 0 0 1 +[X]补 2-2{[Pi]补+[X]补} 0 1 0 +[X]补 2-2{[Pi]补+[X]补} 0 1 1 +2[X]补 2-2{[Pi]补+2[X]补} 1 0 0 +2[-X]补 2-2{[Pi]补+2[-X]补} 1 0 1 +[-X]补 2-2{[Pi]补+[-X]补} 1 1 0 +[-X]补 2-2{[Pi]补+[-X]补} 1 1 1 0 2-2[Pi]补
⑤当n为偶数时,乘法运算过程中应判断n/2+1次,右移n/2次,即最后一次不移位; [例4]已知 [X]补 = 00011 , [Y]补= 11010 , [-X]补= 11101,2[-X]补=11010 用补码二位乘法计算[X×Y]补的过程。
P Y yn+1 说明 000 0000 11010 0 开始,设y5=0,[P0]补=0 +111 1010 y3 y4 y5 =100,+2[-X]补 111 1010 P和Y同时右移二位 111 1110 10 110 1 得[P1]补 +111 1101 y1 y2 y3 =101,+[-X]补 111 1011 P和Y同时右移二位 111 1110 1110 1 1 得[P2]补 y0 y0 y1 =111,不做加法 最后一次不右移 [X * Y]补=111101110
3.4.5 阵列乘法器 Y= y1y2y3y4 。X和Y都是无符号的小数部分。 ◆ 实现上述执行过程的阵列结构的乘法器,称为阵列乘法器(Array Multiplier) ◆ 图3.19中实现了X×Y的乘法运算,其中X=x1x2 x3 x4 , Y= y1y2y3y4 。X和Y都是无符号的小数部分。 ◆ 上式中一位乘积xi*yj用一个两输入端的“与”门实现; 每一次加法操作用一个全加器实现; 2-i和2-j 的因子所蕴含的移位是由全加器的空间错位来实现。
图3.19直接实现定点数绝对值相乘的阵列乘法器
◆ 阵列乘法器的特点 阵列乘法器的组织结构规则性强,标准化程度高。适合用超大规模集成电路实现,且能获得很高的运算速度。 集成电路的价格不断下降,阵列乘法器在某些数字系统中,例如在信号及数据处理系统中受到重视,它不需要时钟脉冲,而其乘法速度仅决定于门和加法器的传输延迟。 Booth算法的乘法运算也可以用阵列乘法器的方法实现,但要求的单元更复杂。
3.5 定点除法运算 3.5.1 原码除法运算 ① 被除数与除数比较,决定上商。若被除数小,上商0;否则上商1。得到部分余数。 3.5 定点除法运算 3.5.1 原码除法运算 ◆ 笔-纸方法的除法步骤: ① 被除数与除数比较,决定上商。若被除数小,上商0;否则上商1。得到部分余数。 ② 将除数右移,再与上一步部分余数比较,决定上商,并且求得新的部分余数。 ③ 重复执行第②步,直到求得的商的位数足够为止。
例1:已知两正数X=0.10011101, Y=0.1011
X/Y的商为0.1110,余数为0.0011*2-4 ▲ 原码一位除法规律 原码一位除法运算与原码一位乘法运算一样,要区分符号位和数值位两部分。 商的符号为相除两数符号的“异或”值,商的数值为两数的绝对值之商。
◆ 计算机中实现二个正数除法时,有几点不同: ① 比较运算用减法来实现,由减法结果的正负来判断两数的大小。结果为正,上商1;结果为负,上商0。 ② 减法运算时,加法器中两数的对齐是用部分余数左移实现,并与除数比较,以代替除数右移(手算时)与部分余数比较。左移出界的部分余数的高位都是0,对运算不会产生任何影响。 ③ 在计算机中,每一次上商过程都是把商写入商值寄存器的最低位,然后部分余数和商一起左移,腾空商寄存器的最低位以备上新的商。
◆ 采用部分余数减去除数的方法比较两者的大小,当减法结果为负,即上商0时,破坏了部分余数。可采取两种措施。 1. 恢复余数的除法 ▲ 两个正的定点小数X和Y,X=0.x1x2xn,Y=0.y1y2yn,求解X/Y的商和余数的方法: 第1步:R1=X-Y 若R1<0,则上商q0=0,同时恢复余数:R1=R1+Y。 若R1>=0,则上商q0=1。
第2步:若已求得第i次的部分余数为Ri,则第i+1次的部分余数为:Ri+1= 2Ri-Y q0位不是符号位,而是两定点小数相除时的整数部分;q0=1时,当作溢出处理。 第2步:若已求得第i次的部分余数为Ri,则第i+1次的部分余数为:Ri+1= 2Ri-Y 若R i+1<0,上商qi=0,同时恢复余数:R i+1=R i+1+Y。 若R i+1>=0,则上商qi=1。 第3步:不断循环执行第2步,直到求得所需位数的商为止。
例1:已知[X]原=01011 , [Y]原= 11101;求[X/Y]原。 计算分为符号位和数值位两部分 [X/Y]原商的符号位:01=1 [X/Y]原商的数值位计算采用恢复余数法。运算中的减法操作用补码加法实现。 [-|Y|]补=10011。 ▲ 分别标识为X和Y运算过程:
部分余数 商 说明 00 1011 0000 开始R0=X +11 0011 R1=X-Y 11 1110 0000 0 R1<0,则q0=0 +00 1101 恢复余数:R1=R1+Y 00 1011 得R1 01 0110 000 0 2R1(部分余数和商同时左移) +11 0011 -Y 00 1001 000 01 R2>0,则q1=1 01 0010 00 01 2R2 (左移) +11 0011 -Y 00 0101 00 011 R3>0,则q2=1
00 0101 00 011 R3>0,则q2=1 00 1010 0 011 2R3 (左移) +11 0011 -Y 11 1101 0 0110 R4<0,则q3=0 +00 1101 恢复余数:R4=R4+Y 00 1010 0 0110 得R4 01 0100 0110 2R4 (左移) +11 0011 -Y 00 0111 01101 R5>0,则q4=1 可见商的数值位为1101 [X/Y]原=11101 (最高位为符号位),余数为0.0111*2-4。
Y 加法 加法和移位控制逻辑 加法器 移位控制 R Q qn 计数器Cn 上商 图3.20 实现两个正数除法的逻辑线路图
开始 R,Q同时左移一位 R (R)-(Y) R被除数, Q=0 Y除数 Cnn 否 是 (R)<0 qn0 R (R)+(Y) qn1 R (R)-(Y) 否 (R)<0 Cn (Cn) -1 置溢出标志(或上商“1”) 是 否 (Cn )=0 是 qn0 R (R)+(Y) 结束 图3.21 恢复余数除法的运算流程图
2. 不恢复余数的除法 (加减交替法) ▲ 当第i次的部分余数为负时,跳过恢复余数的步骤,直接求第i+1次的部分余数。这种消除前一算法中恢复余数步骤的算法称之为不恢复余数除法。 ▲ 对两个正的定点小数X和Y采用不恢复余数除法的基本步骤: 第1步:R1=X-Y 若R1<0,则上商q0=0; 若R1>=0,则上商q0=1; q0代表两定点小数相除时的整数部分,当q0=1时,将当作溢出处理。
第2步:若已求得部分余数Ri,则第i+1次的部分余数为: 若R i< 0,上商q i -1= 0,Ri+1= 2Ri+Y,上一步中多减去的Y在这一步中弥补回来; 若R i> = 0,上商q i-1 = 1,Ri+1= 2Ri-Y,保持原有的除法过程; 第3步:不断循环执行第2步,直到求得所需位数的商为止。 结束时,若余数为负值,要执行恢复余数的操作 Rn= Rn+Y。
图3.22 实现两正定点数相除的不恢复余数除法运算流程
例1:已知 [X]原=01011 , [Y]原= 11101 ;计算[X/Y]原。 计算分为符号位和数值位两部分 [X/Y]原商的符号位:01=1 [X/Y]原商的数值位的计算采用不恢复余数的除法 参加运算的数据是[|X|]补和[|Y|]补两数,分别标识为X和Y;[-|Y|]补=10011。 运算过程如下:
部分余数 商 说明 00 1011 0000 开始R0=X +11 0011 R1=X-Y 11 1110 0000 0 R1<0,则q0=0 11 1100 000 0 2R1(部分余数和商同时左移) +00 1101 +Y 00 1001 000 01 R2>0,则q1=1 01 0010 00 01 2R2(左移) +11 0011 -Y 00 0101 00 011 R3>0,则q2=1
00 0101 00 011 R3>0,则q2=1 00 1010 0 011 2R3(左移) +11 0011 -Y 11 1101 0 0110 R4<0,则q3=0 11 1010 0110 2R4 (左移) +00 1101 +Y 00 0111 01101 R5>0,则q4=1 商的数值位为1101 [X/Y]原=11101。因为R5>0,所以,余数为0.0111*2-4。 ▲ 在不恢复余数除法运算中,每一位商的计算或是加法,或是减法,而不是两者都要。 n位数的不恢复余数除法需要n次加法运算。对恢复余数除法来说,平均需要3n/2次加法运算。
3.5.2 补码除法运算 (1) 在原码除法中,符号位与数值位区分开来运算,除法运算是在两数的绝对值上进行的。 3.5.2 补码除法运算 ◆ 补码除法与原码除法比较 (1) 在原码除法中,符号位与数值位区分开来运算,除法运算是在两数的绝对值上进行的。 在补码除法中,符号位与数值位同等参与整个除法运算过程,商的符号位在除法运算中产生。 (2) 部分余数和除数都用带符号位的补码表示时,部分余数与除数是否够除,就不再能用两数直接相减的方法来判断。 两数同号时,用减法判断,差的符号与除数符号一致表示够除,否则为不够除。两数异号时,用加法判断,和的符号与除数符号一致表示不够除,否则为够除。
表3.5 两补码数是否够减的判别方法 [R]补- [Y]补 [R]补+ [Y]补 部分余数[R]补 除数[Y]补 0 1 0 1 0 0 0 1 0 1 0 0 够减 (商1) 不够减(商0) 0 1 够减 (商1) 不够减(商0) 1 0 不够减(商0) 够减 (商1) 1 1 不够减(商0) 够减 (商1) 表中的0或1表示相应数的符号值
(3) 补码除法的结果是连同符号位在内的补码形式的商。 两数同号,商为正数,够减上商“1”,不够减上商“0”; 两数异号,商为负数,够减上商“0”,不够减上商“1”; 除法结束后,可在最低位加1的办法求出补码值的商。 ◆ 被除数为[X]补,除数为[Y]补,则[X/Y] 补的补码除法运算规则:
第1步:若[X]补与[Y]补同号:R1=[X] 补-[Y]补 若R1与[Y]补同号:上商q0=1 若R1与[Y]补异号:上商q0=0 在这里需做除法溢出判断: 若[X] 补与[Y]补同号且上商q0=1,则溢出。 若[X] 补与[Y]补异号且上商q0=0,则溢出。
第3步:重复执行第2步,直到求得足够位数的商为止。商为负数时,商的末位加1。 第2步:若已求出部分余数Ri, Ri与[Y]补同号:Ri+1 =2 Ri-[Y]补 Ri与[Y]补异号:Ri+1 =2 Ri+[Y]补 同样,若Ri+1与[Y]补同号:上商qi=1 若Ri+1与[Y]补异号:上商qi=0 第3步:重复执行第2步,直到求得足够位数的商为止。商为负数时,商的末位加1。
例3:已知 [X] 补=10111 , [Y] 补= 01101 。 部分余数 商 说明 11 0111 0000 开始R0=[X] 部分余数 商 说明 11 0111 0000 开始R0=[X] +00 1101 R1=[X]+[Y] 00 0100 0000 1 R1与[Y]同号,则q0=1 00 1000 000 1 2R1(部分余数和商同时左移) +11 0011 +[-Y] 11 1011 000 10 R2与[Y]异号,则q1=0 11 0110 00 10 2R2 +00 1101 +[Y] 00 0011 00 101 R3与[Y]同号,则q2=1
00 0011 00 101 R3与[Y]同号,则q2=1 00 0110 0 101 2R3 +11 0011 +[-Y] 11 1001 0 1010 R4与[Y]异号,则q3=0 11 0010 1010 2R4 +00 1101 +[Y] 11 1111 10100 R5与[Y]异号,则q4=0 + 1 商为负数,末位加1 10101 [X/Y] 补=10101; 余数为11111*2-4 。
3.5.3 阵列除法器 图3.23(a) 借位出信号;u= XY+X t+Yt 成值,另一方面也传送给低位。 3.5.3 阵列除法器 ◆ 用组合逻辑线路来完成除法运算 ▲ 图3.23(a) 是一个组合逻辑单元;包含借位入和借位出的全减器。 X:被减数二进制代码 Y:减数二进制代码 t: 低位传送来的借位入信号 u: 本单元送往高位的 借位出信号;u= XY+X t+Yt 图3.23(a) a: 控制信号;这个控制信号一方面决定本单元R的生 成值,另一方面也传送给低位。 R: 本单元的结果,即本位的差;R=X a (Yt); 当a=0时,R=X-(Y+t) ;当a=1时,R=X。
图3.23(a) 图3.23(b) 图3.23 直接实现定点数绝对值相除的阵列除法器
3.6 浮点运算 3.6.1 浮点加、减法 ◆ 浮点数X和Y加减法运算的规则: ▲ 两个二进制浮点数X和Y可以表示为: 3.6 浮点运算 3.6.1 浮点加、减法 ◆ 浮点数X和Y加减法运算的规则: ▲ 两个二进制浮点数X和Y可以表示为: X=Mx*2E x , Y=My*2E y , XY的结果表示为Mb*2Eb。 浮点数X和Y是按规格化数存放的,它们运算后的结果也应该是规格化的。
=12.3×103+456×103 ▲ 考查十进制数的加法运算 123×102+456×103 =(12.3+456)×103=468.3×103 ▲ 推论浮点数X和Y加减法运算的规则为: X+Y= ( Mx×2E x- E y + My)×2 E y, 不失一般性,设E x≤E y X-Y= ( Mx×2E x- E y - My)×2 E y
◆ 计算机中实现X和Y加、减法运算的步骤为: 第1步:对阶(小阶向大阶看齐) ▲ 阶码的比较通过两阶码的减法来实现,对阶使得原数中较大的阶码成为两数的公共阶码; 小阶码的尾数按两阶码的差值决定右移的数量。 ▲ 两阶码的差值表示为:E= E x- E y 若E≤0,则E b E y,E x E y,Mx Mx*2E x- E y 若E >0,则E b E x,E y E x,My My*2E y- E x
① 原码形式的尾数右移时,符号位不参加移位,数值位右移,空出位补0。 ▲ 小阶码的尾数右移时应注意: ① 原码形式的尾数右移时,符号位不参加移位,数值位右移,空出位补0。 补码形式的尾数右移时,符号位与数值位一起右移,空出位填补符号位的值。 ② 尾数的右移,使得尾数中原来|E |位有效位移出。 移出的这些位不要丢掉,应保留,并且参加后续运算。这对运算结果的精确度有一定影响。 保留的多余的位数称为警戒位。
第2步:尾数加减 第3步:尾数规格化 ▲ 对尾数进行加、减运算 MbMx My ▲ 设浮点数的尾数用补码表示,且加、减运算时采用双符号位,则规格化形式的尾数应是如下形式: 尾数为正数时:00.1xxx 尾数为负数时:11.0xxx
▲ 尾数违反规格化的情况有以下两种可能: ① 尾数加、减法运算的结果产生溢出 正溢出时,符号位为01 负溢出时,符号位为10 规格化采取的方法是: 尾数右移一位,阶码加1;这种规格化称为右规。 表示为:MbMb*2-1,EbEb+1。 ② 尾数的绝对值小于二进制的0.1。补码形式的尾数表现为最高数值位与符号位同值。
符号位不动,数值位逐次左移,阶码逐次减1,直到满足规格化形式的尾数,即最高数值位与符号位不同值为止。 K个0 尾数为正数时:00. 00---01x--x 符号位 数值位 K个1 尾数为负数时:11 .11---10x--x 符号位 数值位 采取规格化的方法: 符号位不动,数值位逐次左移,阶码逐次减1,直到满足规格化形式的尾数,即最高数值位与符号位不同值为止。 这种规格化称为左规。 表示为:MbMb*2k,EbEb-k
第4步:尾数的舍入处理 ▲ 对结果尾数进行舍入处理方法(保留n位有效尾数位) ① 0舍1入法 ② 恒置1法 警戒位中的最高位为1时,就在尾数末尾加1; 警戒位中的最高位为0时,舍去所有的警戒位; 这种方法的最大误差为2-(n+1),。 ② 恒置1法 不论警戒位为何值,尾数的有效最低位恒置1。 恒置1法产生的最大误差为2-n,n为有效尾数位数。
③ 恒舍法 无论警戒位的值是多少,都舍去。 尾数的结果就取其有效的n位的值。 称为趋向零舍入(Round toward zero)。 ▲ 上述几种简单的舍入方法对原码形式的尾数进行舍入处理,舍入的效果与真值舍入的效果是一致的。 对于补码形式的负的尾数来说,所进行的舍入处理将与真值的舍入效果可能不一致。
若要求有效小数位数为4位,采用0舍1入法 进行舍入处理,可得: [例1] 已知有X= - 0.101010,[X]补=1.010110, 若要求有效小数位数为4位,采用0舍1入法 进行舍入处理,可得: 对X进行舍入处理得: X= - 0.1011 (入) 对[X]补进行舍入处理得: [X]补=1.0110 (入) 此时 X= - 0.1010 对负数的补码来说,执行0舍处理使得原值变大,1入处理反而使得原值变小。 ▲ 对于0舍1入法,负数补码的舍入规则为:负数补码警戒位中的最高位为1,且其余各位不全为0时,在尾数末尾加1,其余情况舍去尾数。
第5步:阶码溢出判断 在例1中重新对[X]补舍入后得:[X]补=10101 (舍); ▲ 舍入处理后需检测溢出情况;若溢出,需再次规格化(右规)。 第5步:阶码溢出判断 若阶码Eb正溢出,表示浮点数已超出允许表示数范围的上限,置溢出标志。 若阶码Eb负溢出,运算结果趋于零,置结果为机器零。 浮点数加、减法运算正常结束,浮点数加、减法运算结果为Mb*2E b。
图3.24 浮点数加减法运算流程图 求阶差 对阶 11.0或00.1 尾数符号为00或11 尾数符号为10或01 11.1或00.0
例2:已知 X=0.11011011×2010, Y=-0.10101100×2100。求X+Y ① 对阶 数符 阶符 阶码 尾数 用补码来表示浮点数的尾数和阶码 [X]浮=0 0 010 11011011 [Y]浮=1 0 100 01010100 数符 阶符 阶码 尾数 ▲ [X+Y]浮= Mb×2E b,执行[X+Y]浮的过程如下: [+010]补 [- 100]补 ① 对阶 E= E x- E y=00 010+11 100=11 110 即E= -2,Mx右移两位,Mx =0.0011011011 E b= E y =0 100 警戒位
② 尾数加法 M b= M x+ M y 00.00110110 11 +11.01010100 警戒位 11.10001010 11 因此M b=11. 10001010 11 ③ 尾数规格化 尾数没有溢出,但符号位与最高数值位有K=1位相同,需左规: M b左移K=1位: M b =11. 00010101 1 E b减1: E b =0 011 警戒位
④ 舍入处理 ⑤ 阶码溢出判断 采用0舍1入法,根据负数补码舍入规则,执行舍操作。 得: M b =11 00010101 阶码无溢出,X+Y正常结束,得: [X+Y] 浮=1 0 011 00010101, 即X+Y= -0.11101011*2011
3.6.2 浮点乘、除法运算 ◆ 对浮点数的乘、除法运算来说,免去对阶这一步;两者对结果的后处理是一样的。 3.6.2 浮点乘、除法运算 ◆ 对浮点数的乘、除法运算来说,免去对阶这一步;两者对结果的后处理是一样的。 包括结果数据规格化、舍入处理和阶码判断。 ◆ 对两个规格化的浮点数X=Mx*2E x , Y=My*2E y ,实现乘、除法运算的规则如下: X×Y=(Mx×2Ex)×(My×2Ey)=(Mx×My )×2E x+E y X÷Y=(Mx×2E x )÷(My×2E y) =(Mx÷My )×2Ex- Ey
1.浮点数乘法的运算步骤 (1)两浮点数相乘 (2)尾数规格化 ◆ 浮点数的乘法和除法的运算步骤 两浮点数相乘,乘积的阶码为相乘两数的阶码之和,尾数为相乘两数之积。可以表示为: Mb= Mx× My Eb= E x+ E y (2)尾数规格化 Mx和 My都是绝对值大于或等于0.1的二进制小数,因此,两数乘积Mx× My的绝对值是大于或等于0.01的二进制小数。 不可能溢出,不需要右规。对于左规来说,最多一位,即Mb最多左移一位,阶码Eb减1。
(3)尾数舍入处理 Mx× My产生双字长乘积,如果只要求得到单字长结果,那么低位乘积就当作警戒位进行结果舍入处理。 若要求结果保留双字长乘积,就不需要舍入处理了。 (4)阶码溢出判断 对Eb的溢出判断完全相同于浮点数加、减法的相应操作。
是 否 图3.25 浮点数乘法运算流程图
2. 浮点数除法的运算步骤 (1)除数是否为0,若My =0,出错报告。 (2)两浮点数相除 2. 浮点数除法的运算步骤 (1)除数是否为0,若My =0,出错报告。 (2)两浮点数相除 两浮点数相除,商的阶码为被除数的阶码减去除数的阶码。商的尾数为相除两数的尾数之商。 可以表示为: Mb= Mx÷My ,Eb= E x- E y
(3)尾数规格化 Mx和 My都是绝对值大于或等于0.1的二进制小数,因此,两数相除Mx÷ My的绝对值是大于或等于0.1且小于1 的二进制小数。所以,对Mb不需要左规操作。 若溢出,执行右规:Mb右移一位,阶码Eb加1。 (4)尾数舍入处理 (5)阶码溢出判断 (4)、(5)两步操作相同于浮点数加、减法的相应操作。
图3.26 浮点数除法运算流程图
3.7 十进制数的加、减法运算 ■ 在二进制加、减法运算的基础上,通过适当的校正来实现将二进制的“和”改变成所要求的十进制格式。 3.7 十进制数的加、减法运算 ■ 在二进制加、减法运算的基础上,通过适当的校正来实现将二进制的“和”改变成所要求的十进制格式。 1.十进制的加法运算 ◆ BCD码加法结果修正的具体规则: (1)两个BCD数码相加之和等于或小于1001,即十进制的9,不需要修正。 (2)两个BCD数码相加之和大于或等于1010且小于或等于1111,即位于十进制的10和15之间,需要在本位加6修正。修正的结果是向高位产生进位。
(3)两个BCD数码相加之和大于1111,即十进制的15,加法的过程已经向高位产生了进位,对本位也要进行加6修正。 例1:(15)10+(21)10=(36)10 BCD码加法运算: 0001 0101 15 + 0010 0001 +21 0011 0110 36 每个十进制位的BCD码均小于9,因此,对计算结果无需修正
例2:(15)10+(26)10=(41)10 BCD码加法: 0001 0101 15 + 0010 0110 + 26 进位 0011 1011 41 修正 + 0110 0100 0001 在BCD码的加法运算中,低十进制位的二进制加法和是1011,大于1001; 需要在该位+6修正;修正使得本位结果正确,同时向上一位产生进位。
例3:(18)10+(18)10=(36)10 BCD码加法: 0001 1000 18 + 0001 1000 + 18 进位 + 0001 1000 + 18 进位 0011 0000 36 修正 + 0110 0011 0110 在BCD码的加法运算中,低十进制位的二进制加法和大于1111,向高十进制位产生了进位,此时,也需要对该十进制位进行+6修正。 ▲ 处理BCD码的十进制加法器只需要在二进制加法器上添加适当的校正逻辑就可以了
和大于1111 和大于1001 ◆ 实现Xi和Yi相加的BCD码加法器 BCD码分别是xi8xi4xi2xi1 和yi8yi4yi2yi1得到4位二进制和zi8*zi4*zi2*zi1*和进位输出Ci+1*。 校正逻辑为: Ci+1= Ci+1* + zi8* zi4*+zi8*zi2* 和大于1111 和大于1001 十进制加法器用进位信号Ci+1产生校正因子0或6。
zi8 zi4 zi2 zi1 zi8* zi4* zi2* zi1* xi8 yi8 xi4 yi4 xi2 yi2 xi1 yi1 FA Ci+1 zi8* zi4* zi2* zi1* Ci+1* FA FA FA FA xi8 yi8 xi4 yi4 xi2 yi2 xi1 yi1 图3.27 处理一位十进制数字的BCD码加法器
Zn-1 Z1 Z0 4 4 4 Cn Cn-1 C2 C1 C0 处理一位十进制数字的BCD码加法器 4 4 4 4 4 4 ◆ 用n个一位十进制数字的BCD码加法器可以构成一个n位十进制数的串行进位加法器 处理一位十进制数字的BCD码加法器 4 4 4 4 4 4 Xn-1 Yn-1 X1 Y1 X0 Y0 Zn-1 Z1 Z0 4 4 4 Cn Cn-1 C2 C1 C0 图3.28 n位十进制数的BCD码串行进位加法器
2.十进制的减法运算 (1) 先将四位二进制表示的BCD码按位取反,再加上二进制1010(十进制10),加法的最高进位位丢弃。
(2) 先将四位二进制表示的BCD码加上0110(十进制6),再将每位二进制位按位取反。 模9补码计算方法为: (1) 先对0011按位取反得1100, 再将1100加上1010且丢弃最高进位位得0110(十进制6), 显然0011的模9补码是为0110。 (2) 先将四位二进制表示的BCD码加上0110(十进制6),再将每位二进制位按位取反。 例如:BCD码0011(十进制3)的模9补码的计算方法: 先计算0011+0110=1001; 再对1001按位取反得0110。
◆实现BCD码的十进制数字Y的模9补码的组合电路 ▲ 设Y的BCD码为y8y4y2y1 , Y的模9补码表示为b8b4b2b1; y8y4y2y1和b8b4b2b1之间的真值表关系:
根据真值表得出: b1= y1 b2= y2 b4= y4 y2 +y4 y2 b8= y8 y4 y2 上式中加入变量M,并改写为如下式子: b1= y1 M + y1 M b2= y2 b4= y4M + (y4y2 +y4y2)M (3-15) b8= y8M + y8 y4 y2 M 当M=0时,b8b4b2b1表示Y本身; 当M=1时,b8b4b2b1表示Y的模9补码。
y8 y4 y2 y1 y8 y4 y2 y1 M BCD模9补码 M BCD模 9补码 x8 x4 x2 x1 Ci+1 C i ▲ 实现上式的组合电路的逻辑符号 y8 y4 y2 y1 y8 y4 y2 y1 M BCD模9补码 M BCD模 9补码 x8 x4 x2 x1 Ci+1 C i BCD码加法器(图3.27) b8 b4 b2 b1 z8 z4 z2 z1 图3.29 实现式(3-15)的组合电路符号表示 图3.30 两个BCD码的加减法运算线路