• 原码一位乘法与补码一位乘法


    原码1位乘法

    在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到。而乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数用定点小数表示(定点整数也相同适用)

    被乘数 [x] = x.xxx xn        

    乘数   [y] = yf .yyy yn

    乘积   ] = ( xfy) . (0. xxxxn)(0 . yyyn)

    式中,xf为被乘数符号。yf为乘数符号。

    乘积符号的运算法则是:同号相乘为正,异号相乘为负。因为被乘数和乘数和符号组合仅仅有四种情况(xf yf = 00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。

    数值部分的运算方法与普通的十进制小数乘法相类似。只是对于用二进制表达的数来说,其乘法规则更为简单一些:从乘法y的最低位開始。若这一位为“1”。则将被乘数x写下;若这一位为“0”,则写下全0。然后再对乘数y的高一位进行的乘法运算,其规则同上,只是这一位乘数的权与最低位乘数的权不一样。因此被乘数x要左移一位。依次类推。直到乘数各位乘完为止。最后将它们统统加起来。便得到最后乘积。  

    设 x = 0.1011。y = 0.1101,让我们先用习惯方法求其乘积。其步骤例如以下:

    ×

     

     

     

     

     

    0.

    1

    1

    0

    1

    (x)

     

    0.

    1

    0

    1

    1

    (y)

     +

     

     

     

     

     

     

    1

    1

    0

    1

     

     

     

    1

    1

    0

    1

     

     

    0

    0

    0

    0

     

     

    1

    1

    0

    1

     

     

     

     

     

    0.

    1

    0

    0

    0

    1

    1

    1

    1

    (z)

    假设被乘数和乘数用定点整数表示,我们也会得到相同的结果。可是。可是人们习惯的算法对机器并不全然适用。原因之中的一个,机器通常仅仅有n位长,两个n位数相乘,乘积可能为2n位。原因之二,仅仅有两个操作数相加的加法器,难以胜任将n个位积一次相加起来的运算。为了简化结构,机器通常仅仅有n位长。而且仅仅有两个操作数相加的加法器。为此,必须改动上述乘法的实现方法。将 · 改写成适于例如以下定点机的形式:

    一般而言。设被乘数 、乘数 都是小于 1 的 n 位定点正数:

             x = 0 . xx… xn   。   y = 0 . yy yn

    其乘积为

           · y =  x · ( 0.y1y… y)

                   = x · ( y-1 + y-2 + … + y-n)

                   = 2 -1y1x + 2-1yx + 2-1 (… + 2-1 yn-1 x + )…))

     zi 表示第 i 次部分积,则上式可写成例如以下递推公式:

                  z0 = 0

                  z1 = 2-1ynx + z0)

                   …

                  zi = 2-1yn-i+1x + zi-1)                            (2.3.2)

                   …

                  zn = x·y = 2-1y1x + zn-1)

    显然,欲求x·y,则需设置一个保存部分积的累加器。

    乘法開始时,令部分积的初值z0 = 0。然后求加上ynx。右移1位得第1个部分积,又将加上yn - 1x,再右移1位得第2个部分积。依此类推。直到求得y1x加上zn-1并右移1位得最后部分积,即得x·y。显然,两个n位数相乘。需反复进行n次“加”及“右移”操作。才干得到最后乘积。这就是实现原码一位乘法的规则。

       【例 】  x  = 0.1101。 y = 0.1011。用原码一位乘法计算 x · y  = 

       [解:]       求解步骤例如以下:            Flash演示   

     

     

    部分积

     

     

    乘数

    说明

     

     

     

    00.0000

     

    yf

    1

    0

    1

    1

     

    z0 = 0

     

    +

     

    00.1101

     

     

     

     

     

     

     

    y4 = 1,+ x

     

     

     

    00.1101

     

     

     

     

     

     

     

     

     

     

    00.0110

     

    1

    yf

    1

    0

    1

     

    右移。得z1

     

    +

     

    00.1101

     

     

     

     

     

     

     

    Y3 = 1。+ x

     

     

     

    01.0011

     

     

     

     

     

     

     

     

     

     

    00.1001

     

    1

    1

    yf

    1

    0

     

    右移,得z2

     

    +

     

    00.0000

     

     

     

     

     

     

     

    Y2 = 0,+0

     

     

     

    00.1001

     

     

     

     

     

     

     

     

     

     

    00.0100

     

    1

    1

    1

    yf

    1

     

    右移,得z3

     

    +

     

    00.1101

     

     

     

     

     

     

     

    Y1 = 1,+ x

     

     

     

    01.0001

     

     

     

     

     

     

     

     

     

     

    00.1000

     

    1

    1

    1

    1

    yf

     

    右移,得z3 = xy

                      所以                        x · y  = 0.10001111

    图2-7 为实现原码一位乘法的硬件逻辑原理图。这里有三个寄存器,当中 R0 存放部分积z,在乘法開始 R前应清“0”,

    保证 z0 = 0,R1 寄存器存放乘数 ,R2寄存器存放被乘数 x 。因为乘法開始时先从乘数的最

    低位 yn 開始,以后则使用yn - 1yn - 2,…,y1,因此乘数寄存器 R应当是具有右移功能的移位寄存器。

    假定加法器不具备右移功能,那么因为部分积须要右移,R也应当是具有右移功能的移位寄存器。

    图2-7        原码一位乘法逻辑结构原理图

    除了三个寄存器 R0,R1,R2 外。还需一个加法器和一个计数器,前者完毕部分积与位积的累加,后者对移位的次数进行计数。以便推断乘法运算是否结束。

    乘法開始时,“启动”信号使控制触发器 Cx 置“1”。于是开启时序脉冲 T 。当乘数寄存器 R0 最末位为“1”时,部分积 z 和被乘数 x 在加法器中相加。其结果输出至 R0 的输入端,一旦打入控制脉冲 T。控制信号 LDR0 使部分积右移 1 位,与此同一时候,乘数寄存器 R1 也在控制信号 LDR1 作用下右移一位,且计数器i计数 1 次。

    当计数器 i = 时。计数器i的溢出信号使控制触发器 Cx 置“0”。关闭时序脉冲T,乘法操作结束。假设将 R0 和 R连接起来,乘法结束时乘积的高 n 位部分在 R0 ,低 位部分在 R1 。R1 中原来的乘数y因为右移而所有丢失,乘积为 2n+1 位,当中包含 1 位符号位。


           

    补码1位乘法

    原码乘法的主要问题是符号位不能參加运算,单独用一个异或门产生乘积的符号位。

    故自然提出是否能让符号数字化后也參加乘法运算,补码乘法就能够实现符号位直接參加运算。

    为了得到补码一位乘法的规律。先从补码和真值的转换公式開始讨论。

    1.  补码与真值的转换公式

    设 [x] = xx1x2xn ,有:

                   n                  (2.3.3)
    x = - x0+∑  xi2-i     
                   i=1 

    等式左边 x 为真值。此公式说明真值和补码之间的关系。

    2.  补码的右移

    正数右移一位,相当于乘1/2(即除2)。

    负数用补码表示时。右移一位也相当于乘1/2。因此。在补码运算的机器中,一个数不论其正负,连同符号位向右移一位。若符号位保持不变,就等于乘1/2。

    3.  补码乘法规则

    设被乘数 [x] = x0.x1x2xn 和乘数 [y] = y0.y1y2yn 均为随意符号,则有补码乘法算式

                                             n (2.3.4)
      [ · ]补 = [x] ·  ( - y0 + ∑ yi2-i )
                                                         i=1 

    为了推出串行逻辑实现人分步算法,将上式展开加以变换:

    [x·y]补   = [x]·[ - y0 + y12-1 + y22-2 + … + yn2-n]

              = [x]·[ - y0 + (y1 - y12-1) + (y22-1 - y22-2) + … + (yn2-(n-1) - yn2-n)]

              = [x]·[(y1 - y0) + (y2 - y1) 2-1 + … + (yn - yn-1) 2-(n-1) + (0 - yn)2-n]

              = [x]·            (yn+1  =  0)   

                   

    写成递推公式例如以下:

             z] = 0

            z] = 2 -1{ [ z]补 +  (  yn+1 - yn ) [x]补 }           (yn+1  =  0)

                    

            z] = 2 -1{ [ zi-1 ]补 +  ( yn-i+2 yn-i+1 ) [x] }             (2.3.5)

                    

            z] = 2 -1{ [ zn-1 ]补 +  ( y2 - y) [x]补 }

             zn+1 ] = [ z]补 +  (  yy) [x] = [ x · ]补 

    開始时。部分积为 0。即 [z0] = 0。然后每一步都是在前次部分积的基础上,由 (  yi+1  -  yi  ) ( i = 0。1,2。…,n) 决定对[x]的操作,再右移一位。得到新的部分积。如此反复 n + 1步,最后一步不移位,便得到 [ x · ] 。这就是有名的布斯公式

    实现这样的补码乘法规则时。在乘数最末位后面要添加一位补充位 yn+1 。開始时,由 ynyn+1 推断第一步该怎么操作。然后再由 yn - 1 yn 推断第二步该怎么操作。由于每做一步要右移一位,故做完第一步后, yn - 1 yn 正好移到原来 ynyn+1 的位置上。依此类推,每步都要用 ynyn+ 1 位置进行推断。我们将这两位称为推断位。

    假设推断位 ynyn+1 = 01,则 yi+1  …  yi  = 1,做加[x]操作。假设推断位 yn yn+1 = 10,则 yi+1 … yi  =  - 1,做加[ - x] 操作;假设推断位 yn yn+1 = 11 或 00。则 yi+1… yi  = 0。[ z] 加0。即保持不变。

    4. 补码一位乘法运算规则

    (1) 假设 yn = yn+1,部分积 [ z] 加0。再右移一位;

    (2) 假设 yn yn+1 = 01。部分积加[ ]。再右移一位;

    (3) 假设 yn yn+1 = 10,部分积加[ - x],再右移一位;

    这样反复进行 n+1 步,但最后一步不移位。包含一位符号位,所得乘积为 2n+1 位,当中 n 为尾数位数。

    【例 】  x  = 0.1101。 y = 0.1011,用补码一位乘法计算 x · y  = 

    [解:]     求解步骤例如以下:             Flash演示       

     

     

     

    部分积

     

     

    乘数

    说明

     

     

     

    00.0000

     

    0.

    1

    0

    1

    1

    0

    yn+1  =  0

     

    +

     

    11.0011

     

     

     

     

     

     

     

    ynyn+1 = 10,加[-x]

     

     

     

    11.0011

     

     

     

     

     

     

     

     

     

     

    11.1001

     

    1

    0

    1

    0

    1

    1

    右移一位

     

    +

     

    00.0000

     

     

     

     

     

     

     

    ynyn+1 = 10,加0

     

     

     

    11.1001

     

     

     

     

     

     

     

     

     

     

    11.1100

     

    1

    1

    0

    1

    0

    1

    右移一位

     

    +

     

    00.1101

     

     

     

     

     

     

     

    ynyn+1 = 01,加[x]

     

     

     

    00.1001

     

     

     

     

     

     

     

     

     

     

    00.0100

     

    1

    1

    1

    0f

    1

    0

    右移一位

     

    +

     

    11.0011

     

     

     

     

     

     

     

    ynyn+1 = 01,加[-x]

     

     

     

    11.0111

     

     

     

     

     

     

     

     

     

     

    11.1011

     

    1

    1

    1

    1

    0

    1

    右移一位

     

    +

     

    00.1101

     

     

     

     

     

     

     

    ynyn+1 = 01,加[x]

     

     

     

    00.1000

     

    1

    1

    1

    1

    0

    1

    最后一步不移位

                      所以                        [x · y]  = 0.10001111

    图2-8        补码一位乘法逻辑原理图

    实现一位补码乘法的逻辑原理图如图 2-8 所看到的。它与一位原码乘法的逻辑结构很类似,所不同的有下面几点:

    (1) 被乘数的符号和乘数的符号都參加运算。

    (2) 乘数寄存器 R有附加位 yn+1 。其初始状态为“0”。

    当乘数和部分积每次右移时。部分积最低位移至 R的首位位置,故 R必须是具有右移功能的寄存器。

    (3) 被乘数寄存器 R2 的每一位用原码(即触发器 Q 端)或反码(即触发器 Q 端)经多路开关传送到加法器相应位的一个输入端。而开关的控制位由和 yn 的 yn+1 输出译码器产生。当ynyn+1 = 01时。送[x] ;当 ynyn+1 = 10 时,送[-x],即送的反码且在加法器最末位上加“1”。

    (4) R保存部分积。它也是具有右移功能的移位寄存器。其符号位与加法器 ∑f 符号位始终一致。

    (5) 当计数器 i  =  n +1 时,封锁 LD R0 和 LD R1 控制信号。使最后一位不移位。

    运行补码一位乘法的总时间为

      tm = ( n + 1 ) tntr   (2.3.6)

      当中 n 为尾数位数,t为运行一次加法操作的时间,t为运行一次移位操作的时间。假设加法操作和移位操作同一时候进行,则t项可省略。                                     

                  

  • 相关阅读:
    D3学习笔记一
    Python生成pyc文件
    Linux上用户之间对话
    uwsgi错误invalid request block size
    Nginx的Permission denied错误
    CentOS7关闭防火墙
    CentOS7.0安装Nginx
    应用IBatisNet+Castle进行项目的开发
    再论IBatisNet + Castle进行项目的开发
    DotNet软件开发框架
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6956431.html
Copyright © 2020-2023  润新知