首页 > 其他分享 >除数为常数的除法实现

除数为常数的除法实现

时间:2023-03-04 17:35:11浏览次数:33  
标签:整数 取出 除法 部分 常数 除数 quotient

除数为常数的除法实现,当然除数为变量的方式是兼容常数的运算,只是针对常数运算,通常也有几种方法,供大家参考。
方法一:  把除数转化为小数,采用乘法运算,比如:
   a[15:0] / 8'd24;
   十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又 得到一个积,再将积的整数部分取出,如此进行,直到积中的整数部分为零,或者整数部分为1,此时0或1为二进制的最后一位。或者达到所要求的精度为止。
  然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。 
  例如:0.7=(0.1 0110 0110...)B
  0.7*2=1.4========取出整数部分1
  0.4*2=0.8========取出整数部分0
  0.8*2=1.6========取出整数部分1
  0.6*2=1.2========取出整数部分1
  0.2*2=0.4========取出整数部分0 
  0.4*2=0.8========取出整数部分0
  0.8*2=1.6========取出整数部分1
  0.6*2=1.2========取出整数部分1
  0.2*2=0.4========取出整数部分0

     1/24 = 0.04167 = 00001010
     0.04167*2 = 0.08334  ========取出整数部分0
     0.08334*2 = 0.16698  ========取出整数部分0
     0.16698*2 = 0.33336  ========取出整数部分0
     0.33336*2 = 0.66672  ========取出整数部分0
     0.66672*2 = 1.33344  ========取出整数部分1
     0.33344*2 = 0.66688  ========取出整数部分0
     0.66688*2 = 1.33376  ========取出整数部分1
     0.33376*2 = 0.66752  ========取出整数部分0
   
     a/8'd24 = (a * (00001010)) >> 8

方法二: 现在DC综合工具对于/ 在常数运算时,是可以识别,并且优化效果与方法一相当,所以可以采用
quotient = a/B的方式进行常数除法运算。

方法三: 对于被除数除数范围比较小的情况,可以采用查找表的方式,比如被除数为a[2:0] 除数为3,则通过查找表方式完成,Verilog示例如下:

            always @(*) begin
                  case(a)
                     3'h0          :   quotient = 3'h0;
                     3'h1          :   quotient = 3'h0;
                     3'h2          :   quotient = 3'h0;
                     3'h3          :   quotient = 3'h1;
                     3'h4          :   quotient = 3'h1;
                     3'h5          :   quotient = 3'h1;
                     3'h6          :   quotient = 3'h1;
                     3'h7          :   quotient = 3'h1;
                     default      :    quotient = 3'h0;
                  endcase
            end

上述二进制移位除法,最大的问题就是运算的Cycle会随被除数位宽增加而增加,因此在除法运算延时要求较高场景,可以使用DW的除法器,DW的除法器包括支持流水插拍的版本,可以帮助提升工作时钟频率。

几种除法器在统一工艺,按照500MHz目标综合,52bits/25bits,数据对比:
      除法器                         面积(um2)             最大Slack           工作时钟周期
  二级制移位除法                    1000                        -0.4                       53
     DW_div                          43692                      -15.42                    2
     DW_div_pipe                  50008                      -4.386                    4
     DW_div_seq                   11980                      -1.0348                  10  

综上,大家根据自己实际需求进行除法器实现策略。

标签:整数,取出,除法,部分,常数,除数,quotient
From: https://www.cnblogs.com/chunk998/p/17178668.html

相关文章

  • 除法的实现2
    除法的实现,相对于加减乘要麻烦一些。当然目前除法主要支持无符号数除法,我们分为两类进行介绍,一类是被除数是变量,即a/b这种,一类是被除数是常量,即a/B这种。1.被除数常量,方法......
  • 除法的实现
    对于除法的实现,相对于加减乘要麻烦一些。当然目前除法主要支持无符号数除法,我们分为两类进行介绍,一类是被除数是变量,即a/b这种,一类是被除数是常量,即a/B这种。1.被除数常量......
  • 算法基础1.3.4高精度除法
    前言先看高精度加法的文章,如果没有看,我把高精度加法文章中的总结前言放到这里该文章探讨的高精度代指C++中极大整数的计算,不是浮点数(y总说那个少见,不讲)。这个问题只在C......
  • 给闺女写了一个99乘法除法练习题
    #99乘法练习importrandomimporttimenum=0start=time.time()forxinrange(10):a=random.randint(1,9)b=random.randint(1,9)print('请小余同......
  • pat乙级 1017 A除以B 模拟除法
    #include<stdio.h>#defineMAX_A1000intA[MAX_A];intB;/*除数*/intnum;/*A被除数有多少位*/voidread_AB();voiddivision_print();/*************......
  • 【Azure 存储服务】使用REST API操作Azure Storage Table,删除数据(Delete Entity)
    问题描述使用AzureStorageTable的RESTAPI,实现根据过滤条件删除满足条件的数据,调用方法为  DeleteEntity(AzureStorage) 问题实现第一步:通过AzureStroage门......
  • C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)
    1、问题的提出:电池生产中,遇到一批电池的测量结果数据:电压值电池个数电压值电池个数电压值电池个数电压值电池个数0.0561 4.091 4.14617 4.174134340.3211 4.0941 4.147......
  • SQL server 的除法运算
     select300/(301)*100查询结果:0,由于数值是INT类型,无法得到小数点的结果。怎么整?分母加0.0select300/(301+0.0)*100查询结果:99.667700......
  • DML_添加数据;DML_修改,删除数据;DDL_修改,删除数据库表
    ​ 注意事项int 宽度是显示宽度,如果超过,可以自动增大宽度int底层都是4个字节时间的方式多样 '1256-12-23' "1256/12/23" "1256.12.23"字符串不区分单引号和......
  • DML_添加数据;DML_修改,删除数据;DDL_修改,删除数据库表
    ​ 注意事项int 宽度是显示宽度,如果超过,可以自动增大宽度int底层都是4个字节时间的方式多样 '1256-12-23' "1256/12/23" "1256.12.23"字符串不区分单引号和......