1.44k likes | 1.6k Views
第八章 运算方法. 8.1 无符号表示法 8.2 带符号表示法 8.3 BCD 码 8.4 专用运算部件 8.5 浮点数 8.6 实例: IEEE 754 浮点标准. 同济大学 软件学院. 8.1 无符号表示法. 有两种常用的无符号表示法: ◆ 非负数码: 表示 0 或一个正数 n 位非负数码的数值范围: 0 ~ 2 n -1 (所有位都为 1 ) ◆ 2 的补码(简称补码): 既能表示正数又能表示负数 n 位数的数值范围: -2 n-1 ~ 2 n-1 -1. 下表列出了 8 位二进制数的非负数码和补码表示的数值.
E N D
第八章 运算方法 8.1 无符号表示法 8.2 带符号表示法 8.3 BCD码 8.4 专用运算部件 8.5 浮点数 8.6 实例:IEEE 754 浮点标准 同济大学 软件学院
8.1 无符号表示法 有两种常用的无符号表示法: ◆ 非负数码:表示0或一个正数 n位非负数码的数值范围:0 ~2n-1 (所有位都为1) ◆2的补码(简称补码):既能表示正数又能表示负数 n位数的数值范围: -2n-1 ~ 2n-1-1
下表列出了8位二进制数的非负数码和补码表示的数值下表列出了8位二进制数的非负数码和补码表示的数值 表8.1 无符号表示的数值
8.1.1 加法和减法 1.加法 ◆ 用一个并行加法器来实现(如图所示) X和Y是8位寄存器 电路实现微操作 ADD:X←X+Y
◆ 溢出:结果不能表示为一个8位数值 例如:非负数码加法255 +1 1111 1111 + 0000 0001=1 0000 0000 溢出的判断: 并行加法器产生额外的进位输出,它用来标志 算术溢出。 (1) 非负数码 直接用进位置溢出标志,它提示系统产生 了溢出,所得结果不完全正确,系统应进行相 应的结果修复处理或错误处理。
(2) 补码 判断溢出不但要检查进位输出,还要检 查结果最高位的进位输入。如果这两者相等, 那么不产生溢出,否则产生溢出。 还有没有其它方法?
溢出 溢出 图8.2 补码加法的溢出产生
2.减法 ◆ 转换成加法 [X-Y]补=[X]补+[-Y]补 微操作 SUB:X←X-Y 图8.3 微操作X←X-Y的实现
◆ 溢出 (1) 非负数码 减法的结果不会比2n-1大,但可能比0小。 例如:1-2执行为 0000 0001+1111 1110 = 1111 1111(255) 如果减法(通过补码加法实现)产生了进位输 出0而不是1时,则发生了溢出。
溢出 溢出 (2) 补码减法 判断溢出的条件与补码加法相同。
X = 2 7 Y = 2 5 3 8 1 1 3 5 5 4 6 8 3 1 8.1.2 乘法 乘法可以看成加法的重复。 可以用下列算法来实现乘法x×y: z = 0; FOR i = 1 TO y DO { z = z + x } 这种算法不理想,原因是速度慢、计算x×y 的时间不确定。我们希望不论x 、y取何值,执行 乘法的时间相同。
1. 移位——相加乘法 首先计算每个部分积并左移到正确位置,然 后再将所有的部分积相加。 ◆ 第一个修改:每求出一个部分积后就计算和 x = 2 7 y = 2 5 3 8 1 1 3 5 1 4 3 1 ←计算的和 5 4 6 8 3 1 ←最终计算的和 任何时候都没有多于两个数的加。
◆ 第二个修改:用右移当前和代替左移部分积 x = 27 y = 253 81 ← 右移一位 81 ← 1被右移出,故不参加加法运算 135 1431 ← 右移一位 1431 ← 3 1被右移出,故不参加加法运算 54 6831 ← 最后右移一位 6831 每次都是相同的两列数字进行加法。
(1) 算法 两个n位寄存器的值X和Y的移位——相加乘法 n位寄存器U和V:保存结果 (U保存结果的高n位,V保存结果的低n位) C是一位寄存器:用来保存执行加法时的进位 U = 0; FOR i = 1 TO n DO { IF Y0 = 1 THEN CU = U + X; 线性右移CUV; 循环右移 Y }
例如:13×11,即1101×1011 初始化X = 1101,Y = 1011
(2) 算法的RTL代码 注意:当i = 0时,Z = 1; 1,2,3是连续的状态。 1:U←0,i←n Y02:CU←U + X 2:i←i-1 3:shr(CUV),cir(Y) Z’3:GOTO 2 Z 3: FINISH←1
(3) 根据 RTL代码设计硬件 硬件包括两部分: ◆ 寄存器部分:微操作在此执行 ◆ 控制部分:产生需要的控制信号和状态值 X—— n位寄存器 Y、U、V—— n位移位寄存器 (当SHR信号有效时它们右移一位) 寄存器i——存储值n的递减计数器 C和FINISH——一位寄存器 在寄存器之间设置数据通路来实现RTL代码中 的微操作所要求的数据传送。 将i的所有位异或在一起产生Z,即仅当i的所 有位都为0(i = 0)时,Z才为1。
3 1:U←0,i←n Y02:CU←U + X 2:i←i-1 3:shr(CUV),cir(Y) Z’3:GOTO 2 Z 3: FINISH←1
(4) 优化算法(不要求保存原值) 如果Y值不要求保存,可将其值保存在V寄存器 中,则乘法转换为UV←X × V。 修改后的RTL代码为: 1:U←0,i←n V02:CU←U + X 2:i←i-1 3:shr(CUV) Z’3:GOTO 2 Z 3: FINISH←1
2. 布斯算法 ◆ 对于无符号补码数据,上面的算法并不总能 得出正确的结果。 例如:13 × 11 1101和1011的补码表示:–3和-5 积:+15 而上面的算法将得出结果1000 1111( –113) ◆ 原因:该算法仅能处理两个正数相乘,当有 一个或两个操作数为负数时,通过执行下面 的程序,上面的算法仍然可以使用。
IF 被乘数 < 0 THEN 被乘数← - 被乘数; IF 乘数 < 0 THEN 乘数← - 乘数; 用非负数乘法进行乘法运算; 恢复被乘数和乘数的原值; IF 被乘数和乘数中有一个为负数,并且另一个非零, THEN 结果← - 结果 这个算法很麻烦。 booth’s算法比它简单。该算法直接对补码数据进行运算,不需进行正数和负数之间的转换。
以定点小数为例: [x]补=x0.x1x2…xn [y]补=y0.y1y2…yn [Z]补=[x×y]补 ⑴ 设被乘数x的符号任意,乘数y为正数 [x×y]补 = [x]补×(0. y1y2…yn) ⑵ 设被乘数x的符号任意,乘数y为负数 [y]补=1.y1y2…yn=2+y (Mod 2) y=[y]补-2=0.y1y2…yn-1 [x×y]补=[x]补×(0.y1y2…yn)-[x]补
[X·Y]补 = [X]补(0.Y1… Yn) + [–X]补·Y。 = [X]补(Y1 · 2-1+Y2· 2-2+… Yn · 2-n)-[X]补·Y。 = [X]补[-Y0+(Y1-Y1 · 2-1 )+(Y2 · 2-1- Y2· 2-2 ) +…(Yn · 2-(n-1)- Yn · 2-n) ] = [X]补[( Y1-Y0)+ (Y2-Y1) 2-1 +… (Yn+1 - Yn )· 2-n] = [X]补( Y1-Y0)+ 2-1{[X]补(Y2-Y1 ) +2-1[[X]补( Y3-Y2 ) + 2-1[… + 2-1[[X]补 (Yn+1 - Yn )+0]…] ]}
U = 0;Y-1 = 0; FOR i = 1 TO n DO {IF Y0 Y-1 =10 THEN U = U – X(= U + X’ + 1); IF Y0 Y-1 =01 THEN U = U + X; 算术右移 UV; 循环右移 Y并将Y0复制给Y-1 } 表8.5列出了当X = -3(1101)和Y = -5(1011) 时,该算法的步骤。 算法能得出正确结果0000 1111(+15)。
(2) 算法的RTL代码 START、FINISH:初始化和终止算法 U、V、X、Y:n位值; Y-1:一位值 循环计数器i为递减计数器(n递减到0) 1: U←0,Y-1 ←0,i←n Y0Y-1’ 2: U←U + X’ + 1 Y0’Y-1 2: U←U + X 2: i←i-1 3: ashr(UV),cir(Y),Y-1 ←Y0 Z’3: GOTO 2 Z 3: FINISH←1 加、减法语句可合并一起: (Y0⊕Y-1)2:U←U +(X⊕Y0)+ Y0
执行(-3)×(-5),初始化X=1101,Y=1011 表8.6 booth’s算法RTL代码的执行步骤
1 3 图8.6 booth’s算法的 硬件实现 1:U←0,Y-1←0,i←n (Y0⊕Y-1)2:U←U +(X⊕Y0)+ Y0 2:i←i-1 3:ashr(UV),cir(Y),Y-1←Y0 Z’3:GOTO 2 Z 3: FINISH←1
补码两位乘 将Booth法中两步合并为一步: (Yi-1 Yi Yi+1)
其运算规则如下表: 操作 Yi-1 Yi Yi+1 000 部分积+0,右移二位 001 部分积+[X]补,右移二位 010 部分积+[X]补,右移二位 011 部分积+2[X]补,右移二位 100 部分积+2[–X]补,右移二位 101 部分积+[–X]补,右移二位 110 部分积+[–X]补,右移二位 111 部分积+0,右移二位
3. 快速乘法运算 随着大规模集成电路技术的发展,为提高乘法的运算速度,出现了阵列乘法器。 (1) 非负数码的阵列乘法器 设有非负数码的二进制整数: A=a3a2a1a0 B=b3b2b1b0 按手算方法有:
8.1.3 除法 除法可以看成减法的重复,z = x÷y可以这样实现: Z=0; WHILE x≥y DO { z=z+1;x=x-y } 效率低、执行时间随着z的最终值的不同而改变 可采用移位——相减算法减少执行时间,例: 096 71 6827 639 437 426 11 10010011 ÷ 1101
096 71 6827 639 437 426 11 注意:第一步操作是比较除数71和被除数的前两位68。由于71大于68,故该位商0。这在计算机的除法运算中是很重要的一步,它被用来检测商是否溢出。
将被除数左移,使得每次相减的结果总是送到同一位置上。将被除数左移,使得每次相减的结果总是送到同一位置上。 左移出的位不参加减法计算 096 71 6827 00 ← 68 除以71 商0 682 ← 取出下一位 682 ← 左移一位 639 ← 682 除以71 商9 437 ← 取出下一位 437 ← 左移一位 426 ← 437 除以71 商6 11 ← 余数 第一步检查68是否大于等于71,这是一个溢出检测
1. 二进制值的移位——相减除法 (1)算法 被除数在初始化时加载到UV (U保存高n位,V保存低n位) 除数和商分别保存在n位值X和Y中 余数保存在U中 C(1位值):用来保存U的移出位 U ≥ X THEN 产生溢出并终止算法; Y = 0;C = 0; FOR i = 1 TO n DO { 线性左移 CUV; 线形左移 Y; IF CU ≥ X THEN {Y0 = 1,U = CU – X}}
◆ 考虑第一步就终止的情况 如112÷7 若n =4,则UV = 0111 0000,X = 0111。 由于U≥X,均为0111,将终止算法。如果 继续执行,将产生商16(1 0000)和余数0。但 值1 0000不能保存在4位的Y中,产生溢出。
147÷13 初始化时:U = 1001,V = 0011,X = 1101,n = 4 表8.7 移位——相减算法的执行步骤
(2) 算法的RTL代码 X、U、V、Y:n位值 C、OVERFLOW:1位值 当i = 0时,Z = 1;当U≥X时,G = 1; FINISHI置1则算法结束 1,2,3,4是连续的状态 G 1: FINISH←1,OVERFLOW←1 2: Y←0,C←0,OVERFLOW←0,i←n 3: shl(CUV),shl(Y),i←i-1 (C + G)4: Y0 ←1,U←U + X’ + 1 Z’4: GOTO 3 Z 4: FINISH←1
147÷13的执行步骤: 初始化时U = 1001,V = 0011,X = 1101,n = 4 表8.8 移位——相减除法的RTL代码的执行步骤
2 图8.7 移位—相减除法的硬件实现
以上称为不恢复余数的除法算法。 2. 恢复余数的除法算法 (1) 步骤 • 首先检测溢出 如果没有产生溢出,则进入移位——相减循环。 • 执行减法U ← U – X 如果发现CU < X(结果为负),则说明不 应执行减法,此时通过执行加法U ← U + X, 使U恢复为原来值。 与不恢复余数除法的主要区别:处理比较的方式不同
(2) 恢复余数的算法 ◆ 被除数初始化时保存在UV中,除数保存在X中, 商保存在Y中,余数最后保存在U中。 ◆U、V、X、Y都是n位值,C是1位值。 CU = U + X’ + 1;算法第一步为CU与X的比较 U = U + X,IF C = 1 THEN 产生溢出并终止算法; Y = 0; FOR i = 1 TO n DO { 线性左移CUV; 线形左移Y; IF C = 1 THEN { U= U+ X’ +1} ELSE{ CU= U+ X’ +1 } IF C = 1 THEN { Y0 = 1} ELSE { U = U + X } }
◆ CU与X的比较 操作CU = U + X’ + 1实际上实现了两个功能: • 减法U = U-X • U和X的比较 (b)零结果 (a)正结果 (c)负结果
(3) 两个例子 ◆ 225÷13 初始化:X = 1101,n = 4 表8.9 恢复余数除法算法的执行步骤(a)有溢出 ◆ 147÷13 (10010011÷1101) 结果是:商为11,余数为4