配色: 字号:
第 3 章 运算方法与运算器
2022-09-18 | 阅:  转:  |  分享 
  
第3章运算方法与运算器?修订第1版2016.9本章学习内容基本算术逻辑运算电路定点加、减、乘、除运算浮点加、减、乘、除运算十进制数的运算3.1运算器的设计方法运算器的功能:简单的算术、逻辑运算以及移位、计数等。计算机中对数据信息的加工的基本思想:将各种复杂的运算处理分解为最基本的算术运算和逻辑运算。例如在算术运算中,可以通过补码运算将减法化为加法;利用加减运算与移位功能的配合实现乘除运算;通过阶码与尾数的运算组合实现浮点运算。运算器逻辑组织结构设计的层次⑴根据机器的字长,将N个一位全加器通过加法进位链连接构成N位并行加法器。⑵利用多路选择逻辑在加法器的输入端实现多种输入组合,将加法器扩展为多功能的算术/逻辑运算部件。⑶根据乘除运算的算法,将加法器与移位器组合,构成定点乘法器与除法器。将计算定点整数的阶码运算器和计算定点小数的尾数运算器组合构成浮点运算器。⑷在算术/逻辑运算部件的基础上,配合各类相关的寄存器,构成计算机中的运算器。3.2定点补码加减运算定点数的加减运算可以用原码、补码、BCD码等各种码制进行。由于补码运算可以把减法转换为加法,规则简单,易于实现,大大简化了加减运算的算法,所以现代计算机均采用补码进行加减运算。补码运算:参加运算的操作数均用补码表示并且运算结果也以补码表示。3.2.1补码加减运算的基础1.补码加法补码加法的基本关系:[x]补+[y]补=[x+y]补(modM)(3-1)即两数补码之和等于两数之和的补码。式(3-1)中:若x,y是定点小数,则mod=2;若x,y是定点整数,则mod=2n+1,n为定点整数数值部分的位数。以定点小数为例证明式(3-1)的正确性。证明:设x,y的取值范围分别为-1≤x<1,-1≤y<1;两数之和x+y的值在正常范围之内,即:-1≤x+y<1。(1)设x≥0,y≥0,则x+y≥0由补码定义:[x]补=x,[y]补=y,得:[x]补+[y]补=x+y=[x+y]补(2)设x≥0,y<0且|x|≥|y|由补码定义[x]补=x,[y]补=2+y(mod2)得:[x]补+[y]补=2+x+y∵|x|≥|y|,∴x+y≥0,[x+y]补=x+y∵2+x+y≥2∴[x]补+[y]补=x+y(mod2)即证得[x]补+[y]补=[x+y]补(3)设x≥0,y<0且|x|<|y|由补码定义[x]补=x,[y]补=2+y(mod2)得:[x]补+[y]补=2+x+y∵|x|<|y|∴x+y<0[x+y]补=2+x+y=[x]补+[y]补(mod2)(4)设x<0,y<0由补码定义:[x]补=2+x,[y]补=2+y(mod2)得:[x]补+[y]补=2+x+2+y=2+2+x+y舍去模2,得[x]补+[y]补=2+x+y∵x<0,y<0,x+y<0∴[x+y]补=2+x+y=[x]补+[y]补当x<0,y≥0时,证明方法与(2)、(3)相同。到此得证:[x]补+[y]补=[x+y]补2.补码减法补码减法的基本关系:[x]补-[y]补=[x]补+[-y]补=[x-y]补(3-2)即两数补码之差等于两数之差的补码。式(3-2)中,如果x,y是定点小数,则Mod=2;如果x,y是定点整数,则Mod=2n+1,n为定点整数数值部分的位数。以定点小数为例证明式(3-2)的正确性。根据式(3-1),可知:[x]补+[-y]补=[x+(-y)]补=[x-y]补∵[x+y]补=[x]补+[y]补∴[x]补+[-y]补=[x-y]补,对于[x]补-[y]补=[x]补+[-y]补只要证明[-y]补=-[y]补成立,由[x]补-[y]补=[x]补+[-y]补=[x-y]补就可得式(3-2)成立。证明:∵[x+y]补=[x]补+[y]补∴[y]补=[x+y]补-[x]补∵[x-y]补=[x]补+[-y]补∴[-y]补=[x-y]补-[x]补∵[y]补+[-y]补=[x+y]补+[x-y]补-[x]补-[x]补=[x+y+x-y]补-[x]补-[x]补=[x+x]补-[x]补-[x]补=[x]补+[x]补-[x]补-[x]补=0∴-[y]补=[-y]补补码加减运算的基本规则①参加运算的各个操作数均以补码表示,运算结果仍以补码表示。②按二进制数“逢二进一”的运算规则进行运算。③符号位与数值位按同样规则一起参与运算,结果的符号位由运算得出。④进行补码加法时,将两补码数直接相加,得到两数之和的补码;进行补码减法时,将减数变补(即由[y]补求[-y]补),然后与被减数相加,得到两数之差的补码。⑤补码总是对确定的模而言,若运算结果超过模(即符号位运算产生了进位),则将模自动丢掉。0.10011.1011+10.0100丢模例:x=+0.1001,y=+0.0101,求x±y=?解:[x]补=0.1001,[y]补=0.0101,[-y]补=1.1011[x+y]补=[x]补+[y]补=0.1001+0.0101=0.1110x+y=0.11100.10010.0101+0.1110[x-y]补=[x]补+[-y]补=0.1001+1.1011=0.0100x-y=0.01001.10100.0011+1.1101例:x=-0.0110,y=-0.0011,求x±y=?解:[x]补=1.1010,[y]补=1.1101,[-y]补=0.0011[x+y]补=[x]补+[y]补=1.1010+1.1101=1.0111x+y=-0.10011.10101.1101+11.0111丢模[x-y]补=[x]补+[-y]补=1.1010+0.0011=1.1101x-y=-0.00110.10100.1001+1.00111例:x=+0.1010,y=+0.1001,求x+y=?解:[x]补=0.1010,[y]补=0.1001,[x+y]补=[x]补+[y]补=0.1010+0.1001结果溢出1.00111.0101+10.1000例:x=-0.1101,y=-0.1011,求x+y=?解:[x]补=1.0011,[y]补=1.0101,[x+y]补=[x]补+[y]补=1.0011+1.0101结果溢出如果两个正数相加,得到结果的符号为负;两个负数相加,得到的结果为正,则运算结果是错误的。造成错误的原因,是因为运算结果超出了机器所能表示的数据范围,数值位侵占了符号位,正确符号被挤走了。正溢出:两个正数相加的结果超出机器所能表示的最大正数。负溢出:两个负数相加的结果小于机器所能表示的最小负数。出现溢出后,机器将无法正确表示,因此必须正确判别溢出并及时加以处理。常用判断溢出的方法1.根据两个操作数的符号与结果的符号判别溢出由于参加运算的数都是定点数,所以只有两数同号时相加才可能溢出。所以溢出的条件为:OVR=xfyfsf+xfyfsf=(xf⊕sf)(yf⊕sf)(3-3)即xf和yf均与sf不同时,产生溢出。3.2.2溢出判别与变形补码设参加运算的操作数为[x]补=xf.xn-1…x1x0[y]补=yf.yn-1…y1y0[x]补+[y]补的和为:[s]补=sf.sn-1…s1s0发生溢出时OVR=11.00111.0101+10.10002.根据两数相加时产生的进位判别溢出设Cf为符号位上产生的进位,Cn-1为最高数值位上产生的进位,则溢出的条件为:OVR=CfCn-1+CfCn-1=Cf⊕Cn-1(3-4)可见若进入符号位的进位和从符号位上产生的进位不相等,则产生溢出。若将Cf写成Cn,则有OVR=Cn⊕Cn-1例如xfyfsf+xfyfsf=1Cf⊕Cn-1=1溢出判断电路OVR&OVR=1=1=1Cn-1CfXfSfYf3.采用变形补码进行运算使用一个符号位进行运算,当出现溢出时,正确的符号将被数值位侵占,符号位含义就会发生混乱。如果采用两个符号位进行运算,即使因出现溢出侵占了一个符号位,仍能保持最左边符号是正确的。变形补码:用两个符号位表示的补码。也称双符号位补码。变形补码的定义纯小数的变形补码纯整数的变形补码变形补码的形式:[x]变形补=xf1xf2.xn-1…x1x0设和的变形补码为[s]变形补=sf1sf2.sn-1…s1s0变形补码的溢出判断条件:OVR=sf1⊕sf2即当结果的两个符号位不一致时,出现溢出。其中:sf1sf2=00或11表示正常补码sf1sf2=01表示正溢出sf1sf2=10表示负溢出00.100100.0101+00.1110例:x=+0.1001,y=+0.0101,求x+y=?解:[x]变形补=00.1001,[y]变形补=00.0101[x+y]变形补=00.1001+00.0101=00.1110x+y=0.111011.101011.1101+111.0111丢模例:x=-0.0110,y=-0.0011,求x+y=?解:[x]变形补=11.1010,[y]变形补=11.1101,[x+y]变形补=11.1010+11.1101=11.0111x+y=-0.100100.101000.1001+01.0011正溢出例:⑴x=+0.1010,y=+0.1001⑵x=-0.1101,y=-0.1011求x+y=?解:⑴[x]变形补=00.1010,[y]变形补=00.1001,[x+y]变形补=00.1010+00.1001sf1⊕sf2=1运算结果溢出11.001111.0101+110.1000负溢出⑵[x]变形补=11.0011,[y]变形补=11.0101,[x+y]变形补=11.0011+11.0101sf1⊕sf2=1运算结果溢出OVR=1Sf1Sf2分析sf1、sf2的含义可知,无论运算结果是否产生溢出,第一符号位sf1始终指示结果的正确的正负符号。变形补码在正常情况下,sf1=sf2,所以存储数据时采用正常补码,只在运算时采用变形补码,以便判别溢出。变形补码的溢出判断电路:3.2.3算术逻辑运算部件运算器的基本功能是进行算术逻辑运算,其最基本也是最核心的部件是加法器。在加法器的输入端加入多种输入控制功能,就能将加法器扩展为多功能的算术/逻辑运算部件。∵B⊕1=B∴在需要作减法时,将输入到加法器B端的内容的取反(B⊕1)后送入加法器,并使最低进位C0=1,即可实现减法运算。1.补码加减运算的逻辑实现根据[A]补+[B]补=[A+B]补[A]补-[B]补=[A]补+[-B]补=[A]补+[B]补+1=[A-B]补补码加减运算的硬件实现电路的基本原理仍是加法器,只要在加法器的A、B输入端增加控制信号,即可控制实现加法和减法。采用串行进位的补码加减运算逻辑电路M=0Bi通过异或门与0异或,Bi⊕0=Bi,C0=0作A+BM=1Bi通过异或门与1异或,Bi⊕1=Bi,C0=1作A-B电路中采用进出符号位的进位进行溢出判断。OVR=Cn⊕Cn-12.实现补码加减运算的逻辑电路在实际应用中,两个操作数需要存放在寄存器中,运算时送到运算器中进行运算,运算结果再送到寄存器中保存。在实际的运算器中,参加运算的操作数和运算结果通常都存放在寄存器中,控制器通过对指令译码得到控制信号,控制将操作数输入加法器及将运算结果写回寄存器。补码加减运算的逻辑电路A←(A)±(B)A寄存器:运算前存放操作数,运算后存放运算结果。也称为累加器。B寄存器:有两个输出端B和B。由加、减法指令控制产生ADD和SUB信号。执行加法指令:ADD=1执行减法指令:SUB=1ADD=0&SUB=0执行的不是加、减法指令参加运算的两个补码数分别存放在寄存器A、B中,运算结果保存在寄存器A中。运算控制信号的逻辑条件为:F←A=ADD+SUBF←B=ADDF←B=SUBC0←1=SUBA←F=ADD+SUB2.算术逻辑运算部件举例除了加减运算,运算器还需要完成其它算术逻辑运算,在加法器的输入端加以多种输入控制,就可以将加法器的功能进行扩展。算术逻辑运算单元(简称ALU)是一种以加法器为基础的多功能组合逻辑电路。ALU的基本设计思想:在加法器的输入端加入一个函数发生器,这个函数发生器可以在多个控制信号的控制下,为加法器提供不同的输入函数,从而构成一个具有较完善的算术逻辑运算功能的运算部件。一位ALU单元一位ALU基本单元可分成三部分:全加器:由两个半加器构成控制门:M=0时,开门接收低位来的进位信号Ci-1,执行算术运算;M=1时,关门不接收Ci-1,执行与进位无关的逻辑运算.输入选择逻辑:由4个控制信号S3S2S1S0对输入数据Ai,Bi进行不同的逻辑组合;Xi输出中包含进位传递函数Pi=Ai+BiYi输出中包含进位产生函数Gi=AiBiSi与XiYi的逻辑关系GiPiALU组件——SN74181SN74181:4位ALU组件,可以实现16种算术运算功能和16种逻辑运算功能,其具体功能由S3S2S1S0和M信号控制实现。SN74181有正逻辑和负逻辑两种芯片(如下所示),图3-3为负逻辑方式工作的SN74181芯片的外部特性。A3~0、B3~0:参加运算的两组4位操作数;Cn:低位来的进位;F3~0:输出的运算结果;Cn+4:向高位的进位;G:小组本地进位;P:小组传递函数;A=B:两个操作数的相等。如果将多个74181的“A=B”端按“与”逻辑连接,就可以检测两个字长超过4位的操作数的相等情况。S3S2S1S0:控制产生16种不同的逻辑函数;M:控制芯片执行算术运算还是逻辑运算。M=0:允许加法器位间进位,执行算术运算;M=1:封锁加法器位间进位,执行逻辑运算。多片SN74181组合,可以构成更多位数的ALU。并可与并行进位链芯片SN74182配合,可以组成快速的并行加法器。16位组间并行进位ALU3.3定点乘法运算计算机中实现乘除运算通常采用以的三种方式:⑴利用乘除运算子程序⑵在加法器的基础上增加左、右移位及计数器等逻辑线路构成乘除运算部件。⑶设置专用的阵列乘除运算器3.3.1原码乘法运算原码乘法:参加运算的被乘数和乘数均用原码表示;运算时符号位单独处理,被乘数与乘数的绝对值相乘;所得的积也采用原码表示。在定点机中,两个数的原码乘法运算包括:⑴乘积的符号处理⑵两数绝对值相乘为了便于证明,做以下设定:被乘数:[x]原=xf.x1x2…xn乘数:[y]原=yf.y1y2…yn乘积:[z]原=[x]原×[y]原=[x×y]原=zf.z1z2…zn根据“同号相乘,乘积为正;异号相乘,乘积为负”,得乘积的符号:zf=xf⊕yf例:x=0.1101,y=0.1011求x×y=?解:根据二进制乘法规律,可得x×y的手算过程如下:得:x×y=0.10001111从例中可以看出,两个4位数相乘得8位乘积,共4个部分积需8位加法器相加。由此可见,两个n位数相乘,得2n位乘积,共有n个部分积。①2n位乘积需用2n位加法器进行相加运算。②两个n位数相乘,需n个寄存器保存n个部分积。显然所需硬件太多,不适合用硬件去实现,为此需对算法加以改进。1.一位原码乘法运算设参加运算的被乘数为x=0.x1x2…x4,乘数为y=0.y1y2…y4,有:x×y=x×0.y1y2y3y4=x×(2-1y1+2-2y2+2-3y3+2-4y4)=2-1xy1+2-2xy2+2-3xy3+2-4xy4=2-1{2-3xy4+2-2xy3+2-1xy2+xy1}=2-1{2-1[2-2xy4+2-1xy3+xy2]+xy1}=2-1{2-1[2-1(2-1xy4+xy3)+xy2]+xy1}=2-1{2-1[2-1(2-1<0+xy4>+xy3)+xy2]+xy1}根据上式,可将乘法转换为一系列加法与移位操作。将递推公式推广到n位,得:Z0=0(初始部分积为0)Z1=2-1(Z0+xyn)Z2=2-1(Z1+xyn-1)…Zn=2-1(Zn-1+xy1)=x×y其中,Z0、Z1、…、Zn称为部分积。根据上述推导过程可知,可以把乘法转换为一系列加法与移位操作。原码一位乘法的算法①?积的符号单独按两操作数的符号模2加(异或)得到。用被乘数和乘数的数值部分进行运算。②以乘数的最低位作为乘法判别位,若判别位为1,则在前次部分积(初始部分积为0)上加上被乘数,然后连同乘数一起右移一位;若判别位为0,则在前次部分积上加0(或不加),然后连同乘数一起右移一位。③重复第②步直到运算n次为止。(n为乘数数值部分的长度)④将乘积的符号与数值部分结合,即可得到最终结果。例:设x=0.1101,y=-0.1011,根据原码一位乘法的算法计算x×y=?解:[x]原=0.1101,[y]原=1.1011,乘积[z]原=[x×y]原①符号位单独处理得zf=0⊕1=1②将被乘数和乘数的绝对值的数值部分相乘。[|x|]原=0.1101[|y|]原=0.1011数值部分为4位,共需运算4次。部分积乘数yn说明0.00001011初始部分积Z0=0+0.1101∵乘数yn=1,∴加x;0.11010.01101101部分积与乘数同时右移一位;+0.1101∵乘数yn=1,∴加x;1.00110.10011110部分积与乘数同时右移一位;+0.0000∵乘数yn=0,∴加0;0.10010.01001111部分积与乘数同时右移一位+0.1101∵乘数yn=1,∴加x;1.00010.10001111部分积与乘数同时右移一位,运算了4次,计算结束。得:|x×y|=0.10001111加上符号部分得:[x×y]原=1.10001111即:x×y=-0.10001111原码一位乘法算法的硬件逻辑电路A寄存器:存放部分积高位部分,初始为0B寄存器:存放被乘数C寄存器:存放乘数和部分积低位部分,初始为乘数CR:计数器。用于记录乘法次数运算初始时,CR=0,每进行一次运算CR+1,当计数到CR=n时,将CT清0,结束运算。Cj:进位位CT:乘法控制触发器,CT=1,允许发出移位脉冲,进行乘法运算CT=0,不允许发出移位脉冲,停止乘法运算寄存器C通常是具有左移、右移功能的移位寄存器。寄存器A一般不具有移位功能,部分积的移位采用斜送的方法实现移位。具有左、右斜送和直接传送的移位器Fi:加法器的i位输出A←2F:左移控制信号A←1/2F:右移控制信号A←F:直接传送控制信号原码一位乘法的运算流程2.原码两位乘法多位乘法的思想原码一位乘法每次判别乘数的一位,因此n位乘数需做n次加法与移位,从而使乘法速度较慢。如果一次判别乘数的多位,就会提高乘法速度。原码两位乘法的算法:每次判别乘数的两位,将一位乘法中的两步用一步替代。原码两位乘法的算法Yn-1Yn部分积Zi00?[?(Zi-1+0)+0]=1/4(Zi-1+0)01?[?(Zi-1+x)+0]=1/4(Zi-1+x)10?[?(Zi-1+0)+x]=1/4(Zi-1+2x)11?[?(Zi-1+x)+x]=1/4(Zi-1+3x)=1/4(Zi-1-x)+x由于加三倍被乘数难以实现,所以需要进行适当变换。本次仅作1/4(Zi-1-x),+x到下次再做,本次先欠着。为此设一个欠帐触发器CJ,记录本次欠帐的情况。若CJ=1,则下次需多加一个xCJ=0,下次就不多加x原码两位乘法的运算规则Yn-1YnCJ操作000?Zi-1CJ←0001?(Zi-1+x)CJ←0还上次欠帐010?(Zi-1+x)CJ←0011?(Zi-1+2x)CJ←0还上次欠帐100?(Zi-1+2x)CJ←0101?(Zi-1-x)CJ←1为了+3x,欠帐110?(Zi-1-x)CJ←1留下欠帐111?Zi-1CJ←1还上次欠帐,再留下欠帐原码两位乘法的运算次数的控制方法当数值部分长度n为奇数时,将乘数加一符号且为0,以便形成偶数位,此时共做(n+1)/2次运算,最后一次仅移一位。若数值部分长度n为偶数,则共做n/2次。若最后一次CJ仍为1,则需再做一次加x操作,以便还清欠帐。因为在二位乘法中,需要作2x,即左移2位,会侵占符号位。而作加法时,进位不能丢失,所以二位乘法需要使用三个符号位。000表示+111表示-注意:①操作数本身的符号不参加运算。在运算初始时,被乘数和乘数的符号位均为000。②因为在运算过程中,需要作-x操作,因此在作减法时,需要用到[-|x|]补。例:按原码两位乘法的算法,计算[x×y]原。①[x]原=0.1101,[y]原=1.1011②[x]原=1.01101,[y]原=1.10111解:①|x|=000.1101,|y|=0.1011,[-|x|]补=1.0011=111.00112|x|=001.1010积的符号zf=0⊕1=1。部分积乘数CJ说明000.000010110初始部分积Z0=0+111.0011∵yn-1ynCJ=110,∴减x;CJ=1;111.0011111.110011101部分积与乘数同时右移两位;+111.0011∵yn-1ynCJ=101,∴减x;CJ=1;110.1111111.101111111部分积与乘数同时右移两位;+000.1101∵CJ=1,∴需要再加一次x。000.10001111计算得:|x×y|=0.10001111加上符号部分得:[x×y]原=1.10001111即:x×y=-0.10001111②|x|=000.01101,|y|=0.10111,[-|x|]补=111.10011,2|x|=000.11010积的符号zf=1⊕1=0。因为乘数数值部分为5位,所以运算时要在乘数上加一位符号且为0。注意:部分积右移时,应按补码移位规则,连同符号位同时右移。部分积乘数CJ说明000.000000101110初始部分积Z0=0+111.10011yn-1ynCJ=110,减x;CJ=1;111.10011111.111001101011部分积与乘数同时右移两位;+000.11010yn-1ynCJ=011,加2x;CJ=0;000.10110000.001011011010部分积与乘数同时右移两位;+000.01101yn-1ynCJ=010,加x;CJ=0;000.10010000.0100101011最后一次右移一位,运算结束。计算得:|x×y|=0.0100101011加上符号部分得:[x×y]原=0.0100101011。即:x×y=+0.01001010113.3.2补码乘法运算因为补码加减运算简单,在实际机器中都采用补码加减运算,因此不少机器也采用补码乘法,以减少原码与补码之间的不断转换。计算机中常用的补码乘法算法,称为比较法或加减交替乘法。因为是由布斯夫妇提出的,所以也称布斯乘法。1.补码一位乘法以定点小数为例。设被乘数x的补码为[x]补=x0.x1x2…xn,乘数y的补码为[y]补=y0.y1y2…yn,乘积为[Z]补=[x×y]补。⑴被乘数x的符号任意,乘数y为正数,即:[x]补=x0.x1x2…xn[y]补=0.y1y2…yn有:[x]补=2+x=2n+1+x(Mod2)[y]补=y[x]补×[y]补=2n+1y+x×y=2×(y1y2…yn)+x×y(Mod2)∵y1y2…yn为大于0的正整数,根据模2性质:2×(y1y2…yn)=2(Mod2)∴[x]补×[y]补=2+x×y=[x×y]补∵y>0,[y]补=y,y0=0∴[x×y]补=[x]补×[y]补=[x]补×y=[x]补×(0.y1y2…yn)=[x]补×⑵设被乘数x的符号任意,乘数y为负数:[x]补=x0.x1x2…xn[y]补=1.y1y2…yn=2+y(Mod2)∵y=[y]补-2=0.y1y2…yn-1∴x×y=x×(0.y1y2…yn)-x,得:[x×y]补=[x×(0.y1y2…yn)]补-[x]补∵0.y1y2…yn>0,∴[x×(0.y1y2…yn)]补=[x]补×(0.y1y2…yn)得:[x×y]补=[x]补×(0.y1y2…yn)-[x]补⑶设被乘数x和乘数y均为的任意符号数,将情况⑴、⑵综合,可得:[x×y]补=[x]补×(0.y1y2…yn)-[x]补×y0=[x]补×(0.y1y2…yn-y0)=[x]补×(-y0+)=-y0[x]补+2-1y1[x]补+2-2y2[x]补+…+2-nyn[x]补=(y1-y0)[x]补+2-1(y2-y1)[x]补+2-2(y3-y2)[x]补+…++2-(n-1)(yn-yn-1)[x]补+2-n(yn+1-yn)[x]补(初始yn+1=0)令部分积的初始值[Z0]补=0,得部分积的递推形式:[Z0]补=0(初始部分积为0)[Z1]补=2-1{[Z0]补+(yn+1-yn)[x]补}[Z2]补=2-1{[Z1]补+(yn-yn-1)[x]补}……[Zi]补=2-1{[Zi-1]补+(yn-i+2-yn-i+1)[x]补}……[Zn]补=2-1{[Zn-1]补+(y2-y1)[x]补}[Zn+1]补={[Zn]补+(y1-y0)[x]补}=[x×y]补补码一位乘法算法(布斯乘法)(1)参加运算的数均以补码表示,符号位参加运算且部分积与被乘数采用双符号位。(2)乘数末位增设附加位yn+1,且初始yn+1=0。(3)以ynyn+1作为乘法判别位:若ynyn+1=00或11,则前次部分积(初始部分积为0)加0(或不加),然后连同乘数右移一位。若ynyn+1=01,则前次部分积加[x]补,然后连同乘数右移一位;若ynyn+1=10,则前次部分积加[-x]补,然后连同乘数右移一位。(4)重复上面第(3)步,共做n+1次,最后一次不移位。补码一位乘法的操作例:x=-0.1101y=-0.1011用补码乘法求x×y=?解:[x]补=11.0011,[y]补=1.0101,[-x]补=0.1101共需运算4+1=5次注意:运算初始时,部分积Z0=0部分积右移时,必须按补码移位规则,连同符号位同时右移。运算n+1次的“n”是指数值位的长度。部分积乘数ynyn+1说明00.00001.01010Z0=0,附加位yn+1=0+00.1101∵ynyn+1=10,∴+[-x]补;00.110100.0110110101部分积与乘数同时右移一位;+11.0011∵ynyn+1=01,∴+[x]补;11.100111.1100111010部分积与乘数同时右移一位;+00.1101∵ynyn+1=10,∴+[-x]补;00.100100.0100111101部分积与乘数同时右移一位;+11.0011∵ynyn+1=01,∴+[x]补;11.011111.1011111110部分积与乘数同时右移一位;+00.1101∵ynyn+1=10,∴+[-x]补;00.10001111最后一次只运算、不移位。共运算4+1=5次,得:[x×y]补=0.10001111x×y=+0.10001111补码一位乘法的算法,乘积的符号是在运算过程中自然形成的,不需要加以特别处理,这是补码乘法与原码乘法的重要区别。补码一位乘法的硬件实现逻辑图A寄存器:存放乘积和部分积高位部分B寄存器:存放被乘数,可以输出B和B。C寄存器:存放乘数和部分积低位部分CR:计数器。用于记录乘法次数运算初始时,CR=0,每进行一次运算CR+1,当计数到CR=n+1时,结束运算。由于CR=n时,就将CT清0,所以在n+1次运算不再进行移位。Af1、Af2:双符号位,符号位和数值位同时参加运算。CT:乘法控制触发器,CT=1,允许发出移位脉冲,进行乘法运算CT=0,不允许发出移位脉冲,停止乘法运算Cn和Cn+1:控制电路中是作+[x]补还是+[-x]补。CnCn+1操作01前次部分积加B,然后连同乘数右移一位10前次部分积加B+1,然后连同乘数右移一位0011前次部分积加0,然后连同乘数右移一位补码一位乘法的流程图补码一位乘法的流程图中,对寄存器A和C的移位是在对CR进行判断之后进行的,表示在第n+1次运算后不进行移位。注意当x=-1,y=-1时,求[x×y]补所得到的结果为+1,结果溢出,无意义。因此,(-1)×(-1)是定点小数补码乘法中唯一的溢出情况。例:x=-1,y=-1,求[x×y]补。部分积乘数ynyn+1说明00.00001.00000Z0=0,附加位yn+1=0+00.0000∵ynyn+1=00,∴+0;00.000000.0000010000部分积与乘数同时右移一位;+00.00000∵ynyn+1=00,∴+0;00.000000.0000001000部分积与乘数同时右移一位;+00.0000∵ynyn+1=00,∴+0;00.000000.0000000100部分积与乘数同时右移一位;+00.0000∵ynyn+1=00,∴+0;00.000000.0000000010部分积与乘数同时右移一位;∵ynyn+1=10,∴+[-x]补;出现补码溢出定点小数的补码乘法的算法也同样适用于整数乘法。3.3.3快速乘法运算多位乘法运算的控制复杂性将呈几何级数性的增加,实际实现的难度很大。随着大规模集成电路技术的发展,为提高乘法的运算速度,出现了阵列乘法组件。采用阵列乘法组件目的:利用硬件的叠加方法或流水处理的方法来提高乘法运算速度。1.无符号数阵列乘法器设有两个不带符号的二进制整数:A=a3a2a1a0,B=b3b2b1b0按手算方法有:阵列乘法器的基本思想把大量的加法器单元电路按一定的阵列形式排列起来,直接实现手算算式的运算过程,避免在一位和两位乘法中所需的大量重复的相加和移位操作,从而提高乘法运算的速度,4×4位无符号数阵列乘法器的逻辑原理图2.带符号数阵列乘法器带符号数阵列乘法器由无符号数阵列乘法器和求补器构成。带符号数阵列乘法器可以实现原码乘法,也可以实现补码乘法。(n+1)×(n+1)位带符号数阵列乘法器的逻辑原理图求补器的逻辑结构一个二进制对2求补器电路的逻辑表达式为:ai=ai⊕ECi-1,0≤i≤nCi=ai+Ci-1其中C-1=0,E:控制信号,控制是否进行求补。E=0不进行求补,ai=aiE=1进行求补,ai=ai⊕ECi-1,可以利用符号位来作为控制信号E。4位二进制对2求补器逻辑电路图=1=1=1=1&&&&E≥1C-1=0≥1≥1C0C1C2设A=an…a1a0是给定的(n+1)位带符号的数,进行求补的方法就是从数的最右端a0开始,由右向左,直到找出第一个“1”。若ai=1,ai以右均为0,则ai以右包括ai自己的每一个输入位都保持不变,而ai以左的每一个输入位都求反。需要进行原码乘法时,不用算前求补器与算后求补器,直接把两数绝对值送入乘法阵列计算,得到2n位乘积绝对值,再根据异或门输出值带入符号,即得到乘积的原码。需要进行补码乘法时,由两个算前求补器先将两个补码数转换为两数绝对值,再送入不带符号的乘法阵列计算,得到2n位乘积绝对值。然后根据异或门输出值控制算后求补器求补,得到2n+1位的补码形式的乘积。由于阵列乘法器采用重复设置大量器件的方法构成乘法阵列,避免了乘法运算中的重复相加和移位操作,换取了高速的乘法运算速度。而且乘法阵列内部结构规整,便于用超大规模集成电路实现,使得阵列乘法器得到了广泛的应用。3.4定点除法运算除法运算的处理思想与乘法运算的处理思想相似,其常规算法也是转换成若干次“加减—移位”循环来实现。由于定点运算的结果不应超过机器的所能表示的数据范围,所以为了不使商产生溢出,在进行定点除法时应满足:对定点小数要求:|被除数|<|除数|对定点整数要求:|被除数|>|除数|3.4.1原码除法运算定点小数除法运算的手算过程。例:x=0.1011,y=0.1101,求:x/y。解:商q=0.1101余数r=0.0111×2-41.原码恢复余数法原码恢复余数法算法:①判溢出,要求|被除数|<|除数|;②符号位单独按两数符号的模2相加求得;③被除数减去除数;④若所得余数为正,表示够减,相应位上商为1,余数左移一位(相当于除数右移)减去除数;若所得余数为负,表示不够减,相应位上商为0,余数加上除数(恢复余数),再左移一位减去除数;⑤重复第④步,直到求得所要求的商的各位为止。在原码除法的运算过程中应注意的问题:①数值部分的计算是对被除数和除数的绝对值进行的;②因为需要进行减法,所以采用补码加减法来实现运算;③为了不使余数左移时产生数值侵犯符号位的情况,加减运算时采用双符号位。例:已知x=-0.1011,y=+0.1101,用原码恢复余数法求x/y。解:[x]原=1.1011,[y]原=0.1101,|x|=00.1011|y|=00.1101[-|y|]补=11.0011商符qf=xf⊕yf=1⊕0=1余数上商说明00.10110.0000初始余数为被除数+11.0011减y,即加[-|y|]补11.11100.0000余数为负,上商为0+00.1101加y恢复余数00.101101.01100.0000左移一位+11.0011减y00.10010.0001余数为正,上商为101.00100.0010左移一位+11.0011减y00.01010.0011余数为正,上商为100.10100.0110左移一位+11.001111.11010.0110余数为负,上商为0+00.1101加y恢复余数00.101001.01000.0110左移一位+11.0011减y00.01110.1101余数为正,上商为1,结束运算。得商的绝对值为:|q|=|x/y|=0.1101,余数的绝对值为:|r|=0.0111∵商符qf=1∴商[q]原=[x/y]原=1.1101x/y=-0.1101∵n=4,∴所得的余数需乘以2-4才是真正的余数,|r|=0.0111×2-4。余数[r]原=1.0111×2-4r=-0.00000111注意:余数符号与被除数符号相一致。从上例中可以看出,在数值部分的长度n=4的除法运算中,共上商5次,其中第一次商位于商的整数部分。对于定点小数除法:若该位商为1,则表示|被除数|>|除数|,除法溢出,不能继续进行运算;若该位商为0,则表示|被除数|<|除数|,除法合法,可以继续进行运算。在原码恢复余数法中:余数为正时,需作余数左移、相减,共两步操作;余数为负时,需作相加、左移、相减,共三步操作。由于操作步骤的不一致,控制复杂。且恢复余数的过程也降低了除法速度。因此在实际应用中,很少采用恢复余数法。2.原码不恢复余数法(加减交替法)在原码恢复余数法的运算过程中:当余数ri>0时,执行的操作是左移一位→减除数,结果是2ri-y;当余数ri<0时,执行的操作是加除数(恢复余数)→左移→减除数,结果是2(ri+y)-y。变换后得:2(ri+y)-y=2ri+2y-y=2ri+y。将“加除数(恢复余数)→左移→减除数”的操作用“余数左移→加除数”的操作来替代,所得结果是一样的。这样做,既节省了恢复余数的时间,又简化了除法控制逻辑。原码不恢复余数法算法①判溢出,比较被除数和除数。若在定点小数运算时,|被除数|>|除数|,则除法将发生溢出,不能进行除法运算。②符号位单独处理,商的符号由被除数和除数符号的异或运算求得。③用被除数和除数的数值部分进行运算,被除数减去除数。④若所得余数为正,表示够减,相应位上商为1,将余数左移一位后,减去除数;若所得余数为负,表示不够减,相应位上商为0,将余数左移一位后,加上除数。⑤重复第④步,直到求得所要求的商的各位为止。如果最后一次所得余数仍为负,则需再做一次加除数的操作,以得到正确的余数。因为运算时对除数的加减是交替进行的,所以原码不恢复余数法也称为原码加减交替除法。例:已知x=-0.1011,y=+0.1101,用原码不恢复余数法求x/y。解:[x]原=1.1011,[y]原=0.1101,|x|=00.1011,|y|=00.1101,[-|y|]补=11.0011,商符qf=xf⊕yf=1⊕0=1余数上商说明00.10110.0000初始余数为被除数,初始商为0+11.0011减y11.11100.0000余数为负,上商为011.11000.0000左移一位+00.1101加y00.10010.0001余数为正,上商为101.00100.0010左移一位+11.0011减y00.01010.0011余数为正,上商为100.10100.0110左移一位+11.0011减y11.11010.0110余数为负,上商为011.10100.1100左移一位+00.1101加y00.01110.1101余数为正,上商为1得商:|q|=0.1101,余数|r|=0.0111[q]原=[x/y]原=1.1101x/y=-0.1101余数:[r]原=1.0111×2-4r=-0.0111×2-4例:[x]原=0.10101,[y]原=0.11110,用原码不恢复余数法求x/y。解:|x|=00.10101|y|=00.11110[-|y|]补=11.00010商符qf=xf⊕yf=0⊕0=0余数上商说明00.101010.00000初始余数为被除数,初始商为0+11.00010减y11.101110.00000余数为负,上商为011.011100.00000左移一位+00.11110加y00.011000.00001余数为正,上商为100.110000.00010左移一位+11.00010减y11.110100.00010余数为负,上商为011.101000.00100左移一位+00.11110加y00.100100.00101余数为正,上商为101.001000.01010左移一位+11.00010减y00.001100.01011余数为正,上商为100.011000.10110左移一位+11.00010减y11.011100.10110余数为负,上商为0+00.11110最后一步,余数为负,加y恢复余数00.01100商符qf=xf⊕yf=0⊕0=0得:商:[q]原=[x/y]原=0.10110x/y=0.10110余数:[r]原=0.01100×2-5r=0.0000001100定点小数的除法算法也适用于定点整数的除法运算。为了不使商超出定点整数所能表示的数据范围,要求满足条件:|除数|≤|被除数|。因为只有这样才能得到整数商,满足定点整数的要求。在做整数除法前,通常先要对被除数和除数进行判断,如果不满足上述条件,机器将发出出错信号。因为2n位被除数除以n位除数,可以得到n位的商。在整数除法中,为了得到n位整数商,被除数位数的长度应该是除数位数长度的两倍,并且为了使商不超过n位,要求被除数的高n位比除数(n位)小,否则商将超过n位,即运算结果溢出。如果被除数和除数的位数都为n位,则应在被除数前面加上n个0,使被除数的长度扩展为2n后再进行运算。在小数除法中,也可以使被除数位数的长度为除数位数长度的两倍。在字长为n的计算机中,称被除数采用双字长、除数采用单字长的除法为双精度除法。相应地称被除数和除数均采用单字长的除法为单精度除法。例:[x]原=111011,[y]原=000010,用原码不恢复余数法求x/y。解:被除数x和除数y的数值位数都为5位,∴在x前面加上5个0,使其长度扩展2×5=10,|x|=000000011011,|y|=0000010,[-|y|]补=1111110,商符qf=xf⊕yf=1⊕0=1被除数高位被除数低位上商说明0000000110110初始余数为被除数+1111110减y1111110110110余数为负,上商为01111101101100左移一位+0000010加y1111111101100余数为负,上商为01111111011000左移一位+0000010加y0000001011001余数为正,上商为10000010110010左移一位+1111110减y0000000110011余数为正,上商为10000001100110左移一位+1111110减y1111111100110余数为负,上商为01111111001100左移一位+0000010加y0000001001101余数为正,上商为1商符qf=xf⊕yf=1⊕0=1得:商[q]原=[x/y]原=101101x/y=-1101,余数[r]原=100001,r=-1原码不恢复余数法的硬件实现A寄存器:存放被除数和余数,最终结果是余数。B寄存器:存放除数。C寄存器:存放被除数和商,最终结果是商。运算过程中寄存器A、C联合左移。商的符号Cf:Cf=Af⊕Bf运算过程中用Ff控制上商。Ff=0,说明余数r≥0,商1,作-B操作,即B+1。Ff=1,说明余数r<0,商0,作+B操作。在实现定点小数和定点整数除法时,寄存器的分配使用略有不同。原码不恢复余数除法寄存器的分配为了便于控制上商,将上商的位置固定在C的最低位,并要求在余数左移的同时,商数也随之向左移位,因此要求C寄存器具有左移功能。上商是由加法器的符号位Ff控制的。Ff=0,表示余数为正,经非门将Ff取反后,在C的最低位上商为1,并控制下次做减法。Ff=1,表示余数为负,取反后上商为0,并控制下次做加法。一般A寄存器不具有移位功能,加法器计算出的余数可以通过斜送电路斜送到A寄存器中来实现余数的左移。3.4.2补码除法运算在补码除法运算中,参加运算的数均为补码数,所得商也是补码形式,符号位参加运算。1.补码不恢复余数除法进行补码除法运算应考虑的几个问题。1)比较规则比较规则用于判别被除数(或余数)减除数时是否够减。由于上商是根据比较被除数(或余数)与除数的绝对值的大小确定的,因此被除数[x]补和除数[y]补的大小比较就不能简单地用[x]补减去[y]补,比较操作与操作数的符号有关。0.1011+1.01110.0010够减余数与除数同号⑴当x与y同号时,作减法[x]补-[y]补进行比较。①x>0,y>0且|x|>|y|设x=0.1011,y=0.1001[x]补=0.1011,[y]补=0.1001r=[x]补-[y]补=0.1011+1.0111=0.00100.1001+1.00111.1100不够减余数与除数异号②x>0,y>0且|x|<|y|设x=0.1001,y=0.1101[x]补=0.1001,[y]补=0.1101r=[x]补-[y]补=0.1001+1.0011=1.11001.0101+0.00111.1000够减余数与除数同号③x<0,y<0且|x|>|y|设x=-0.1011,y=-0.0011[x]补=1.0101,[y]补=1.1101r=[x]补-[y]补=1.0101+0.0011=1.10001.1010+0.10100.0100不够减余数与除数异号④x<0,y<0且|x|<|y|设x=-0.0110,y=-0.1010[x]补=1.1010,[y]补=1.0110r=[x]补-[y]补=1.1010+0.1010=0.0100结论1当x与y同号时,作[x]补-[y]补进行比较若所得余数与除数同号,表示够减若所得余数与除数异号,表示不够减0.1011+1.11010.1000够减余数与除数异号⑵当x与y异号时,作加法[x]补+[y]补进行比较。①x>0,y<0且|x|>|y|设x=0.1011,y=-0.0011,[y]补=1.1101r=[x]补+[y]补=0.1011+1.1101=0.10000.0110+1.00111.1001不够减余数与除数同号②x>0,y<0且|x|<|y|设x=0.0110,y=-0.1101[y]补=1.0011r=[x]补-[y]补=0.0110+1.0011=1.10011.0101+0.00111.1000够减余数与除数异号③x<0,y>0且|x|>|y|设x=-0.1011,y=0.0011[x]补=1.0101,[y]补=0.0011r=[x]补+[y]补=1.0101+0.0011=1.10001.1111+0.10010.1000不够减余数与除数同号④x<0,y>0且|x|<|y|设x=-0.0001,y=0.1001[x]补=1.1111,[y]补=0.1001r=[x]补+[y]补=1.1111+0.1001=0.1000结论2当x与y异号时,作[x]补+[y]补进行比较若所得余数与除数异号,表示够减若所得余数与除数同号,表示不够减2)上商算法由于是补码运算,所以:当x与y同号时,商为正,够减时上商为1,不够减时上商为0当x与y异号时,商为负,够减时上商为0,不够减时上商为1上商算法每次加减所得的余数与除数同号时,上商为1每次加减所得的余数与除数异号时,上商为0比较与上商规则3)商符的确定若x与y同号,商为正。第一次运算时作[x]补-[y]补,因为除法要求|x|<|y|,所以所得余数R0必不够减,即R0与[y]补异号,应上商为0,就是正商的符号“0”。若x与y异号,商为负。第一次运算时作[x]补+[y]补,因为除法要求|x|<|y|,所以所得余数R0必不够减,即R0与[y]补同号,应上商为1,就是负商的符号“1”。补码不恢复余数法中,商符与数值位的上商规则相同。根据商符的确定方法可知,商的符号也可以用于判断商是否溢出。①当被除数[x]补与除数[y]补同号时,如果余数[r]补与[y]补同号,且上商为“1”,则表示商溢出。②当被除数[x]补与除数[y]补异号时,如果余数[r]补与[y]补异号,且上商为“0”,则表示商溢出。4)求新余数的算法根据不恢复余数法的概念:①当x与y同号时,作[x]补-[y]补若余数与除数同号,表示够减,将余数左移一位,减去除数。若余数与除数异号,表示不够减,将余数左移一位,加上除数。②当x与y异号时,作[x]补+[y]补若余数与除数异号,表示够减,将余数左移一位,加上除数。若余数与除数同号,表示不够减,将余数左移一位,减去除数。总结每次加减所得的余数与除数同号时,将余数左移一位,减去除数。每次加减所得的余数与除数异号时,将余数左移一位,加上除数5)商的校正根据上商规则每次加减所得的余数与除数同号时,上商为1每次加减所得的余数与除数异号时,上商为0可见,补码除法实质是按反码上商的。因为商为正时,按上商规则所得的商是正确的;商为负时,由于是按反码上商的,与正确的补码相差“1”,所以要进行商的校正。⑴末位恒置1法最末位商不是通过比较上商,而是固定置为“1”。这种方法简单、容易,其最大误差为2-n(对定点小数而言),所以在精度要求不高的情况下,通常都采用此方法。⑵校正法①若在所要求的位数内能够除尽,则除数y为正时,商不必校正;y为负时,商加2-n校正。②若在所要求的位数内不能除尽,则商为正时,不必校正;商为负时,则商加2-n校正。校正法用于在精度要求较高的情况。有关校正法的说明⑴当在所要求的位数内不能除尽时,即[rn]补≠0且任一步[ri]补≠0,若商为正,商的反码与补码相同,不必修正;若商为负,形成反码商后,应在末位(2-n位)加1,即加2-n,才得到商的补码。⑵当在所要求的位数内能够除尽时,即[rn]补=0或任一步[ri]补=0,除尽那一步的上商,将根据除数的正、负不同而不同。设除数为B,根据B>0还是B<0,修正方法各不相同。①B>0时,若除尽那一步所得的余数[ri]补=0,由于ri的符号位为正,所以上商为1,按补码除法规则,下一步除法的余数为:[ri+1]补=2[ri]补+[-B]补=[-B]补∵[ri+1]补与除数异号,∴上商为0,并且再下一步除法的余数为:[ri+2]补=2[ri+1]补+[B]补=2[-B]补+[B]补=[-B]补∵[ri+2]补仍与除数异号,∴仍然上商为0。以此类推,直到[rn]补为止,以后各位商均为0。可见,在所要求的位数内能够除尽时,若除数为正,则除尽那位上商为1,以后各位商上0,商是正确的,不必修正。②B<0时,若除尽那一步[ri]补=0,由于ri的符号位为正并与除数异号,因此除尽那一步上商为0,按补码除法规则,下一步除法的余数为:[ri+1]补=2[ri]补+[B]补=[B]补∵[ri+1]补与除数同号,∴上商为1,并且再下一步除法的余数为:[ri+2]补=2[ri+1]补+[-B]补=[B]补由于[ri+2]补与除数同号,所以仍然上商为1。依此类推,直到[rn]补为止,以后各位均商1。可见,在所要求的位数内能够除尽且除数为负时,不论商为正或负,除尽那位上商为0,以后各位上商为1,将商加上2-n,正好修正为正确的商。补码不恢复余数法的算法①若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数;②若所得余数与除数同号,则上商为1,余数左移一位减去除数;若所得余数与除数异号,则上商为0,余数左移一位加上除数;③重复第②步,若采用末位恒置1法,则共做n次;若采用校正法,共做n+1次。例:已知x=-0.1011,y=-0.1101,用补码不恢复余数法求x/y。解:[x]补=11.0101,[y]补=11.0011,[-y]补=00.1101被除数(余数)上商11.01010.0000+00.1101x,y同号,[x]补-[y]补00.00100.0000余数r与y异号,上商为000.01000.0000左移一位,加y+11.001111.01110.0001余数r与y同号,上商为110.11100.0010左移一位,减y+00.110111.10110.0011余数r与y同号,上商为111.01100.0110左移一位,减y+00.110100.00110.0110余数r与y异号,上商为000.01100.1101左移一位。若采用末位恒置1法,结束+11.0011若采用校正法,继续运算,加y11.10010.1101余数r与y同号,上商为1。商为正,不必校正运算后得:商:[x/y]补=0.1101x/y=+0.1101,余数:[r]补=1.1001×2-4r=-0.0111×2-4例:已知x=0.10101,y=-0.11110,用补码不恢复余数法求[x/y]补。解:[x]补=00.10101,[y]补=11.00010,[-y]补=00.11110被除数(余数)上商00.101010.00000+11.00010x,y异号,[x]补+[y]补11.101110.00001余数r与y同号,上商为111.011100.00010左移一位,减y+00.1111000.011000.00010余数r与y异号,上商为000.110000.00100左移一位,加y+11.0001011.110100.00101余数r与y同号,上商为111.101000.01010左移一位,减y+00.1111000.100100.01010余数r与y异号,上商为001.001000.10100左移一位,加y+11.0001000.001100.10100余数r与y异号,上商为000.011001.01001左移一位,若采用末位恒置1法,到此结束00.01100+11.00010若采用校正法,继续运算,加y11.011101.01001余数r与y同号,上商为1+00.11110+0.00001商为负,加2-n校正;同时00.011001.01010要恢复余数,减y运算后得:商:[x/y]补=1.01001(末位恒置1法)或[x/y]补=1.01010(校正法)余数:[r]补=0.01100×2-5在末位恒置1法中,不需求得余数。在采用校正法时,如果需要保留余数,当最后一次所得余数仍为不够减时,应恢复正确余数。余数的校正方法:+异号恢复Rxf?yf=0→rf?yf=1→[r]补+[y]补-同号恢复Rxf?yf=1→rf?yf=0→[r]补+[-y]补2.布斯除法在补码不恢复余数法的算法中,被除数与除数的计算和余数与除数的计算规则不同,不便于控制。布斯除法的思想:将被除数看作余数,采用余数与除数的计算方法和上商规则。布斯除法的规则:①余数(初始为被除数)与除数同号,上商为1,余数左移一位,减去除数;余数(初始为被除数)与除数异号,上商为0,余数左移一位,加上除数;②重复上述步骤,直到求得所需位数为止;③将商符变反,若采用校正法,则对商校正。例:已知x=-0.1011,y=+0.1101,用布斯除法求[x/y]补。解:[x]补=11.0111,[y]补=00.1101,[-y]补=11.0011被除数(余数)上商11.01010.0000x,y异号,上商为010.10100.0000左移一位,加y+00.110111.01110.0000余数r与y异号,上商为010.11100.0000左移一位,加y+00.110111.10110.0000余数r与y异号,上商为011.01100.0000左移一位,加y+00.110100.00110.0001余数r与y同号,上商为100.01100.0011左移一位。若采用末位恒置1法,到此结束+11.0011若采用校正法,继续运算,减y11.10010.0010余数r与y异号,上商为01.0010将商符变反+0.0001商为负,需加2-n进行校正1.0011运算后得商:[x/y]补=1.0011布斯除法硬件逻辑结构原理图移送电路补码除法符号位的扩充问题在整数除法运算时,单字被除数为负数时,请注意高位的补充为全1(补码规则)。如:[x]补=10100000有:x=-1100000可写成:x=-000000001100000故:[x]补=1111111110100000高位的符号补充问题主要在于寄存器初值的安排。3.4.3阵列除法器阵列除法器的思想利用多个加减单元组成除法阵列,将除法各步的加/减、移位操作在一个节拍内完成,从而提高除法运算速度。1)可控加减单元(CAS)构成阵列除法器的基本电路是可控加减单元(CAS)当控制信号P=0时,CAS作为全加器单元。当P=1时,输入Bi被变反,CAS作为减法单元。输入输出逻辑关系为:Si=Ai⊕(Bi⊕Pi)⊕Ci,(Ci为低位进位)Ci-1=(Ai+Ci)(Bi⊕P)+AiCi∴当P=0时,作加法Si=Ai⊕Bi⊕CiCi-1=AiBi+BiCi+AiCi当P=1时,作减法Si=Ai⊕Bi⊕CiCi-1=AiBi+BiCi+AiCi此时Ci为借位输入,Ci-1为借位输出。2)不恢复余数法阵列除法器设被除数x=0.x1x2x3x4x5x6除数y=0.y1y2y3x<y,y>0利用阵列除法器计算所得结果商:q=0.q1q2q3余数:r=0.000r3r4r5r6因为x<y,所以最上面一行所执行的初始操作是减法,因此最上面一行的控制线P固定置成1。减法是用2的补码运算实现的,这时右端各CAS单元上的反馈线用作初始的进位输入,即最低位上加1。每一行最左边的CAS单元的进位输出决定着商的数值。将当前的商反馈到下一行,就可确定下一行的操作是加法还是减法。在作减法的过程中,需作-y运算,当x<y时,将发生借位。由于是用+[-y]补实现减法,而[x]补+[-y]补=x+2+y<2,不会发生进位,实际是产生了借位。所以在阵列除法器中,每一行最左边的CAS单元的进位输出可以决定商的数值。在不恢复余数法阵列除法器中另外增加一级异或门来求商的符号,即可用于原码的阵列除法。类似于带符号数阵列乘法器,在不恢复余数法阵列除法器中的操作数输入端增加算前求补电路、在商的输出端增加算后求补电路,即可实现补码阵列除法。3.5浮点四则运算浮点运算表示数据范围大,有效精度高,适合于科学与工程计算的需要。浮点运算复杂,硬件成本高,运算速度慢。浮点数据包括尾数和阶码两部分尾数代表数的有效数字,一般表示为定点小数;阶码代表数的小数点实际位置,一般表示为定点整数。在浮点运算中,阶码与尾数的运算分别进行,与定点运算类似。但增加了阶码的定点运算和结果的规格化处理。浮点运算分为规格化运算和非规格化运算两类。由于规格化运算可使尾数具有最长的有效位,运算精度高,所以通常都采用规格化运算。3.5.1浮点加减运算设有两个浮点数x与y,分别为其中Sx、Sy分别为数x、y的尾数,ex、ey分别为数x、y的阶码。两个浮点数加减运算的步骤1.对阶把两数的小数点对齐,称为对阶。两个浮点数的加减运算,首先必须对阶。对阶的标志是使两数阶码相等。对阶时,首先应求出两数阶码之差,即:若?e=0,表示两数阶码相等,小数点已经对齐;若?e>0,表示ex>ey;若?e<0,表示ex<ey;当阶差?e≠0时,需进行对阶移位的操作,通过尾数移位,改变阶码,使两数阶码相等.对阶的基本方法是:小阶向大阶看齐。将阶码小的数的尾数向右移位,每右移一位,阶码加1,直到两数的阶码相等为止。右移位数等于两数阶码之差|?e|。2.尾数求和/差对阶完毕,两数阶码相等,即可对其尾数进行加/减运算。尾数运算的规则与定点加/减运算规则相同。若求和,则将两数尾数直接相加。若求差,则将对阶后的减数的尾数变补与被减数的尾数相加。例:设某机浮点数格式为:阶码和尾数均采用补码表示。已知x=+0.110101×2+0011y=-0.111010×2+0010求x±y=?015611数符阶码尾数解:把x、y转换成机器数x=000011110101y=100010000110首先进行对阶,求阶差:[?e]补=00011+11110=00001∵?e为正,∴ex>ey把y的尾数右移一位,阶码加1,得到y=100011100011[x]补=0110101+[y]补=1100011[x+y]补=0011000②作x-y时,将尾数相减,即将[-y]补的尾数与x的尾数相加。有溢出,需要右移解决溢出。[x]补=0110101+[-y]补=0011101[x-y]补=1010010①作x+y时,将x、y的尾数相加。没有溢出,但不是规格化数,需要左移,表示为规格化数。3.结果规格化在规格化浮点运算中,若运算结果不是规格化数,必须进行规格化处理。原码表示中,满足1/2≤|S|<1的数为规格化数。补码表示中,满足一1≤S<-1/2和1/2≤S<1的数为规格化数。破坏规格化:不满足上述条件的运算结果,称为破坏规格化。向左破坏规格化:尾数发生溢出。向右破坏规格化:尾数未溢出,但不满足规格化条件。设浮点数尾数[S]原=Sf.S1S2…Sn如果尾数发生溢出,则为向左破坏规格化;如果尾数未溢出,但S1=0,则为向右破坏规格化。设浮点数尾数[S]补=Sf.S1S2…Sn如果尾数发生溢出,则称为向左破坏规格化;如尾数未溢出,但Sf⊕S1=0,即Sf与S1相同,则为向右破坏规格化。为方便溢出判别,尾数也可采用变形补码表示,即[S]补=Sf1Sf2.S1S2…Sn,若运算结果Sf1⊕Sf2=1,则表示尾数溢出,即结果为向左破坏规格化;若运算结果SflSf2S1+Sf1Sf2S1=1,即Sf1、Sf2与S1相同,表示尾数未溢出,但符号位与最高数值位相同,结果向右破坏规格化。当运算结果出现向左破坏规格化时,必须向右进行规格化(右规)。右规:将尾数向右移位,每移一位(注意补码右移规则),阶码加1,直到满足规格化要求为止。当运算结果出现向右破坏规格化时,必须向左进行规格化(左规)。左规:将尾数向左移位,每移一位,阶码减1,直到满足规格化要求为止。在前例中[x+y]补=000011011000∵两异号数相加不会溢出,∴不是向左破坏规格化。∵Sf⊕S1=0,∴是向右破坏规格化。将尾数向左移一位,即可满足Sf⊕S1=1。将尾数向左移一位,阶码减1,规格化后:[x+y]补=000010110000x+y=+0.110000×2+0010[x-y]补=100011010010由于两正数相加的结果符号为负,显然是尾数发生了溢出,向左破坏规格化。在浮点运算中,通过规格化处理,溢出将不会影响正确的运算。把尾数向右移一位,阶码加1,规格化后[x-y]补=000100101001x-y=+O.101001×2+01004.舍入为减少对阶和向右规格化时,因尾数右移而造成的误差,可进行舍入处理。舍入的原则:⑴误差不超过所允许的范围,一般要求不超过最低位的1。⑵误差应有正有负,不会产生积累误差。(1)截断法(恒舍法)将丢掉的部分一律舍去,保留的部分不作任何改变。这种方法简单,但精度较低。(2)0舍1入法若右移时被丢掉数位的最高位为0,则舍去;若右移时被丢掉数位的最高位为1,则将1加到尾数的最低位。这种方法精度较高,但在加1时,会产生进位,使运算速度减慢。而且可能造成尾数溢出,需要再次右规。(3)末位恒置1法末位恒置1法也称冯·诺依曼舍入法。尾数右移时,无论被丢掉的数位的最高位为0还是为1,都将保留的尾数的最低位恒置为1。优点:舍入处理不用做加法运算,方法简单、速度快且不会有再次右规的可能,并且没有积累误差,是常用的舍入方法。缺点:单次舍入引起的误差较大。(4)查表舍入法(ROM舍入法)根据尾数的低K位的代码值及被丢掉数位的最高位值,按一定舍入规则,编制成舍入表,并存入只读存储器。当需要舍入操作时,以尾数低K位及被丢掉数位的最高位作为ROM地址,通过查舍入表,得到舍入后尾数低K位值。舍入表编制原则若尾数低K位值不为全1,则按0舍1入法编制;若尾数低K位值为全1,则按截断法编制。舍入表原K位最高丢失位舍入后K位00000001010100101110100101011111011111110舍1入截断法查表舍入法既具有0舍1入法的优点,又可以避免0舍1入法中的进位传送。(5)设保护位(guardbit)法在尾数后面设若干位保护位,运算时保护位与尾数一起参加运算和移位。运算结果根据保护位的值决定舍入。如DGMV系列机中,双精度浮点数尾数有56位,8位保护位,共64位运算,其舍入规则为:若保护位值为00H~7FH(0XXXXXXX),则采用截断法;若保护位值为80H(10000000),则尾数最低位加到尾数最低位上;若保护位值为81H~FFH(1XXXXXXX),则尾数最低位上加1。这种方法可使误差小于尾数最低位的1/2。尾数保护位例:设[x]原=1.10101001[y]补=1.101010010请用恒舍法、0舍1入法、末位恒置1法进行舍入。要求保留8位数据(包括1位符号位)。解:由于原码是“符号代码化”,所以对数值部分的舍入,只要根据舍去部分的最高位是否为“1”来决定舍入。对于[x]原=1.101010011按恒舍法舍入后得:[x]原=1.101010011按0舍1入法舍入后得:[x]原=1.101010111按末位恒置1法舍入后得:[x]原=1.101010111对于原码,当采用0舍1入法时,无论其值的正负,“舍”使数的绝对值变小,“入”使数的绝对值变大。当尾数为补码表示时,所用舍入规则,应该与原码表示时产生相同的处理效果。当舍入部分不为全0时,若补码为正数,0舍1入的结果与原码相同。若补码为负数,0舍1入的结果与原码相反。为了使补码的舍入与原码的结果一致,对负数的补码舍入的具体规则是:①当丢失的各位均为0时,不必舍入;②当丢失的最高位为0,且以下各位不全为0,或丢失的最高位为1,且以下各位全为0时,舍去丢失位上的值;③当丢失的最高位为1,以下各位不全为0时,执行在尾数最低位入1的修正操作。对于[y]补=1.101010010按恒舍法舍入后得:[y]补=1.101010010按0舍1入法舍入后得:[y]补=1.101010010按末位恒置1法舍入后得:[y]补=1.1010101105.浮点运算的溢出处理与定点运算相同,浮点运算结束时,也需要进行溢出判断。如果浮点运算结果的阶码大于所能表示的最大正阶,则表示运算结果超出了浮点数所能表示的绝对值最大的数,进入了上溢区;如果浮点运算结果的阶码小于所能表示的最小负阶,则表示运算结果小于浮点数所能表示的绝对值最小的数,进入了下溢区。当运算结果出现下溢时,浮点数的数值趋近于零,所以通常不作溢出处理,而是将其作为机器零处理。当运算结果出现上溢时,表示浮点数真正溢出,通常需要将计算机中的溢出标志置“1”,转入溢出中断处理。浮点数的溢出通常是指浮点数上溢。浮点数是否溢出是由阶码是否大于浮点数所能表示的最大正阶来判断的。例如,设浮点数的阶码采用补码表示,双符号位,这时浮点数的溢出与否可由阶码的符号进行判断:若阶码[j]补=01××…×,则表示出现上溢,需作溢出处理;若阶码[j]补=10××…×,则表示出现下溢,按机器零处理。3.5.2浮点乘除运算浮点乘除运算实质上是尾数和阶码分别按定点运算规则运算。设∴尾数按定点乘法规则运算,阶码按定点加减规则运算,分别得到乘积的尾数和乘积的阶码。若运算结果为破坏规格化数,则需对结果规格化。在浮点除法运算中,尾数按定点小数除法运算规则相除,阶码按定点加减规则相减,分别得到商数的尾数和商数的阶码。在定点小数除法中,要求|被除数|<|除数|,因此,当|Sx|≥|Sy|时需调整被除数。由于尾数都表示为规格化数,所以一般只需将Sx右移一位,阶码加1,满足|Sx|<|Sy|后,即可进行除法运算。1.阶码运算及溢出判断如果参加运算的浮点数的阶码采用补码表示,则乘积的阶码为被乘数与乘数阶码之和[ex+ey]补=[ex]补+[ey]补商的阶码为被除数与除数阶码之差[ex-ey]补=[ex]补-[ey]补可以根据补码运算的规则进行阶码运算,并按照补码的溢出条件判断阶码是否产生了溢出。当计算机浮点数的阶码采用移码表示时,浮点加减运算的求阶差及浮点乘除的阶码加减均需按移码加减规则处理。根据移码定义:[x]移=2n+x-2n≤x<2n∴[ex]移=2m+ex(m为不含阶符的阶码位数)[ey]移=2m+ey∴[ex]移+[ey]移=2m+ex+2m+ey=2m+[2m+(ex+ey)]=2m+[ex+ey]移即直接用移码实现求阶码之和,结果比两数之和的移码多了2m,即最高位上多加了一个1,所以要得到移码形式,需将结果最高位(符号位)取反。例:求[ex+ey]移。①[ex]移=10011,[ey]移=01001②[ex]移=01100,[ey]移=10101解:①[ex]移+[ey]移=10011+01001=11100将符号位取反得:[ex+ey]移=01100②[ex]移+[ey]移=01100+10101=00001,将符号位取反得:[ex+ey]移=10001由于补码与移码的数值位相同,符号位相反,因此移码表示的阶码之和也可用下式实现:[ex]移+[ey]补=2m+ex+2m+1+ey=2m+1+[2m+(ex+ey)]=2m+1+[ex+ey]移=[ex+ey]移(mod2m+1)同理:[ex]移+[-ey]补=2m+ex+2m+1+(-ey)=2m+1+[2m+(ex-ey)]=2m+1+[ex-ey]移=[ex-ey]移(mod2m+1)因为[ey]补与[ey]移数值相等,符号相反,所以在进行移码的加减运算时的算法为:在进行移码加减运算时,将加数或减数的移码符号位取反后进行加减。移码运算的溢出判断方法为便于判断移码加/减运算的溢出情况,可采用双符号位进行运算。设移码的双符号位为sf1sf2,并规定初始时,移码的第一个符号位sf1恒为0,并参加运算。若运算结果的sf1为1,表示溢出。sf1sf2=10,结果上溢sf1sf2=11,结果下溢若运算结果的sf1为0,表示无溢出。sf1sf2=00,结果为负sf1sf2=01,结果为正例:设不含阶符的阶码位数m=4,求[ex±ey]移。①ex=+1001,ey=+0101;②ex=+1010,ey=-1001;③ex=-1010,ey=-1101。解:①[ex]移=011001,[ey]补=000101,[-ey]补=111011[ex+ey]移=011001+000101=011110[ex-ey]移=011001+111011=010100第一符号位为0,没有溢出,第二符号位为1,结果为正。∴ex+ey=+1110,ex-ey=+0100②[ex]移=011010,[ey]补=110111,[-ey]补=001001[ex+ey]移=011010+110111=010001[ex-ey]移=011010+001001=100011[ex+ey]移的第一符号位为0,没有溢出,第二符号位为1,结果为正。∴ex+ey=+1110[ex-ey]移的第一符号位为1,发生溢出,第二符号位为0,表示结果上溢。③[ex]移=000111,[ey]补=110011,[-ey]补=001101[ex+ey]移=000111+110011=111010[ex-ey]移=000111+001101=010100[ex+ey]移的第一符号位为1,发生溢出,第二符号位为1,表示结果下溢。[ex-ey]移的第一符号位为0,没有溢出,第二符号位为1,结果为正。∴ex-ey=+0100实现移码加减运算的并行加法器[ex]移=exnexn-1…ex1;[ey]移=eyneyn-1…ey1[ex±ey]移=SnSn-1…S1其中exn、eyn、Sn为移码的符号位。2.尾数运算1)浮点乘法尾数运算在浮点乘法运算中,乘积的尾数是相乘的两个浮点数的尾数之积,并按定点小数的乘法规则进行运算。浮点乘法尾数运算的运算步骤:①检测被乘数和乘数的尾数是否为0,若有一个为0,则乘积必然为0,不需再进行计算。只有当两数皆不为0时,方可进行运算。②被乘数和乘数的尾数相乘。根据尾数采用的是原码表示还是补码表示,可采用任意一种相应的定点小数乘法完成运算。③运算结果规格化。如果尾数采用补码表示,由于-1是规格化数,而当两尾数均为-1时,由于(-1)×(-1)=1,因此需要对运算结果进行一次右规,如果在右规调整阶码时,出现阶码上溢,则表示浮点数上溢,应转入溢出中断处理。④舍入处理。两个n位(除符号位外)尾数相乘,乘积为2n位。如果只需要取乘积的高n位,则需要对乘法运算结果进行舍入处理。2)浮点除法尾数运算在浮点除法运算中,商的尾数是被除数尾数除以除数尾数之商,尾数按定点小数除法规则运算。如果运算结果不满足规格化要求或出现溢出情况,则需进行相应的处理。浮点除法尾数运算的运算步骤:①检测被除数和除数的尾数是否为0,若被除数为0,商必然为0,不需再进行计算;若除数为0,则商为无穷大,转入除数0中断处理。只有当两数皆不为0时,方可进行运算。②被除数和除数的尾数相除。根据尾数采用的是原码表示还是补码表示,可采用任意一种相应的定点小数除法完成运算。③运算结果规格化。如果商的绝对值小于1/2,则需对运算结果进行左规。如果在左规调整阶码时,出现阶码下溢,则应将运算结果作机器零处理。例:设浮点数的阶码用移码表示,包括符号位为4位;尾数用补码表示,包括符号位为5位。已知两个浮点数:x=-0.1001×2+101,y=+0.1011×2-011,求x×y。解:根据已知条件可得:x的尾数[Sx]补=1.0111x的阶码[ex]移=1101y的尾数[Sy]补=0.1011y的阶码[ey]移=0101①阶码求和[ey]补=1101,采用双符号位进行移码加法运算,得:[ex+ey]移=[ex]移+[ey]补=01101+11101=01010结果的阶码的第一符号位sf1为0,则表示阶码无溢出。②尾数相乘尾数可采用定点补码乘法(双符号位),得:[Sx×Sy]补=[Sx]补×[Sy]补=11.0111×00.1011=11.10011101∵尾数的符号与最高数值位相同∴尾数需要进行向左规格化。尾数左移1位,阶码减1,得:[Sx×Sy]补=11.00111010[ex+ey]移+[-1]补=01010+11111=01001采用0舍1入进行尾数的舍入得:x×y的尾数的补码为:[Sx×Sy]补=1.0100x×y的阶码为:[ex+ey]移=1001x×y=-0.1100×2+0013.6运算器的组成3.6.1定点运算器1.定点运算器的基本结构运算器是CPU的重要组成部分,它是计算机对数据进行加工处理的部件,不仅可以完成数据信息的算术逻辑运算,而且也作为数据信息的主要通路。运算器结构的基本组成部分:包括ALU、寄存器、多路开关和数据总线等基本逻辑部件。运算器设计主要是围绕着ALU和寄存器同数据总线之间如何传送操作数和运算结果而进行的。1)单总线结构运算器在单总线结构运算器中,所有部件都接在同一总线上。在同一时间内,只能有一个操作数放在单总线上。执行双操作数运算时,需要A、B两个缓冲器。执行双操作数运算的操作步骤:①把一个操作数送入A缓冲器。②把另一操作数送入B缓冲器,只有两个操作数同时出现在ALU的输入端时,ALU才能正确执行相应运算,并将运算结果送上单总线。③把结果存入目的寄存器中。单总线结构运算器的主要缺点是操作速度慢。单总线结构运算器2)双总线结构运算器在双总线结构运算器中,操作部件连接在两组总线上,可以同时通过两组总线传输数据。执行双操作数运算的操作步骤:①两个操作数同时加到ALU输入端进行运算,一步完成操作并得到结果。因为ALU的输出不能直接加到数据总线上,所以需要用输出缓冲器暂存运算结果。②把结果从缓冲器中传送到目标寄存器中。双总线结构运算器的执行速度比单总线结构运算器的执行速度快。双总线结构运算器3.三总线结构运算器在三总线结构运算器中,操作部件连接在三组总线上,可以同时通过三组总线传输数据。执行双操作数运算的操作步骤:由于三总线结构运算器有三组总线,能够分别接收两个操作数和ALU结果,因此只需一步就可完成一次双操作数运算。与前两种结构的运算器相比较,三总线结构运算器的操作速度最快,不过其控制也更复杂。在三总线结构运算器中,还可以设置总线旁路器。如果一个操作数不需运算操作或修改,可通过总线旁路器直接从总线2传送到总线3,而不必经过ALU。三总线结构运算器2.定点运算器举例最基本的运算器由算术逻辑部件ALU、累加器(AC)、数据缓冲寄存器(MDR)组成。运算器与存储器之间通过一条双向数据总线进行联系,可以实现从存储器中读取一个数据经MDR、ALU存放在AC中,也可把AC中信息经MDR存入主存的指定单元。它也可以实现AC中数据与主存某一单元的数据经ALU运算,结果暂存于AC中。Am2901A位片式结构运算器组件可利用大规模集成电路技术(LSI)将ALU与寄存器集成为位片式结构的运算器芯片,如4位/片。用几块位片芯片拼接,可以构成较长位数的运算器。Am2901A是一种位片式结构运算器组件。Am2901A运算器组件的特点①采用位片式结构,内部有四位线路,把多块Am2901A芯片级联起来,可实现不同位数的运算器。②Am2901A的ALU可实现八种运算功能。设ALU两个输入端数据分别用R和S表示,八种功能分别为:三种算术运算功能:R+S、S-R和R-S;五种逻辑运算功能:R∨S,R∧S,R∧S,R⊕S和R⊙S。用外部送入的三位控制信号I5I4I3的编码值,可实现八种功能的选择控制。③ALU中R输入端:可以接收外部送入运算器的数据D(例如读自主存)、寄存器组的A输出及逻辑“0”值;S输入端:可接收寄存器组的A输出、B输出、寄存器Q输出及逻辑“0”值。用外部送来的三位控制码I2I1I0,可控制R、S的多路选择器选择输入。④运算器中有1个16×4位的通用寄存器组和一个4位的Q寄存器。通用寄存器组为双端口输出的部件,可将寄存器中的内容分别送到输出端口A或B。每一个寄存器都可以用A地址或B地址选择。当A和B地址不同时,在输出端口A和B将得到两个不同寄存器中的内容。寄存器组的写入控制,只取决于B地址。写入端口B的数据来自可移位的多路选择器。移位器可执行直送、左移一位或右移一位的操作,使加减运算和移位操作可在同一个操作步骤中完成。Q寄存器本身具有移位功能,可以实现左移一位或右移一位的功能。Q寄存器还可以接收ALU的输出F的值。Q的输出可以经ALU的S输入端送入ALU。Q寄存器可作为乘积和商寄存器。⑤ALU给出的四个状态信息:Cn+4:本片四位运算器产生的向更高位的进位F3:本片运算结果最高位的取值(可用作符号位)OVR:结果溢出判断信号F=0:结果为零信号Cn:从更低位片送入ALU的进位信号G和P:ALU给出的提前进位信号,即小组本地进位和小组传递函数。⑥RAM3、RAM0、Q3、Q0:移位寄存器接收与送出移位数值的引线。用三态门给出的具有双向传送功能的线路实现。⑦运算器的四位输出为Y3~Y0,它可以是ALU的运算结果,也可以是寄存器组A输出端口上的内容。输出采用三态门电路,用OE信号控制,OE=0,Y的值有效,可以输出OE=1,Y输出处于高阻状态⑧编码I8I7I6用于决定移位寄存器的输出和结果的输出,以控制数据传送的方式(移不移位)和数据发送的方向。例:给出实现指令R0+R1→M的控制信号。解:选择R0:A地址=0000;选择R1:B地址=0001;控制ALU的输入R=A,S=B:I2I1I0=001;控制执行运算R+S:I5I4I3=000;控制输出运算结果F(Y=F):I8I7I6=001控制允许运算结果F输出:=0例:给出实现指令2(D-R9)→R10的控制信号。解:控制选择R9:A地址=1001;控制选择R10:B地址=1010;控制ALU的输入R=D,S=A:I2I1I0=101;控制执行运算R-S:I5I4I3=010;控制输出运算结果2F到R10:I8I7I6=111控制封锁Y=F的输出,=13.6.2浮点运算器由于浮点运算中阶码运算与尾数运算分别进行,因此浮点运算部件应包括尾数部件和阶码部件两个部分。实现四则运算的浮点运算器1)尾数运算部件用于进行尾数的加减乘除运算。尾数运算部件由寄存器R0、R1、MQ及并行加法器Fm组成。R0、R1:暂存操作数。R0也称为累加器,还用于存放运算结果。MQ:乘商寄存器用于进行乘除运算,R0、MQ具有联合左移、右移的功能,实现方法与定点乘、除法器相类似。R1具有右移功能,以实现对阶移位。2)阶码运算部件用于进行阶码的加减运算。由寄存器E1、E2、阶差计数器EC以及并行加法器Fe组成。E1、E2:存放与R0、R1中尾数相对应的阶码。⑴作加减运算时①由阶码运算部件求出阶差?E=E1-E2,并存入阶差计数器EC中,EC可根据符号判断哪个阶码小,控制将对应的尾数(R0或R1)进行右移。?E为+,E2小,R1右移,每移一位,EC-1?E为-,E1小,R0右移,每移一位,EC+1直到EC=0,完成对阶工作。②尾数部件作加/减运算,结果存入R0。③判别运算结果,进行规格化。在规格化处理过程中,每将R0左移(或右移)一位时,应将E1与E2中的较大者减1(或加1),最后作为结果的阶码。⑵作乘除运算时尾数运算部件和阶码运算部件独立工作,阶码仅作加减运算,运算结束,对结果进行规格化处理。浮点运算尾数部件中寄存器分配3.7十进制加减运算为适应商用的需要,可以对十进制数的二进制编码进行一些特殊的规定,使计算机内部具有直接进行十进制运算的能力。有些计算机中设置了十进制指令,可以直接对十进制数进行运算,从而减少了十进制数和二进制数之间的转换,方便了商用指令的处理。计算机中实现十进制数加减运算常用的方法①?利用原有的二进制加法器对采用BCD编码表示的十进制数进行运算,然后再用十进制修正指令对运算结果进行修正,以获得正确的十进制运算结果。②直接利用十进制加法器实现十进制运算。3.7.1一位十进制加法器的设计计算机中的十进制数是用二进制编码表示的,如采用BCD码表示。十进制加法器是在二进制加法器加上一定的修正逻辑构成的。十进制加法器的基本思路:将两个十进制数的BCD码按二进制加法运算,再根据运算结果与十进制和数的正确BCD码的差别求得修正逻辑,将二进制结果修正为十进制和数。8421码十进制加法器运算结果的修正关系根据用二进制规则将两个8421码十进制数相加所得的结果与正确的8421码和数的关系,得到修正方法为:①若相加的和数<10,则不需修正,按二进制规则相加的结果就是正确的8421码和数;②若相加的和数≥10,则需在二进制相加的结果加0110修正。修正的条件为:C4+S4S3+S4S2修正条件还作为本位十进制数向高位十进制产生的进位。例:利用8421码加法规则计算3+4解:十进制数“3”和“4”的8421码为“0011”和“0100”,8421码和数=0011+0100=0111结果<10,结果不需修正,和数为7。非法编码+011010010例:利用8421码加法规则计算3+9解:十进制数“3”和“9”的8421码为“0011”和“1001”8421码和数=0011+1001=1100结果≥10,结果需要修正。0011+10011100结果为00010010=1一位8421码十进制加法器逻辑电路F1=S1,即+0,与8421码的二进制运算结果一致。F2:当运算结果≥10时,需+1,没有低位来的进位,F2=S2⊕1,同时向高一位有进位S2·1。F3:当运算结果≥10时,需+1,且有低位来的进位S2·1,F3=S3⊕1⊕S2·1。F4:若F3上有进位,则F4=S4⊕F3上的进位。3.7.2多位十进制整数的加减运算1.多位十进制加法多位十进制加法完全遵照一位十进制加法的规则进行运算和结果修正。在进行结果修正时,每一位十进制数运算结果的修正,必须是在低位十进制数运算结果修正的基础上进行的,即高位结果的修正必须考虑低位结果修正后的进位。可用多个一位十进制加法器级联起来实现多位十进制加法运算。例:利用8421码加法规则计算137+376。解:十进制数“137”的8421码为“000100110111”“376”的8421码为“001101110110”000100110111+001101110110010010101101+1011010110010100010011(137+376)8421=010100010011,137+376=5132.多位十进制减法十进制减法与二进制减法类似,用加上减数的补码代替,即F=x-y=x+[-y]10补这里x、y均为n位十进制整数。十进制补的定义:[-y]10补=10n-y∴x-y=x+(10n-y)=10n+(x-y)当x-y≥0,最高位产生的进位丢失,结果正确,为正数。当x-y<0,最高位不产生进位,结果为负,需再变一次补,才能得到正确结果。例:利用8421码减法规则计算319-146解:[-146]10补=103-146=854001100011001+100001010100101101101101+0110000001101000101110011最高位产生的进位丢失,结果正确,为正数。∴319-146=173例:利用8421码减法规则计算257-582解:[-582]10补=103-582=418001001010111+010000011000011001101111+000000000110011001110101∵结果最高位没有进位,表示结果为负,需再变一次补,才能得到正确结果。[-675]10补=103-675=325∴257-582=-3253.8逻辑运算和移位操作3.8.1逻辑运算计算机中的逻辑运算包括与、或、非、异或等运算。逻辑数是非数值数据,其每一位的“0”、“1”仅用于表示逻辑上的“真”与“假”,不存在符号位、数值位、阶码、尾数之分逻辑运算的特点:按位运算,运算简单,运算结果的各位之间互不影响,不存在进位、借位、溢出等问题。逻辑运算可用于对数据字中某些位(一位或多位)进行操作。⑴按位测利用“逻辑与”操作可以屏蔽掉数据字中的某些位。⑵按位清利用“逻辑与”可以将数据字的某些位清“0”。⑶按位置利用“逻辑或”可以使数据字的某些位置“1”。⑷判符合或修改根据两数异或结果是否为“0”,可判断两数是否相符。如果需要修改数据的某些位(即将相应位取反),可使操作模式的相应位设为“1”,其余为“0”,将操作模式与数据字异或之后,就可实现对数据字相应位的修改。例:ANDAL,11110110B;AL中D0和D3清0,其余位不变ORAL,00001001B;AL中D0和D3置1,其余位不变XORAL,00001001B;AL中D0和D3求反,其余位不变XORAL,AL;AL清03.8.2移位操作移位操作包括逻辑移位、算术移位和循环移位。1.逻辑移位进行逻辑移位时,认为需要移位的机器数代码为无符号数或纯逻辑代码,所以移位时不考虑符号问题。移位时所有代码均参加移位。⑴逻辑左移各位按位左移,最高位向左移出,最低位空位填“0”。通常向左移出的最高位可保存到运算器的进位状态寄存器C中。⑵逻辑右移各位按位右移,最低位向右移出,最高位空位填“0”。通常,向右移出的最低位可保存到运算器的进位状态寄存器C中。C11010101移位前110101010逻辑左移一位后01例:设x为无符号数,x=11010101,写出x逻辑左移一位和逻辑右移一位的结果。解:⑴x逻辑左移一位最低位空位填“0”,得:x=10101010。最高位移入进位状态寄存器,C=1。101101010逻辑右移一位后10⑵x逻辑右移一位C11010101移位前最高位空位填“0”,得:x=01101010。最低位移入进位状态寄存器,C=1。2.算术移位进行算术移位时,认为需要移位的代码为带符号数,具有数值含义且带有符号位,因此在算术移位中,必须保持移位前后的符号位不变。⑴算术左移各位按位左移,最高位向左移出,最低位产生的空位填“0”。向左移出的最高位可保存到进位状态寄存器C中。算术左移后数据的符号不应改变,如果左移前后的符号位发生了变化,说明数据的符号被破坏,移位溢出。⑵算术右移各位按位右移,最低位向右移出,最高位产生的空位填入与原最高位相同的值,即符号位保持不变。向右移出的最低位可保存到进位状态寄存器C中。C11010101移位前110101010算术左移一位后01例:设[x]补=11010101,写出[x]补算术左移一位和算术右移一位的结果。解:∵[x]补=11010101,∴x<0。⑴[x]补算术左移一位后,最低位空位填“0”得:x=10101010,最高位移入C中,C=1。左移前后的符号位未发生变化,移位正确。C11010101移位前111101010算术右移一位后11⑵[x]补算术右移一位后,最高位产生的空位填入与原最高位相同的值,即填“1”。得:x=11101010。最低位移入C中,C=1。3.循环移位循环移位就是指移位时数据的首尾相连进行移位。即最高(最低)位的移出位又移入数据的最低(最高)位。循环移位一般用于实现循环式控制、高低字节的互换,还可以用于实现多倍字长数据的算术移位或逻辑移位。⑴不带进位循环进位状态寄存器C中的内容不与数据部分一起循环移位,也称小循环。①不带进位循环左移各位按位左移,最高位移入最低位,同时保存到C中。②不带进位循环右移各位按位右移,最低位移入最高位,同时保存到C中。⑵带进位循环进位状态寄存器C中的内容与数据部分一起循环移位,也称大循环。①带进位循环左移各位按位左移,最高位移入C中,C中的内容移入最低位。②带进位循环右移各位按位右移,最低位移入C中,C中的内容移入最高位。例:设有两个8位寄存器A和B,A中的内容为11010101,B中的内容为00111100。试利用移位指令将两个寄存器的内容联合逻辑右移一位,其中寄存器A为高8位,B为低8位。解:先将寄存器A中的内容逻辑右移一位,其最低位移入进位状态寄存器C中;再将寄存器B中的内容带进位循环右移一位,即可完成两个寄存器的联合逻辑右移。寄存器A、B联合逻辑右移后,A中的内容为01101010,B中的内容为10011110,进位状态寄存器C中的内容为0。A寄存器C11010101移位前101101010逻辑右移一位后10B寄存器100111100移位前010011110带进位循环右移一位后0德国队分





















S3S2 Xi S1S0 Yi 00 1 00 Ai 01 Ai+Bi 01 AiBi 10 Ai+Bi 10 AiBi 11 Ai 11 0

输入反变量、输出反变量 输入原变量、输出原变量 输入 ~、~、Cn A3~A0、B3~B0、 输出 ~、Cn+4

、、A=B F3~F0、

G、P、A=B 控制信号 M、S3、S2、S1、S0 M、S3、S2、S1、S0



























献花(0)
+1
(本文系太好学原创)