1 / 144

第八章 运算方法

第八章 运算方法. 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 位二进制数的非负数码和补码表示的数值.

oren
Download Presentation

第八章 运算方法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第八章 运算方法 8.1 无符号表示法 8.2 带符号表示法 8.3 BCD码 8.4 专用运算部件 8.5 浮点数 8.6 实例:IEEE 754 浮点标准 同济大学 软件学院

  2. 8.1 无符号表示法 有两种常用的无符号表示法: ◆ 非负数码:表示0或一个正数 n位非负数码的数值范围:0 ~2n-1 (所有位都为1) ◆2的补码(简称补码):既能表示正数又能表示负数 n位数的数值范围: -2n-1 ~ 2n-1-1

  3. 下表列出了8位二进制数的非负数码和补码表示的数值下表列出了8位二进制数的非负数码和补码表示的数值 表8.1 无符号表示的数值

  4. 8.1.1 加法和减法 1.加法 ◆ 用一个并行加法器来实现(如图所示) X和Y是8位寄存器 电路实现微操作 ADD:X←X+Y

  5. ◆ 溢出:结果不能表示为一个8位数值 例如:非负数码加法255 +1 1111 1111 + 0000 0001=1 0000 0000 溢出的判断: 并行加法器产生额外的进位输出,它用来标志 算术溢出。 (1) 非负数码 直接用进位置溢出标志,它提示系统产生 了溢出,所得结果不完全正确,系统应进行相 应的结果修复处理或错误处理。

  6. (2) 补码 判断溢出不但要检查进位输出,还要检 查结果最高位的进位输入。如果这两者相等, 那么不产生溢出,否则产生溢出。 还有没有其它方法?

  7. 溢出 溢出 图8.2 补码加法的溢出产生

  8. 2.减法 ◆ 转换成加法 [X-Y]补=[X]补+[-Y]补 微操作 SUB:X←X-Y 图8.3 微操作X←X-Y的实现

  9. ◆ 溢出 (1) 非负数码 减法的结果不会比2n-1大,但可能比0小。 例如:1-2执行为 0000 0001+1111 1110 = 1111 1111(255) 如果减法(通过补码加法实现)产生了进位输 出0而不是1时,则发生了溢出。

  10. 溢出 溢出 (2) 补码减法 判断溢出的条件与补码加法相同。

  11. 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取何值,执行 乘法的时间相同。

  12. 1. 移位——相加乘法 首先计算每个部分积并左移到正确位置,然 后再将所有的部分积相加。 ◆ 第一个修改:每求出一个部分积后就计算和 x = 2 7 y = 2 5 3 8 1 1 3 5 1 4 3 1 ←计算的和 5 4 6 8 3 1 ←最终计算的和 任何时候都没有多于两个数的加。

  13. ◆ 第二个修改:用右移当前和代替左移部分积 x = 27 y = 253 81 ← 右移一位 81 ← 1被右移出,故不参加加法运算 135 1431 ← 右移一位 1431 ← 3 1被右移出,故不参加加法运算 54 6831 ← 最后右移一位 6831 每次都是相同的两列数字进行加法。

  14. (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 }

  15. 例如:13×11,即1101×1011 初始化X = 1101,Y = 1011

  16. (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

  17. 表8.3 移位——相加乘法RTL代码的执行轨迹

  18. (3) 根据 RTL代码设计硬件 硬件包括两部分: ◆ 寄存器部分:微操作在此执行 ◆ 控制部分:产生需要的控制信号和状态值 X—— n位寄存器 Y、U、V—— n位移位寄存器 (当SHR信号有效时它们右移一位) 寄存器i——存储值n的递减计数器 C和FINISH——一位寄存器 在寄存器之间设置数据通路来实现RTL代码中 的微操作所要求的数据传送。 将i的所有位异或在一起产生Z,即仅当i的所 有位都为0(i = 0)时,Z才为1。

  19. 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

  20. (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

  21. 表8.4 改进后的RTL代码的执行步骤

  22. 2. 布斯算法 ◆ 对于无符号补码数据,上面的算法并不总能 得出正确的结果。 例如:13 × 11 1101和1011的补码表示:–3和-5 积:+15 而上面的算法将得出结果1000 1111( –113) ◆ 原因:该算法仅能处理两个正数相乘,当有 一个或两个操作数为负数时,通过执行下面 的程序,上面的算法仍然可以使用。

  23. IF 被乘数 < 0 THEN 被乘数← - 被乘数; IF 乘数 < 0 THEN 乘数← - 乘数; 用非负数乘法进行乘法运算; 恢复被乘数和乘数的原值; IF 被乘数和乘数中有一个为负数,并且另一个非零, THEN 结果← - 结果 这个算法很麻烦。 booth’s算法比它简单。该算法直接对补码数据进行运算,不需进行正数和负数之间的转换。

  24. 以定点小数为例: [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]补

  25. [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]…] ]}

  26. 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)。

  27. 表8.5 booth’s算法的步骤

  28. (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

  29. 执行(-3)×(-5),初始化X=1101,Y=1011 表8.6 booth’s算法RTL代码的执行步骤

  30. 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

  31. 补码两位乘 将Booth法中两步合并为一步: (Yi-1 Yi Yi+1)

  32. 其运算规则如下表: 操作 Yi-1 Yi Yi+1 000 部分积+0,右移二位 001 部分积+[X]补,右移二位 010 部分积+[X]补,右移二位 011 部分积+2[X]补,右移二位 100 部分积+2[–X]补,右移二位 101 部分积+[–X]补,右移二位 110 部分积+[–X]补,右移二位 111 部分积+0,右移二位

  33. 3. 快速乘法运算 随着大规模集成电路技术的发展,为提高乘法的运算速度,出现了阵列乘法器。 (1) 非负数码的阵列乘法器 设有非负数码的二进制整数: A=a3a2a1a0 B=b3b2b1b0 按手算方法有:

  34. 4×4位非负数码阵列乘法器的逻辑原理图

  35. (2) 补码的阵列乘法器

  36. 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

  37. 096 71 6827 639 437 426 11 注意:第一步操作是比较除数71和被除数的前两位68。由于71大于68,故该位商0。这在计算机的除法运算中是很重要的一步,它被用来检测商是否溢出。

  38. 将被除数左移,使得每次相减的结果总是送到同一位置上。将被除数左移,使得每次相减的结果总是送到同一位置上。 左移出的位不参加减法计算 096 71 6827 00 ← 68 除以71 商0 682 ← 取出下一位 682 ← 左移一位 639 ← 682 除以71 商9 437 ← 取出下一位 437 ← 左移一位 426 ← 437 除以71 商6 11 ← 余数 第一步检查68是否大于等于71,这是一个溢出检测

  39. 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}}

  40. ◆ 考虑第一步就终止的情况 如112÷7 若n =4,则UV = 0111 0000,X = 0111。 由于U≥X,均为0111,将终止算法。如果 继续执行,将产生商16(1 0000)和余数0。但 值1 0000不能保存在4位的Y中,产生溢出。

  41. 147÷13 初始化时:U = 1001,V = 0011,X = 1101,n = 4 表8.7 移位——相减算法的执行步骤

  42. (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

  43. 147÷13的执行步骤: 初始化时U = 1001,V = 0011,X = 1101,n = 4 表8.8 移位——相减除法的RTL代码的执行步骤

  44. 2 图8.7 移位—相减除法的硬件实现

  45. 以上称为不恢复余数的除法算法。 2. 恢复余数的除法算法 (1) 步骤 • 首先检测溢出 如果没有产生溢出,则进入移位——相减循环。 • 执行减法U ← U – X 如果发现CU < X(结果为负),则说明不 应执行减法,此时通过执行加法U ← U + X, 使U恢复为原来值。 与不恢复余数除法的主要区别:处理比较的方式不同

  46. (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 } }

  47. ◆ CU与X的比较 操作CU = U + X’ + 1实际上实现了两个功能: • 减法U = U-X • U和X的比较 (b)零结果 (a)正结果 (c)负结果

  48. (3) 两个例子 ◆ 225÷13 初始化:X = 1101,n = 4 表8.9 恢复余数除法算法的执行步骤(a)有溢出 ◆ 147÷13 (10010011÷1101) 结果是:商为11,余数为4

More Related