0 引言

在四则运算中,除法最为复杂,在时间上和空间上的开销都比较大。因此很多算法都极力避免进行除法运算,或者采用其他的方案来代替除法运算。但是,除法运算作为基本的四则运算之一,在很多情况下依旧是不可避免的。近年来,陆续出现了很多种除法实现算法,如恢复余数算法(Restoring)、不恢复余数算法(Non-Restoring)、SRT算法、倒数算法和牛顿迭代法等。但是大部分算法都是基于整数除法或者浮点小数除法的,并不太适合进行定点小数计算。下面来简单地介绍一下几种常见除法算法、整数除法与定点小数除法的差异和一种简单的定点小数除法实现。

1 常见的除法算法

恢复余数算法

恢复余数算法是一种基于移位和减法的算法,比较适合FPGA或ASIC实现。恢复余数算法不能直接进行有符号数的补码运算,而只能采用原码进行运算。基于恢复余数算法的无符号除法器具有如下特征:

1)       各参数的字长:被除数为2nbit,除数,商和余数均为nbit;

2)       被除数的高nbit必须小于除数;

3)       算法主要迭代n次。

该算法的基本运算单元如下图所示:

恢复余数算法是一种整数的除法,在计算商的同时还能获得余数,是一种无误差的除法实现方式。

不恢复余数算法

恢复余数算法中的“恢复”指的是,如果之前的计算中余数出现了负值,要将其恢复到前一次的结果,而不恢复余数算法则不进行此操作。不恢复预算算法除了需要移位和减法运算,还需要加法运算,因此其又被称为加减交替算法。

该算法的基本运算单元如下图所示:

不恢复余数算法也不能直接进行有符号数的补码运算,而只能采用原码进行运算。商的符号位可以通过除数和被除数的符号位的异或运算获得。

SRT算法

SRT除法器起源于20世纪50年代,其名称是由3个算法提出者名字的首字母组成的。其一般有基2和基4两种,更高的基可以由低的组合来实现。

SRT算法只用到加法、移位运算,加上低精度的比较或查找表就可以实现。低精度的比较有很大优点,这意味只要少量位数的运算来产生部分余数的高位,参与商选择;完整的部分余数的产生可以与之并行操作。由于SRT算法可以实现高精度的运算,因此被广泛应用于浮点除法运算中,AMD和Intel的CPU设计中也采用了SRT算法来设计浮点除法器。

倒数算法

倒数算法是一种局限性比较大的算法,常用于处理除数位宽比较小的除法运算,且一般用于整数除法中。该算法的基本思想是,把除数的倒数的所有可能值都放入查找表中,然后将被除数与相应的除数的倒数相乘。

由于该算法不需要迭代操作,相对于其他的算法,其迟滞(Latency)很小。借助硬件乘法器,基于倒数算法的除法器同样可以运行在很高的频率上。

牛顿迭代法

牛顿迭代法又被称为Newton-Raphson算法,其基本思想是将非线性方程线性化,以线性方程的解逼近非线性方程的解。采用牛顿迭代法进行除法运算,实际上是先使用牛顿迭代法求得除数的倒数值,然后在和被除数相乘。

牛顿迭代法有两个重要影响因素:初始值(又称为猜测值)和迭代次数。一个合适的初始值可以减少迭代次数,甚至只进行一到两次迭代操作,却可以实现相同的运算精度。然而这样的初始值却是很难寻找的,所以为了保证运算的精度,一般需要4~6次的迭代操作,这样的开销还是很大的。

注:后续的文章中会介绍一种基于牛顿迭代法的平方根倒数运算,John Carmack提出过一个神奇的猜测值(Magic Number)。采用该猜测值,只需要进行一到两次迭代操作,便可以达到较高的计算精度。

2 整数除法与小数除法的差异

和乘法不同的是,定点小数的除法并不能直接使用整数除法的IP,主要原因有以下两个方面:

1)       整数除法的输出为商和余数,小数除法的输出为小数表示的商;

2)       整数除法通常是一种无误差的运算,小数除法中结果存在一定的误差;

Lattice提供了一种基于不恢复余数算法的整除除法器IP,并且支持可配置Latency的功能。该除法器的IO框图如下:

虽然定点小数仍然采用的整数的表示方式,但是并不能直接使用整除除法器的IP。如果采用该IP计算定点小数除法,需要最输出的商(Quotient)和余数(Remainder)做进一步处理,已得到小数形式的商。而这些处理会增加额外的时间开销和空间开销。

上面介绍的几种除法算法中,恢复余数算法和不恢复余数算法主要应用于整数除法,而SRT算法和牛顿迭代法主要用于小数除法。倒数法和牛顿迭代法还需要进行乘法运算,在采用FPGA实现时,最好使用硬件乘法器来提高性能。

3 一种简单的定点小数除法实现

定点小数可以采用SRT算法或者牛顿迭代算法,但是这两种算法逻辑都比较复杂,采用FPGA实现时,需要很多的资源。下面介绍一种简单的定点小数除法算法,算法只进行基本的移位和减法操作。该算法的思想基本与恢复余数算法的思想一致,只支持有符号数的原码操作:

1)       首先将nbit的除数扩展为2nbit,被除数保持不变仍然为nbit;

2)       如果被除数大于等于除数,则将被除数减去除数的值重新赋给被除数,并将对应的商的位置置1;

3)       将除数向右移一位;

4)       重复2)和3),直至达到迭代次数w+wf-2次。

其中,w表示整个定点小数的位宽(除符号位外),wf表示的是小数部分的位宽。

虽然该算法耗费的资源相对较少,但是缺点也很显著——需要w+wf-2次迭代,即在时间是开销还是比较大的。如果设计中对精度的要求并不是非常高,可以适当地调整定点小数的位宽,在精度和时间开销上找到一个平衡点。

注:该算法的源码可以在开源网站OpenCore上下载到。

定点数的除法C语言,FPGA定点小数计算(二)——除法运算相关推荐

  1. FPGA定点小数计算(Verilog版)第七篇——平方根倒数运算(使用John Carmack方法)

    更多精彩内容,请微信搜索"FPGAer俱乐部"关注我们. 有一段时间没有写博客了,突然想起前一段时间挖的坑,所以决定今天来填一下--其实,这一篇原本打算写的是采用牛顿迭代法的平方根 ...

  2. 用C语言编写程序计算对角线的和,C语言入门级代码 计算二维数组主对角线上的元素之和...

    镇场诗:吾心为他人,此智不私藏.学术有小成,愿帮大家忙. // #include void main(){ int i=0,j=0; int a[4][4]={{1,2,3,4},{1,2,3,4}, ...

  3. verilog存小数_FPGA定点小数计算(Verilog版)第二篇——乘法运算

    发布一下这两天的成果,用Verilog实现的FPGA定点小数计算,一共有N篇,包括加法.乘法.除法.平方根.平方等--目前加法.乘法已完成调试,除法.平方根和平方等尚未完成--时间仓促,此次博文直接贴 ...

  4. 51 8位 单片机 定点数 除法 c语言,单片机C语言快速精度除法方案

    目前的51单片机在进行带小数点结果的除法一般可以采用浮点数计算的方式,但是浮点数计算有一个缺点就是非常耗时,在对时间要求严格的工况就不太适用. 笔者的工作室长期承接单片机.电路.机电液.工控.自动化. ...

  5. c语言整形如何正确使用除法,简单的C语言移位计算整形乘法和除法值

    最近一直都没写什么文章,随便写点最近看到的东西.首先要提一点,在SOC系统中,运算速度一般是移位>乘法>除法. 1.乘法. 最简单的A*B,用C语言for循环 for(int i=0;i ...

  6. C语言求x和y的乘积,计算方程式,求x,C语言中怎么计算x,y的值?

    导航:网站首页 > 计算方程式,求x,C语言中怎么计算x,y的值? 计算方程式,求x,C语言中怎么计算x,y的值? 匿名网友: (x-1)=0吧,写题也这么不仔细呀. 哈哈m/x=n/(x-1) ...

  7. FPGA:计算滑动求和----信号检测计算信号功率

    FPGA:计算滑动求和----信号检测计算信号功率 在进行简单信号检测过程中,需要计算信号的能量,这时候需要用到滑动求和的计算过程. 这里记录如何利用Verilog编写滑动求和过程. 思路:滑动求和的 ...

  8. R语言sd函数计算数值标准差实战(Standard Deviation)

    R语言sd函数计算数值标准差实战(Standard Deviation) 目录 R语言sd函数计算数值标准差实战(Standard Deviation) #基本语法 #sd

  9. R语言自定义函数计算dataframe每列中的缺失值NA的个数、缺失值问题及其填充示例

    R语言自定义函数计算dataframe每列中的缺失值NA的个数.缺失值问题及其填充示例 目录

最新文章

  1. 处有未经处理的异常:0xC0000005 : 读取位置 0x00000000 时发生访问冲突。
  2. C++ Primer 5th笔记(10)chapter10 泛型算法 :write
  3. modbus协议和串口服务器,Modbus RTU通信模式与Modbus ASCII通信模式的异同点
  4. Winform中使用NPOI实现Excel导入并赋值给DataTable
  5. python find函数 和index的区别_find方法和index方法的区别
  6. ORA-01502 state unusable错误成因和解决方法[转]
  7. 积温空间分布数据、气温分布数据、日照数据、降雨量分布、太阳辐射数据、地表径流数据、土地利用数据、npp数据、ndvi数据
  8. hive 日誌怎麼查看_Hive日志调试 | 学步园
  9. html5页面制作成品,dw网页设计成品代码
  10. nano命令,vi ed pico sed joe emacs jed ex
  11. android 改机型玩王者,抱歉,Xposed真的可以为所欲为——2.改为OV机型流畅玩耍高帧率王者农药...
  12. 得到条形码的校验位函数
  13. 【Java框架】CSFramework框架的应用——简易聊天室
  14. pentaho开源商业智能平台的搭建
  15. 缩放指数型线性单元(SELU)
  16. 13款入侵检测系统介绍(HIDS)
  17. fast路由器pppoe连接服务器无响应,迅捷路由器系统日志如何排除PPPOE拨号故障
  18. 【计算机网络】物理层 : 香农定理 ( 噪声 | 信噪比 | 香农定理 | “香农定理“公式 | “香农定理“ 计算示例 | “奈氏准则“ 与 “香农定理“ 对比 与 计算示例)★
  19. 梦泪的服务器是qq还是微信,梦泪发现微信区1奇特现象,赛季末分数远不如QQ区,看到1细节,懂了...
  20. 指令系统由计算机组成决定,《计算机组成原理》第5章指令系统.ppt

热门文章

  1. MapGIS CIM平台:构建数字孪生城市四维空间底座
  2. springboot项目中sql语句出错排除错误方法
  3. 互联网营销如何发展品牌形象设置跟踪功能
  4. [新书推荐]Autodesk地理信息系统解决方案——FDO、MapGuide、AutoCAD® Map 3D二次开发指南...
  5. 一般物品识别易语言代码
  6. 【面试题】火车运煤问题
  7. 通达信冲天短进指标公式源码+XG预警源码
  8. codevs 1506 传话 题解
  9. 亚马逊关键词上首页的方法有哪些?
  10. Android RelativeLayout布局