精华内容
下载资源
问答
  • 二进制除法

    万次阅读 2013-07-01 14:54:14
    你真的以为CPU会做二进制除法呀?它就是作减法(这减法也是用补码做加法)。用被除数减除数,减一次,就在另一个地方加个1,直到被除数小于除数了,那么在那个地方放的数就是商,剩下的被除数就是余数。现在的CPU...

    你真的以为CPU会做二进制除法呀?它就是作减法(这减法也是用补码做加法)。用被除数减除数,减一次,就在另一个地方加个1,直到被除数小于除数了,那么在那个地方放的数就是商,剩下的被除数就是余数。现在的CPU号称能做乘法除法,实际上还是在做减法,只不过用了大量硬件电路来提高了运算速度。其实CPU只会做加法,核心是许许多多加法器和控制器电路组成的,其他的四则运算全是“设法”用加法完成的。

        如果你是手工做除法的话,那和十进制是一样的办法。

    展开全文
  •   在嵌入式环境中虽然有乘法运算器,而且芯片运算速度越来越快,但位运算还是最快速的,为了提高计算效率,可以将乘法运算使用位运算替换。 原理   乘法可以用按位运算的基本原理,分两步 因式分解: A * (B + ...


      在嵌入式环境中虽然有乘法运算器,而且芯片运算速度越来越快,但位运算还是最快速的,为了提高计算效率,可以将乘法运算使用位运算替换。

    乘法

    原理

      若被乘数是2的整数倍,可以直接进行左移运算,这个比较简单,本文解释下当被乘数不是2的整数倍的情况,乘法进行位运算替换的基本原理,分两步

    1. 因式分解: A(B+C)=AB+ACA * (B + C) = A * B + A * C
    2. 位移替换乘法 :A2n=A<<nA * 2 ^ n = A << n

    十进制分解

      以10的整数倍为例,进行10进制替换:
    10=8+2=23+2110 = 8 + 2 = 2^3 + 2^1
    100=64+32+4=26+25+22100 = 64 + 32 + 4 = 2^6 + 2^5 + 2^2
    1000=1024168=21024231000 = 1024 - 16 - 8 = 2^{10} - 2^4 - 2^3

    程序示例

    a = 543
    m10 = 10 # 10 = 8 + 2 = 2^3 + 2^1
    m100 = 100 # 100 = 64 + 32 + 4 = 2^6 + 2^5 + 2^2
    m1000 = 1000 # 1000 = 1024 - 16 - 8 = 2^10 - 2^4 - 2^3
    
    am10_cheng0 = a * m10
    am100_cheng0 = a * m100
    am1000_cheng0 = a * m1000
    am10_cheng1 = (a << 3) + (a << 1)
    am100_cheng1 = (a << 6) + (a << 5) + (a << 2)
    am1000_cheng1 = (a << 10) - (a << 4) - (a << 3)
    print ("乘以10:",am10_cheng0,"  ",am10_cheng1)
    print ("乘以100:",am100_cheng0,"  ",am100_cheng1)
    print ("乘以1000:",am1000_cheng0,"  ",am1000_cheng1)
    

    运算结果

      将源码保存为python文件,使用python直接执行可以查看结果,结果如下:
    在这里插入图片描述

    除法

    原理

      跟乘法类似,若分母为2的整数倍,则直接进行右移运算,但若分母不是2的整数倍,则需要对分母进行分解。不过由于除法不能直接分解分母,需要将分母作为独立项进行拆分,除法位运算替换的基本原理,分三步

    1. 分子分母分离:BA=B1A\frac{B}{A} =B * \frac{1}{A}
    2. 分母算术分解: 1A=12n\frac{1}{A} =\sum\frac{1}{2^n}
    3. 位移替换乘法 :B2n=B&gt;&gt;n\frac{B}{2 ^ n} = B &gt;&gt; n

    十进制分解

      由于第二步的分母算术分解不容易,即不容易找到精确解,因此分数分解为12\frac{1}{2}的整数倍的和比较麻烦,而且若需要较高精度则需要更高阶的倍数,即其中的n要很大,以10为例:

    116+132+1256+1512=0.09960.1=110\frac{1}{16} + \frac{1}{32} + \frac{1}{256} + \frac{1}{512} = 0.0996 \approx0.1=\frac{1}{10}

      若在有限位内可以找到精确解,即灯饰两边刚好相等,而不是约等于,则可以进行分解运算,但是这样多运算也许并不比直接除法更快,因此如果除法的分母不是2的整数倍,而且并没有确定的分解方式,可以考虑直接使用除法。

    110116+132+1256+1512+14096=124+125+128+129+1212\frac{1}{10} \approx \frac{1}{16} + \frac{1}{32} + \frac{1}{256} + \frac{1}{512} + \frac{1}{4096} = \frac{1}{2^4} + \frac{1}{2^5} + \frac{1}{2^8} + \frac{1}{2^9} + \frac{1}{2^{12}}

    程序示例

    a = 543
    m10 = 10 
    
    # 1/10 ~= 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 
    #       = 1/2^4 + 1/2^5 + 1/2^8 + 1/2^9 + 1/2^12
    am10_chu0 = int(a / m10)
    am10_chu1 = (a >> 4) + (a >> 5) + (a >> 8) + (a >> 9) + (a >> 12)
    print ("除以10:",am10_chu0,"  ",am10_chu1)
    

    运算结果

      将源码保存为python文件,使用python直接执行可以查看结果,结果如下:
    在这里插入图片描述

    展开全文
  • 引言除法器在FPGA里怎么实现呢?当然不是让用“/”和“%”实现。在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且...

    引言

    除法器在FPGA里怎么实现呢?当然不是让用“/”和“%”实现。

    在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。即使可以综合,也需要比较多的资源。对于这种情况,一般使用相应的算法来实现除法,分为两类,基于减法操作和基于乘法操作的算法。

    2.1 实现算法

    基于减法的除法器的算法:

    对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32位为a的temp_a。把b转换成高32位为b,低32位为0的temp_b。在每个周期开始时,先将temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行。上面的移位、比较和减法(视具体情况而定)要执行32次,执行结束后temp_a的高32位即为余数,低32位即为商。

    2.2 verilog HDL代码

    /*

    * module:div_rill

    * file name:div_rill.v

    * syn:yes

    * author:network

    * modify:rill

    * date:2012-09-07

    */

    module div_rill

    (

    input[31:0] a,

    input[31:0] b,

    output reg [31:0] yshang,

    output reg [31:0] yyushu

    );

    reg[31:0] tempa;

    reg[31:0] tempb;

    reg[63:0] temp_a;

    reg[63:0] temp_b;

    integer i;

    always @(a or b)

    begin

    tempa <= a;

    tempb <= b;

    end

    always @(tempa or tempb)

    begin

    temp_a = {32'h00000000,tempa};

    temp_b = {tempb,32'h00000000};

    for(i = 0;i < 32;i = i + 1)

    begin

    temp_a = {temp_a[62:0],1'b0};

    if(temp_a[63:32] >= tempb)

    temp_a = temp_a - temp_b + 1'b1;

    else

    temp_a = temp_a;

    end

    yshang <= temp_a[31:0];

    yyushu <= temp_a[63:32];

    end

    endmodule

    /*************** EOF ******************/

    2.3 testbench代码

    /*

    * module:div_rill_tb

    * file name:div_rill_tb.v

    * syn:no

    * author:rill

    * date:2012-09-07

    */

    `timescale 1ns/1ns

    module div_rill_tb;

    reg [31:0] a;

    reg [31:0] b;

    wire [31:0] yshang;

    wire [31:0] yyushu;

    initial

    begin

    #10 a = $random()%10000;

    b = $random()%1000;

    #100 a = $random()%1000;

    b = $random()%100;

    #100 a = $random()%100;

    b = $random()%10;

    #1000 $stop;

    end

    div_rill DIV_RILL

    (

    .a (a),

    .b (b),

    .yshang (yshang),

    .yyushu (yyushu)

    );

    endmodule

    /******** EOF ******************/

    2.4 仿真结果

    2.5 改进

    1,将组合逻辑改成时序逻辑,用32个clk实现计算。

    2,计算位宽可以配置,具有扩展性。

    附录:算法推倒(非原创):

    假设4bit的两数相除 a/b,商和余数最多只有4位 (假设1101/0010也就是13除以2得6余1)

    我们先自己做二进制除法,则首先看a的MSB,若比除数小则看前两位,大则减除数,然后看余数,以此类推直到最后看到LSB;而上述算法道理一样,a左移进前四位目的就在于从a本身的MSB开始看起,移4次则是看到LSB为止,期间若比除数大,则减去除数,注意减完以后正是此时所剩的余数。而商呢则加到了这个数的末尾,因为只要比除数大,商就是1,而商0则是直接左移了,因为会自动补0。这里比较巧因为商可以随此时的a继续左移,然后新的商会继续加到末尾。经过比对会发现移4位后左右两边分别就是余数和商。

    画个简单的图:

    展开全文
  • 引言除法器在FPGA里怎么实现呢?当然不是让用“/”和“%”实现。在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且...

    引言

    除法器在FPGA里怎么实现呢?当然不是让用“/”和“%”实现。

    在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。即使可以综合,也需要比较多的资源。对于这种情况,一般使用相应的算法来实现除法,分为两类,基于减法操作和基于乘法操作的算法。

    2.1 实现算法

    基于减法的除法器的算法:

    对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32位为a的temp_a。把b转换成高32位为b,低32位为0的temp_b。在每个周期开始时,先将temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行。上面的移位、比较和减法(视具体情况而定)要执行32次,执行结束后temp_a的高32位即为余数,低32位即为商。

    2.2 verilog HDL代码

    /*

    * module:div_rill

    * file name:div_rill.v

    * syn:yes

    * author:network

    * modify:rill

    * date:2012-09-07

    */

    module div_rill

    (

    input[31:0] a,

    input[31:0] b,

    output reg [31:0] yshang,

    output reg [31:0] yyushu

    );

    reg[31:0] tempa;

    reg[31:0] tempb;

    reg[63:0] temp_a;

    reg[63:0] temp_b;

    integer i;

    always @(a or b)

    begin

    tempa <= a;

    tempb <= b;

    end

    always @(tempa or tempb)

    begin

    temp_a = {32'h00000000,tempa};

    temp_b = {tempb,32'h00000000};

    for(i = 0;i < 32;i = i + 1)

    begin

    temp_a = {temp_a[62:0],1'b0};

    if(temp_a[63:32] >= tempb)

    temp_a = temp_a - temp_b + 1'b1;

    else

    temp_a = temp_a;

    end

    yshang <= temp_a[31:0];

    yyushu <= temp_a[63:32];

    end

    endmodule

    /*************** EOF ******************/

    2.3 testbench代码

    /*

    * module:div_rill_tb

    * file name:div_rill_tb.v

    * syn:no

    * author:rill

    * date:2012-09-07

    */

    `timescale 1ns/1ns

    module div_rill_tb;

    reg [31:0] a;

    reg [31:0] b;

    wire [31:0] yshang;

    wire [31:0] yyushu;

    initial

    begin

    #10 a = $random()%10000;

    b = $random()%1000;

    #100 a = $random()%1000;

    b = $random()%100;

    #100 a = $random()%100;

    b = $random()%10;

    #1000 $stop;

    end

    div_rill DIV_RILL

    (

    .a (a),

    .b (b),

    .yshang (yshang),

    .yyushu (yyushu)

    );

    endmodule

    /******** EOF ******************/

    2.4 仿真结果

    2.5 改进

    1,将组合逻辑改成时序逻辑,用32个clk实现计算。

    2,计算位宽可以配置,具有扩展性。

    附录:算法推倒(非原创):

    假设4bit的两数相除 a/b,商和余数最多只有4位 (假设1101/0010也就是13除以2得6余1)

    我们先自己做二进制除法,则首先看a的MSB,若比除数小则看前两位,大则减除数,然后看余数,以此类推直到最后看到LSB;而上述算法道理一样,a左移进前四位目的就在于从a本身的MSB开始看起,移4次则是看到LSB为止,期间若比除数大,则减去除数,注意减完以后正是此时所剩的余数。而商呢则加到了这个数的末尾,因为只要比除数大,商就是1,而商0则是直接左移了,因为会自动补0。这里比较巧因为商可以随此时的a继续左移,然后新的商会继续加到末尾。经过比对会发现移4位后左右两边分别就是余数和商。

    画个简单的图:

    展开全文
  • 为什么二进制除法可以转换成移位运算呢? 如: a=5; a=a*9; 可以转换成a=(a a=a*7 可以转换成a=(a a=a/12; 可以转换成 a=(a>>4)-(a 因为乘除和减法都能转换成移位和加法运算,所以cpu中只需要一个...
  • 在许多古老的微处理上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).简单来说,按位运算就把数字转换为机器语言...
  • 利用逻辑门电路构造二进制加法

    万次阅读 2014-12-31 10:53:35
    计算机所做的计算处理只有加法,有了加法就可以用加法计算除法,乘法,减法。而计算机所处理的数据也只是二进制数也就是0和1。下面简单阐述二进制加法机的构造原理,这是cpu计算单元的基本计算原理。 加法计算实际上...
  • 用硬件的方法来实现除法的研究很多,如利用微处理实现快速乘除法运算,FPGA实现二进制除法运算,模拟除法等;而通过软件实现的除法算法,可以大大提高器件的工作频率和设计的灵活性,可以从总体上提高设计...
  • 从零开始构造一台二进制加法

    千次阅读 2018-04-26 11:26:46
    如果我们可以造出加法,就可以利用加法来实现减法、乘法和除法。 事实上,构造加法并不是让你去电子市场,购买零件,像小时候玩乐高式的,在房间中实际搭建出什么。相反的,可以在纸上画出一个加法的逻辑结构...
  • 用硬件的方法来实现除法的研究很多,如利用微处理实现快速乘除法运算,FPGA实现二进制除法运算,模拟除法等;而通过软件实现的除法算法,可以大大提高器件的工作频率和设计的灵活性,可以从总体上提高设计...
  • 计算机在计算乘法、除法、以及求余运算时都是利用二进制的加法来实现的,也就是计算机中最繁忙的累加(包括减法运算也是将被减数转换为补码的形式再利用加法的法则运算的)。我们先来说乘法: 乘法: 先来个例子...
  • vhdl 除法器

    2011-10-12 21:27:48
    技术要点是通过两位二进制数加两位二进制数的加法和两位二进制数加一位二进制数的加法与与门和非门连接而成。它的运算速度几乎与同样位数的加法运算速度相同,而且使用的设备量也很少。在使用特殊除法的场合...
  •   计算机中的最底层的加法和乘法都是基于二进制运算特性设计而成,并且乘法器运算开销大。如果使用2的幂次方数据,乘除法可以用对应的位移操作代替,比如*256 = <<8,/64 = >> 4。 2. 学会用&...
  • 用硬件的方法来实现除法的研究很多,如利用微处理实现快速乘除法运算,FPGA实现二进制除法运算,模拟除法等;而通过软件实现的除法算法,可以大大提高器件的工作频率和设计的灵活性,可以从总体上提高设计...
  • 这里用基本的逻辑门来搭建一个8位的二进制加法。我们知道两个1位的比特相加,结果很简单。如下图所示 其中低位叫做加法位,高位叫做进位位。我们将加法位和进位位分开表示,如下图 仔细观察,进位位运算(上...
  • 在项目设计中,经常需要显示一些数值,...对于Verilog来说它的标准是支持除法和取余运算的,综合也会有IP可以进行除法运算。但是这样未免会耗费太多资源,使用移位加3算法就可以实现二进制到BCD码之间的转换。 ...
  • 计算机中的数据表示,熟悉包括定点数、浮点数、字符、十进制数的表示方法 ;...原、补码乘法和除法运算; 浮点运算方法和浮点数的规格化及其逻辑结构; 运算器的基本结构和设计方法,解已知芯片功能。
  • 2.1数据与文字的表示2.2定点加法、减法运算2.3定点乘法运算2.4定点除法运算2.5定点运算器的组成2.6浮点运算与浮点运算器 2.1数据与文字的表示 2.1.1数据格式 (不同进制转换) (定点数 浮点数)点击查看 2.1.2数...
  • 定点原码一位除法(余数恢复法)的原理是根据人工进行二进制除法的规则:判断被除数与除数的大小,若被除数小则商上0,并在余数最低位补0,再用余数和右移一位的除数比,若够除则商上1,否则商上0。然后继续重复...
  • 定点除法运算有两种不同的实现方法,一种是恢复余数法,即在运算过程中,必须先算减法,若余数为正,才知道够减,若余数为负,则知道不够减,不够减时必须恢复原来的余数,以便再继续往下运算。另一种是不恢复余数法...
  • 文章目录数据信息的表示数值数据的表示非数值数据的表示字符与字符串的表示汉字的编码方法数据信息的校验奇偶校验简单奇偶校验交叉奇偶校验定点运算和定点运算器定点加、减法运算溢出判断定点乘、除法运算逻辑运算...
  • 2.4 定点除法运算 2.5 定点运算器的组成 2.6 浮点运算方法和浮点运算器 2.0 数据的类型 按数制分: 十进制:在微机中直接运算困难; 二进制:占存储空间少,硬件上易于实现,易于运算; 十六进制:方便观察和使用; ...
  • 学到个好玩的,用位运算简单地实现十进制转二进制! 这是做codility第一题的时候,嫌连除法太麻烦(其实是我太菜写不对),从一位博主那里学的,感觉挺妙,利用了电脑本身只认识机器数的特性;用位运算,快且代码短; 代码如下...
  • 搜集汇总:计算机中乘除法的本质

    千次阅读 2013-03-26 13:13:57
    计算机中如何用加法算乘法和除法运算乘数、被乘数都要先转化为二进制二进制的乘法远比十进制简单,比如乘数是1011,只需将将被乘数分别左移3位、1位,移动后补入0,并将这三个数(被乘数左移3位的、被乘数左移1位...
  • 一位十进制加法运算1. 8421码加法运算 8421码的加法规则...1.一位8421码加法 校正函数=C4’+S4’S3’+S4’S2’ 向上一位的进位C4=校正函数 一位8421码加法定点乘法运算一般来讲,做乘除法运算,用原码比用补码简...
  • 在许多古老的微处理上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).简单来说,按位运算就把数字转换为机器语言...
  •  算术逻辑单元(英语:Arithmetic Logic Unit, ALU)是中央处理的执行单元,是所有中央处理的核心组成部分,由与门和或门构成的算数逻辑单元,主要功能是进行二进制的算术运算,如加减乘(不包括整数除法)。...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 223
精华内容 89
关键字:

二进制除法运算器