




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 八 章 运 算 方 法 本章我们详细说明几种常用数据格式的算术运算算法和它们的硬件实现。包括定点数表示及其加、减、乘、除过程和硬件实现,二十进制(或BCD)码的格式和操作。 接下来讨论一些提高算术操作性能的专用硬件,包括流水线、查找表、华莱士树 。 最后介绍浮点数的格式和它们的算术操作。包括浮点数的格式,性质,以及加、减、乘、除过程和硬件实现,还有IEEE 754 浮点数标准。 执行算术和逻辑运算的指令以及微操作是任何CPU的一个必不可少的重要部分。 8.1 无符号表示法 本节讨论二进制数无符号表示法的加、减、乘、除的基本算法以及实现这些算法的硬件。这些算法同时也是二进制数带符号表示法、B
2、CD码和浮点表示法的算术运算基础。非负数码:表示0或一个正数。n位非负数码的数值范围为0(所有位都为0)到2n-1(所有位都为1)。2的补码(简称补码):既能表示正数又能表示负数。n位数的数值范围为 -2n-1-1到2n-1-1。当最高位为1时表示负数,最高位为0时表示正数(包括0)。正数(包括0)的补码与非负数码相同,负数的补码为其绝对值的2的补码,等于它的绝对值按位取反(该数的1的补码,简称为反码),加1。 有两种常用的无符号表示法: 例如,求-5的4位补码表示,首先求出它的绝对值5(0101),产生反码值1010,再加1得补码1011。 下表列出了8位二进制数的非负数码和补码表示的数值。
3、表8.1 无符号表示的数值 8.1.1 加法和减法 加法直接采用二进制加法实现,硬件中通过使用一个并行加法器来实现,如下图所示。 X和Y是8位寄存器,该电路实现微操作 ADD:XX+Y。 只要结果在正常范围内(对非负数码而言为0到2n-1,对2的补码而言为-2n-1-1到2n-1-1),该电路就能得到正确的结果。 图8.1 微操作XX+Y的实现 当结果不能表示为一个8位数值时就会导致溢出:例如,非负数码加法255 +1,即1111 1111 + 0000 0001,直接加得 1 0000 0000,有9位,不能存于8位寄存器中。 并行加法器产生额外的进位输出,它用来标志算术溢出。在非负数码中,
4、这个进位能置溢出标志,它提示系统产生了溢出,所得结果不完全正确,系统应进行相应的结果修复处理或错误处理。 在补码中,判断溢出不但要检查进位输出,还要检查结果最高位的进位输入。如果这两者相等,那么不产生溢出,否则产生溢出。见下图:图8.2 补码加法的溢出产生 在(a)和(c)中最高位的进位输入和进位输出相等,不产生溢出;而在(b)和(d)中两者不等,产生溢出。 减法可以转换成加法,即X Y通过执行X +(-Y)来实现。首先将Y转换成 Y的补码,再将 Y的补码与X的补码相加即可得X Y的补码:X Y补=X补+-Y补左图给出了执行微操作SUB:XXY的一种硬件实现。图8.3 微操作XXY的实现 对于
5、非负数码,减法的结果不会比2n-1大,但可能比0小。例如,12执行为0000 0001 = 1111 1111,即255。图中(b)和(d)溢出,而(a)和(c)没有溢出。 图8.4 无符号2的补码减法的溢出产生 同样,补码减法也将XY转换成X +(Y)来执行,而判断溢出的条件与补码加法相同。 此时,如果减法(通过补码加法实现)产生了进位输出0而不是1时,则发生了溢出。8.1.2 乘法 乘法可以看成加法的重复。一个数乘以n与n个该数相加的结果相同。可以用下列算法来实现乘法xy。 z = 0; FOR i = 1 TO y DO z = z + x 这种算法不理想,原因是速度慢、计算xy的时间不
6、确定。我们希望不论x 、y取何值,执行乘法的时间相同。 x = 2 7 y = 2 5 3 8 1 1 3 5 5 4 6 8 3 1 考虑人工计算: 首先,27乘以乘数y 的最低位3。接着,27乘以乘数y 的次低位5,结果放在前一个积的左边一位处,因为乘数5在3的左一位上。然后,27乘以2,结果进一步左移一位。最后,将所有值加在一起。 这个过程被称为移位相加乘法。首先计算每个部分积并左移到正确位置,然后再将所有的部分积相加。 对这个算法稍做修改,使得硬件实现更为简单,就可得到无符号非负二进制数的乘法基本算法。 第一个修改是每求出一个部分积后就计算和: x = 2 7 y = 2 5 3 8
7、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 每次都是相同的两列数字进行加法。已经右移到这两列右边的数字只是简单的写下,
8、不进行加法。 若用二进制,被乘数不是乘以0就是乘以1,因此部分积不是0(X0 = 0)就是被乘数的值(X1 = X)。 下面算法实现两个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 考虑乘法1311,即11011011,表8.2 列出了运行该算法时所有寄存器的值。初始化X = 1101,Y = 1011。容易验证该算法得出了正确结果。 表8.2 移
9、位相加算法的执行步骤 算法的RTL代码如下所示。注意:当i = 0时,Z = 1;而1,2,3是连续的状态,即算法是由状态1到2再到3的。 1: U0,in Y02: CUU + X 2: ii-1 3: shr(CUV),cir(Y) Z3: GOTO 2 Z 3: FINISH1 表8.3列出了1311的RTL代码的执行步骤。同样初始化X = 1101,Y = 1011。除了在每个周期增加了满足的条件和执行的微操作外,表8.3同表8.2一样。 表8.3 移位相加乘法RTL代码的执行轨迹 根据 RTL代码设计硬件。硬件包括两个部分:寄存器部分,微操作在此执行;控制部分,产生需要的控制信号和状
10、态值。 为了简化设计,我们用n位寄存器实现X;n位移位寄存器实现Y、U、V,当SHR信号有效时它们右移一位。寄存器i是有足够位数来存储值n的递减计数器。C和FINISH用一位寄存器实现。在寄存器之间设置数据通路来实现RTL代码中的微操作所要求的数据传送。 将i的所有位异或在一起产生Z,即仅当i的所有位都为0(i = 0)时,Z才为1。这比比较i和n的大小要简单,并且只需要一个异或门,而不是一个n位比较器,这就是i从n到0递减计数而不是从0到n递增计数的原因。 图8.5给出了移位相加乘法算法的硬件实现。 图8.5 移位相加乘法算法的硬件实现 考察图8.5给出的控制部分,看它是如何实现RTL代码的
11、。 当START置1时,State Counter和FINISH清零,Decoder工作。Decoder输出1,使U清零,数n装载到i中。 State Counter加1到01, Decoder输出2。使i减1,并且,若Y0 = 1,将U + X保存在CU中;若Y0 = 0,则C、U的值不变。 State Counter加1到10, Decoder输出3。此时,C、U、V都右移一位。以下两件事必有一件发生:当Z = 0时,State Counter被装载值01, Decoder输出2,实现操作“GOTO 2”。否则Z = 1时,FINISH置1,Decoder使能端置0,不再输出1,2,3,硬
12、件停止工作。 如果不要求保存原值,则可以进一步优化算法,使硬件实现更简单。特别是如果Y值不要求保存,可将其值保存在V寄存器中,则乘法转换为UVX V。每次检查V的最低位V0,若为1,执行加法。下一步执行右移时,该位将丢弃,因为它不再需要使用。修改后的RTL代码为: 1: U0,in V02: CUU + X 2: ii-1 3: shr(CUV) Z3: GOTO 2 Z 3: FINISH1 与前面的代码有两处不同:一是CUU + X的条件由Y02改为V02;二是减少了cir(Y)的操作。 除了C和U的LD信号改为V02,以及去掉了寄存器Y之外,该代码的硬件实现与图8.5的相同。 下表显示改
13、进后的RTL代码执行13 11的步骤。表8.4 改进后的RTL代码的执行步骤 除了初始化V寄存器和去掉Y寄存器之外,该表与表8.3相同。 8.1.2.1 布斯算法 对于无符号补码数据,上面的算法并不总能得出正确的结果。上一个例子( 13 11 )中,1101 和1011的补码表示分别为3和-5,它们的积应是+15;而上面的算法将得出结果1000 1111,即 113,显然是错的。 原因是该算法仅能处理两个正数相乘,当有一个或两个操作数为负数时,通过执行下面的程序,上面的算法仍然可以使用: IF 被乘数 0 THEN 被乘数 - 被乘数; IF 乘数 71,商至少有3位,比商寄存器的位数(2位)
14、还要多一位,因此产生溢出。 这种溢出检测的附加好处是可以防止除以0的操作,此时也会产生溢出。 采用二进制更简单,商只可能为0或1。当被除数大于等于除数时,商1;否则商0。 下面的算法实现了两个二进制值的移位相减除法。被除数在初始化时加载到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 考虑第一步就终止的情况。如1127,若n =
15、4,则UV = 0111 0000,X = 0111。由于UX,均为0111,将终止算法。如果继续执行,将产生商16(1 0000)和余数0。但值1 0000不能保存在4位的Y中,产生溢出。 下表列出了该算法执行14713的步骤。初始化时,U = 1001,V = 0011,X = 1101,n = 4。 表8.7 移位相减算法的执行步骤 算法的RTL代码。其中X、U、V、Y为n位值,C和OVERFLOW为1位值。当i = 0时,Z = 1;当UX时,G = 1。FINISHI置1则算法结束。1,2,3,4是连续的状态。 G 1: FINISH1,OVERFLOW1 2: Y0,C0,OVER
16、FLOW0,in 3: shl(CUV),shl(Y),ii-1(C + G)4: Y0 1,UU + X + 1 Z4: GOTO 3 Z 4: FINISH1 大部分的RTL语句由算法直接转换而成,注意条件 CUX等价于条件 UX(G)或(C =1),即(C + G);补码加法:U U + X + 1实现算法中的U = CU X 。 下表列出了该RTL代码执行除法:14713的执行步骤。初始化时U = 1001,V = 0011,X = 1101,n = 4。 表8.8 移位相减除法的RTL代码的执行步骤 该算法的硬件实现。图8.7 移位相减除法的硬件实现 以上称为不恢复余数的除法算法,这
17、种算法是仅当CU X时,才执行减法U U X。第二种类型的除法是恢复余数的除法算法。它不是在执行减法之前先检查是否CU X,它是先执行减法再比较CU是否大于等于X。如果CU X,则该算法再执行一次U U + X,使U恢复为原来值。 恢复余数的算法有相同的步骤:首先检测溢出。如果没有产生溢出,则进入移位相减循环。它们的主要区别是处理比较的方式不同。不恢复余数的算法是先进行CU和X的比较,如果CU X则执行减法U CU X。恢复余数的算法则相反,先执行减法U U X,如果发现CU X(结果为负),则说明不应执行减法,此时通过执行加法U U + X,使U恢复为原来值。 恢复余数的算法。被除数初始化时
18、保存在UV中,除数保存在X中,商保存在Y中,余数最后保存在U中。U、V、X、Y都是n位值,C是1位值。 CU = U + X + 1; 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的比较如C = 1,则CU一定比X大,执行减法U U + X + 1,并且使C仍保持1值,表示CU X。如C = 0,执行减法CU
19、U + X + 1。该减法仅当CU X时,使C置1。结果是:无论执行哪个减法,都有U = U X,以及当CU X时C置1,否则置0。CU与X的比较。 操作C U = U + X + 1实际上实现了两个功能:显式的功能是减法U = U X ,而隐含的功能是U和X的比较。如果U X,该操作将C置1,否则将C置0。 在(a)和(b)中,C置1,表示U X; 在(c)中,C置0,表示U X。 图8.8 在计算C U = U + X + 1的同时比较了U和X:(a)正结果,(b)零结果,(c)负结果 整个算法的分析。 头两条语句是比较U和X的大小。如果U X,将产生溢出,此时U U + X + 1将C置
20、1。否则不溢出,它将C置0。第二条语句是将U恢复为原来值,如果没有溢出,将初始化Y并进入移位相减循环。 移位相减循环从左移CUV和Y 开始的。而下一条语句实现了减法(U = U X)和CU与X的比较(如果CU X则C = 1)。 下一条语句当C = 1时,CU X,减法有效,不需要恢复余数,只需在商的相应位(Y0)上商1。而当C = 0时,CU X,加法将U恢复为原来值。 如C = 1,则CU一定比X大,执行减法U U + X + 1,并且使C仍保持1值,表示CU X。如C = 0,执行减法CU U + X + 1。该减法仅当CU X时,使C置1。结果是:无论执行哪个减法,都有U = U X,
21、以及当CU X时C置1,否则置0。两个例子。 第一个例子为22513,它的执行步骤如表8.9(a)所示。首先初始化X = 1101,n = 4。第一个减法将C置1,说明将产生溢出。(实际上,由于22513 = 17 余4,而17的二进制是1 0001,因此不能存于4位的寄存器中。)下一步恢复U值并终止算法。 表8.9 恢复余数除法算法的执行步骤(a)有溢出, 另一个例子14713,执行步骤如表8.9(b)所示。没有溢出。算法的前几步检测溢出和初始化Y。接下来每三步为一组表示循环的一次迭代。该算法正确地计算了14713,结果是:商为11,余数为4。 表8.9 恢复余数除法算法的执行步骤(b)无溢
22、出 每次迭代都执行相似的移位和减法 / 比较操作。 每次迭代的最后一步不是更新商(保存在Y中)就是将余数恢复为原来值(保存在U中)。恢复余数除法算法的RTL代码。 它采用的值与不恢复余数算法中采用的值基本相同。除了以下几点,它与不恢复余数算法非常接近。 OVERFLOW为1位值,当溢出发生时置1,否则置0。 FINISH为1位值,当算法终止时置1。不管是循环结束的正常终止还是溢出,都要将FINISH置1。这与本章其他算法的RTL代码是相同的。 与其他算法相同,计数器i的值从n递减到0。当i = 0时,Z = 1。 除非遇到GOTO操作,在正常情况下状态从11到12到2到3到41到42。状态11
23、和12等价于不恢复余数算法中的状态1,而状态41和42等价于不恢复余数算法中的状态4。 11: CUU + X + 1; 12: UU + X C 12: FINISH1,OVERFLOW1 2: Y0,OVERFLOW0,in 3: shl(CUV),shl(Y),ii-1 C 41: UU + X + 1 C41: CUU + X + 1 C 42: Y0 1 C42: UU + X Z 42: FINISH1 Z42: GOTO 3 RTL代码。 表8.10列出了该RTL代码执行除法14713的步骤。它与表8.9(b)类似,同样得出正确结果。 表8.10 恢复余数除法算法的RTL代码的执
24、行步骤 该算法的硬件实现如图所示。 减少了产生G的比较器,但并行加法器的输入更加复杂。因为此时要求它进行两种操作U + X或U X。同时,由于有6个状态,状态计数器和译码器要稍微大一些。 图8.9 恢复余数除法的硬件实现 补码相除 补码相除没有一种通用的算法。一般是通过对正负数值进行转换来实现补码相除。该算法如下所示。除法可以使用恢复余数的硬件实现或不恢复余数的硬件实现。 IF 被除数 0 THEN 被除数 - 被除数; IF 除数 Y、X = Y还是X Y时,U应为X Y ,即X + Y + 1。当X Y时,Us与Xs的值相同;X Y时,C = 1,Z = 0;当X = Y时,C = 1,Z
25、 = 1;当X Y),U中已保存了结果的正确幅值(X Y)。此时仅需要考虑结果的符号,即把Xs赋给Us。 CZ为真时(C = 1且Z = 1,即X = Y),U中也已保存了结果的正确幅值0。此时仅需要把结果的符号设置为0,使结果以 +0的格式保存。 C为真时(C = 0,即X Y、PM = 1且X = Y、PM = 1且X Y、X = Y和X T1 / k,降低了加速比。鉴于此,应该使每段流水线的延时尽可能相等,从而提高加速比。 实际上,锁存器需要一定的时间来保存数据。这是流水线的额外开销。对前例,若锁存器的延时为2 ns,则实际加速比为: S100 = n T1 = 10020ns =1.6
26、5 (k + n 1) Tk (2 + 100 1)12ns 若只计算一个值A1,则加速比小于1: S1 = n T1 = 120ns =0.83 (k + n 1) Tk (2 + 1 1)12ns 此时流水线的速度实际上比非流水线的低,这是因为每段流水线都增加了锁存器的延时。 以上是基本的流水线技术。在11章中我们将看到,流水线也用于加快CPU中的取指令,指令译码和执行指令。 8.4.2 查找表 理论上,每一组合电路都可通过将ROM配置成查找表来实现:组合电路的输入数据作为该ROM的输入地址,而组合电路的输出结果作为该地址中保存的数据。对组合电路的任何输入,通过编程,ROM都能输出正确的结
27、果。 例如,用一个41的ROM来模拟一个2输入的与门。下图给出了该与门和它等价的查找表。 与门的输入作为ROM的输入地址,而ROM的输出数据对应于与门的输出。通过编程ROM,对于所有可能的X和Y,ROM的输出与与门的完全相同。 用查找表ROM计算UVXY的实现方法如图所示。寄存器X和Y提供查找表的输入地址,查找表的输出数据为X与Y的积,它被输入到寄存器UV中。 U、V、X、Y均为4位的寄存器,X与Y 的积为8比特数据,因此共需要256个地址来保存所有的积。例如,地址1011 1101保存数据1000 1111,即143,它是1011(11)与1101(13)的积。 图8.16 用查找表实现的乘
28、法器 很多算法可以通过查找表ROM来实现,而且与前面的算法实现相比,查找表可能更具有优势。例如,图8.16给出的硬件实现比图8.5给出的移位相加的硬件实现更简单,执行速度更快。 随着操作数位数的增加,查找ROM的大小将迅速增大。实现4位乘法器的ROM大小为2568,而等价的8位乘法器将需要64K16的ROM。 8.4.3 Wallace树 Wallace树是用来实现两数相乘的一种组合电路。尽管与移位相加的乘法器相比,所需的元器件要多一些,但它的运行速度要快得多。Wallace树使用几个进位保存加法器和仅仅一个并行加法器实现乘法。 进位保存加法器能同时执行三数相加,而不是两数加。它不是输出一个结
29、果,而是输出一个和S以及一组进位位,如图。由于进位位通过加法器没有延时,因此它比并行加法器要快。它不生成最终和。图8.17 一个进位保存加法器 每位Si是位Xi、Yi、Zi的二进制和,进位位Ci+1是该和产生的进位。要得到最终和,必须将S和C相加。 例如,X = 0111,Y = 1011,Z = 0010,进位保存加法器将输出和S = 1110,进位C = 00110。 用一个并行加法器将S与C相加,就可以求出最终结果10100(20),即0111(7)+ 1011(11)+ 0010(2)的和。注意,因为在产生Si同时产生Ci+1,与S相比,C必须左移一位。 为了使用进位保存加法器实现乘法
30、,首先求出每一个部分积,再将这些部分积输入到进位保存加法器中,例如: x = 111 y = 110 000 PP0 111 PP1 111 PP2 101010 求出的最终和 根据Y的每一位为1还是为0,部分积选择X或0并左移到正确的位置。 本例中,因为PP2为Y2的部分积,要将X的值111左移2位,即PP2实际为11100。类似的,由于PP1为Y1的部分积,要左移1位。 图8.18给出了为本例生成部分积的一种方法。 图8.18 用Wallace树生成乘法的部分积 可以用一个5位的进位保存加法器对部分积PP0、PP1、PP2进行加法。然后用一个并行加法器将输出S和C相加,就可以得到X与Y的最
31、终乘积。下图给出了该乘法的硬件实现。 图8.19 用进位保存加法器实现33的乘法器 图8.19给出的是一个最小Wallace树,不能完整的说明Wallace树的设计原则。下图给出两个4位数相乘的Wallace树的设计。 考虑乘法10111110。它产生部分积PP0 = 000 0000,PP1 = 001 0110,PP2 = 010 1100,PP3 = 101 1000。第一个进位保存加法器的输出为:S = 011 1010,C = 0000 1000。第二个进位保存加法器的输出为:S = 0110 1010,C = 0 0011 0000。并行加法器输出最终积:1001 1010。 第一
32、个进位保存加法器实现PP0、PP1、PP2的加法;第二个进位保存加法器将PP3 与S和C相加;最后通过一个并行加法器输出积。 图8.20 44的Wallace树乘法器 部分积的个数随着乘数位数的增加而增加。因此当乘数位数较大时,Wallace树可以利用并行操作。图中给出两个8位数相乘的Wallace树。 图8.21 88的Wallace树乘法器 8.5 浮点数 定点数仅能表示整数而不能表示小数 ,计算机用浮点数来表示小数。 8.5.1 数据格式 浮点数的格式类似于科学记数法。一个数在科学记数法中包含:符号,小数或有效值(也叫尾数)和指数(通常叫阶)。例如,数1234.5678可以表示为 1.2
33、345678103,其中符号为负号,有效值为1.23456789,指数为3。 在这个例子中采用10作为基数,计算机一般都以2为基数表示浮点数。 必须对浮点数进行规格化,即浮点数的有效值是一个没有前导0的小数。于是1234.567就只有一个有效的浮点表达:.1234567104,而不能是1.234567103或1234567.10-3。规格化 0不能被规格化。要用一个特殊值表示0,在运算中,还要把0做为特殊情况处理。 类似的,正无穷大和负无穷大也要用一个特殊值来表示,并且也需要特殊处理。 另外,非法操作,如/或对负数开平方,我们称其结果为不存在的数,记为NaN。NaN也要用一个特殊值来表示,在浮
34、点数算法中NaN也要求特殊处理。特殊值 浮点数格式。每个浮点数包括1位符号,定长的有效值和阶。浮点数X记为XSXFXE ,其中XS表示符号,XF表示有效值,XE表示阶。例如,值1234.5678(= 1.2345678104 )被保存为XS = 1,XF = 12345678,XE = 4。 因为每个数据都以正常格式存储,因此它隐含表示基数点位于有效值的最高有效位的左边,并且不需要明确地表示出来。浮点数格式 阶没有符号位,阶值可用补码表示,但最好是用移码。阶的移码是在实际阶值上加一个偏移量,其和被保存在阶中。 假设XE有四位,它可以表示从8到7的所有阶码,将实际阶值加一个偏移量8,其和保存在X
35、E中,则最小阶值8的移码为 8 + 8 = 0 或二进制的 0000,最大阶值7的移码为7 + 8 = 15 = 1111。 二进制表示的规格化浮点数(除了0、+/- 、NaN)的有效值的最高位为1,在有效值寄存器中可以不保存该位。移码8.5.2 数据性质 精度表示浮点数的精确性,定义为有效值的位数。若计算机规定浮点数的有效值为8位,则它的精度为8位。有效值的位数越多,CPU的精度越高,表示的数据越精确。许多计算机中有两种浮点数格式:单精度浮点数和双精度浮点数。双精度浮点数的位数是单精度浮点数的两倍。 间距为两个相邻值的差的绝对值。其大小由阶值的大小决定。例如,浮点数:.1011 101023
36、,它的2个相邻值为:.1011 101123和.1011 100123,间距为:.0000 000123 = 2-5。浮点数X的间距可以表示为2(X E precision)。 浮点数固有特性 范围由浮点数格式所能表示的最大值和最小值决定。例如,一个有8位有效值(假设首位1也保存在有效值寄存器中)和4位阶码(表示阶值 8 7)的浮点数的范围为 .1111 111127 .1111 111127 ,即 127.5 +127.5。 例如,某浮点数格式,有1位符号位,8位阶且偏移量为128,23位有效值(类似于IEEE 754 单精度浮点数)。则精度为23位,范围为 .111 1111 1111 1
37、111 1111 11112127 .111 1111 1111 1111 1111 11112127,或1.7 1038 +.71038。间距由实际的浮点数决定,对 .12127,间距为2(127 23)= 2104;对 .1 2-128,间距为2(-128 23)= 2 -151。 举例 当浮点数操作所产生的结果不能存于计算机的浮点寄存器时,就发生了溢出。对有8位有效值和4位阶(偏移量为8)的浮点数,浮点数 .126 和 .125相乘将得积 .01211 = .1210,积的阶值大于该格式所允许的最大阶值7,因此产生了溢出。 溢出和下溢 溢出可为正或为负,由溢出值的符号决定。溢出值可以处理
38、为+/- ,或NaN,或像定点数一样置溢出标志为1。 当结果在0到最小正值或最小负值之间时,将产生下溢。例如,在上例格式中,执行乘法(.12-6)(.12-5),所得结果为 .12 -12,它在0 与最小正值 .12 8之间,因此产生下溢。下溢也可以为正或为负。下溢值可以处理为0,或者设置下溢标志位。 当操作结果有效值的位数太多而不能放入CPU的寄存器中(例如,8位有效值的浮点数相乘,得到16位有效值的积),此时必须将该值进行舍入处理,使之能放入规定位数的有效值寄存器中。 就近舍入法(也称为无偏舍入法)的目标是使舍入后的结果尽可能接近实际值。例如,将值 .1011 0101舍入为4位,得到值
39、.1100。它的最大误差为 +/- 0.5LSB(LSB为舍入后结果的最低有效位值)。舍入处理表8.16 不同舍入方法的比较 常见的舍入方法还有:截断法、朝 +舍入法、朝 -舍入法。下表给出了数值在不同的舍入方法下的舍入结果。 除了“截断法”,各种舍入法都要求在最终的表示之外增加额外的几位,通常只要1、2位就足够了。这些位的最高位称为舍入位,次高位称为保护位。在浮点数运算的算法中,这些位是对结果的补充。第三位称为粘滞位,粘滞位置1后,值就不再改变。 例如,(.101123)-(.110022),有效值分别为1011和1100,二者直接相减不能得出正确结果。由于减数的阶比被减数的阶小1,它的有效
40、值必须右移一位。本质上,这种对齐是将减数由 .110022转换为 .011023。只有当操作数的阶相等时,才能执行有效值的相减。8.5.3 加法和减法 浮点数加减法与符号幅值表示加减法相似,但有两个不同:首先要能检测出操作数为0、或NaN以及结果为0或的情况。其次由于阶可能不等,因此要能进行有效值的对齐。 移位/对齐/相减(相加)的过程能处理大部分规格化浮点数的加减法。但当操作数为0、或NaN时,浮点数算法必须对其单独处理。 表中列出了对不同的操作数X和Y,UXY的执行结果。当X与Y相加时,AS = 0;相减时,AS = 1。 1、IF Y = 0,THEN UX0 = X,即UX, ELSE
41、 2、IF X = 0且YNaN,THEN U0Y。 IF AS = 0 THEN UY,否则UY, ELSE 3、IF X = NaN,THEN UX(= NaN), ELSE 4、IF Y = NaN,THEN UY(= NaN), ELSE 5、IF X = ,THEN UX, ELSE 6、IF Y = ,THEN 当AS = 0时UY,否则U Y, ELSE 7、用常规的加减法步骤计算U。 上表根据以下规则求出:表8.17 对特殊形式的浮点数的操作结果 浮点加减算法。每一个值有3个寄存器:一个1位的符号寄存器(US),一个n位的有效值寄存器(UF)和一个m位的阶码寄存器(UE)。 (
42、IXNY + NX + ZY )1:UX,FINISH1(NYZX ZY +IXIYNX)1:U(YSAS)YFYE,FINISH1 (IY NX + NXNY)1:UY,FINISH1 EXY2:shr(YF),YEYE + 1,GOTO 2 EYX2:shr(XF),XEXE + 1,GOTO 2 PM3:CUFXF + YF PM 3:CUFXF + YF + 1 3:USXS,UEXE,CE0 CPM 4:shr(CUF),CEUEUE + 1 CE PM5:UUS PM 5:FINISH1 CPM 4:USUS,UFUF + 1 ZUCEUF(n 1) PM 5:shl(UF),CE
43、UEUE 1,GOTO 5 (ZU + CE)PM 5:U0,FINISH1 CEUF(n 1)PM5:FINISH1 AS = 0表示加法,AS = 1表示减法,PM =XSASYS。REG(X或Y)= NaN时,NREG = 1;REG = 0时, ZREG = 1;REG = 时,IREG = 1。XE YE 时,EXY = 1;YE XE时,EYX = 1。 状态1当X或Y为特殊值(0、或NaN)时得出正确结果并终止算法。 状态2对齐有效值。右移阶值小的操作数的有效值,同时让其阶码加1,直到两阶值相等。例如,X = .110125,Y = .100023 时,Y的有效值UF要右移2位,
44、同时Y的阶码将增加2。得YF = 0010,YE = 5,即 .001025。 状态3执行有效值加减,并设置结果的符号。这时算法分为两种情况考虑。 当PM = 0时,有效值相加。如果加法使C置1,则结果的形式为1.xxxx,此时必须将其有效值右移一位,并且阶码加1,使其规格化。如果这使得阶码溢出,则最终结果被置为,否则将得到正确结果。表8.18给出了(.110123)+(.111022)的执行步骤(此时PM = 0)。 表8.18 执行(X = .110123)+(Y = .111022)的RTL代码轨迹 状态1检测操作数是否为特殊值,不执行任何操作。 状态2。由于XE YE ,因此EXY =
45、 1,将Y的有效值右移一位同时将Y的阶码加1。然后回到状态2,重复操作直到阶码相等。这里循环一次就使得XE = YE 。当XE = YE 时,EXY 和EXY 均为0,无操作,进入状态3。 由于PM = 0,状态3执行有效值相加。进位C记录溢出。设置结果符号、阶码,将CE 初始化为0。 状态4检查并且规格化结果形式为1.xxxx的情况。因C置1,因此进行规格化,即有效值右移一位同时阶码加1到4。 规格化处理中可能产生溢出。但本例中并没有发生,则状态5 FNISH置1并终止算法。 最终(.110123)+(.111022)=(.101024),即6.5 + 3.5 =10。 PM = 0 当PM
46、 = 1时,执行有效值相减。若相减使C置0,则结果的有效值取负(UF UF + 1),符号取反(US US),在状态4中进行。状态4结束时,结果的形式只可能为 .0 xxx或 .1xxx。 如果以0开头(UF(n-1),则有效值左移一位同时阶码减1。重复这一操作,直到出现以下3种情况:UF(n-1)= 1、UF = 0、阶值小于最小阶(即CE = 1,下溢)。当出现第一种情况时,结果完成规格化,得出正确结果并终止算法。当出现其他两种情况时,结果必须被置0。 表8.19给出了减法(.110123)(.111022)的执行步骤。 该算法的硬件设计类似于符号幅值表示加减法算法的硬件设计。(略) 状态
47、1检查特殊值,状态2对齐有效值。在状态3执行有效值相减并设置结果的符号和阶。 若需要,在状态4中要将结果取负,符号取反。但对于本例不必。 状态5将结果规格化。对本例,有效值中只有一个先导0,因此只需进行一次左移。当算法回到状态5时,已规格化,且阶码没有下溢,算法完成。 最终(.110123)(.111022)=(.110022),即6.53.5 = 3。表8.19 执行(X = .110123)(Y = .111022)的RTL代码轨迹 PM = 18.5.4 乘法和除法 与符号幅值表示法一样,浮点数乘法采用移位相加的算法实现,但要作修改。 首先检测操作数是否为特殊值,接着通过有效值相乘和阶值
48、相加实现乘法。同时检查是否溢出和下溢。有效值相乘所得积的形式为 .1xxx或 .01xx。若为 .01xx,要规格化并重新检查下溢。两个规格化浮点数相乘,积的有效值不可能小于.01。在最糟的情况下,结果为 .1000.1000 = .01xx。 状态1检测操作数是否有特殊值( 0、NaN和)并进行相应的处理。有则进行特殊值处理后终止算法,否则设置结果的符号位和阶。 若至少一个操作数为0,则结果为0;均不为0且至少有一个为NaN,则结果为NaN;均不为0和NaN且至少有一个为,则为,并设置符号。浮乘要点 积的阶码为两操作数阶码之和。每个操作数阶码中都包含了偏移量,简单地加阶码将包含偏移量两次。因
49、此设置阶码时,将阶码之和减去一个偏移量才能得到积的正确阶码。 例如,(.110123)(.111022),偏移量为8,则两个阶码的移码分别为11(=3+8)和10(=2+8),相加得21,当偏移量为8时,该移码对应于213(13 = 21 8),显然积不可能在213附近,这个结果是错误的。错误的原因是偏移量被加了2次,一次在11中,一次在10中。从21中减去多余的偏移量得阶码13,对应于25(5 = 13 8),这才是正确的阶码。 检查阶码是否溢出和下溢。若溢出,则根据状态1中得出的结果符号设结果为;若下溢,则置0。溢出或下溢到此终止算法。 有效值相乘。类似符号幅值表示采用移位相加算法。 最后,执行规格化和舍入操作。由于可能下溢,算法重新检查是否下溢,下溢则将结果置0。 算法RTL代码。UR、UG、UT分别为寄存器U的舍入位、保护位和粘滞位。当UE Y时产生溢出,但浮除在XF YF时不溢出,此时将XF 右移一位同时将阶码XE加1。接着设置结果的阶码,并执行有效值相除(过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教部编版一年级上册9 明天要远足教案及反思
- 人教版八年级道德与法治上册1.2 在社会中成长教学设计
- 第一课《灵动的小鱼》(教学设计)-鲁科版劳动二年级下册
- 公司行政管理制度
- 2024年秋新青岛版七年级上册数学课件 5.2 等式的基本性质
- 防范诈骗安全教育主题班会
- 采购合同合同管理专业影响力提升重点基础知识点
- 预防轻生安全教育
- 超市员工服务培训
- 相关保证责任的法律意见书
- 头面部保健按摩课件
- 外科手术部位感染目标性监测方案
- 京东快递员合同
- DB42T2012-2023土家族吊脚楼营造规程
- 2023年全国中学生生物学联赛试题( 含答案解析 )
- 2023年内蒙古产权交易中心员工招聘笔试参考题库附带答案详解
- 善战者说:孙子兵法与取胜法则十二讲
- GB/T 614-2006化学试剂折光率测定通用方法
- GB/T 31539-2015结构用纤维增强复合材料拉挤型材
- 最新体检信息系统课件
- 西师版三年级数学(下册)第一单元试题
评论
0/150
提交评论