定点数的除法C语言,FPGA定点小数计算(二)——除法运算
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定点小数计算(二)——除法运算相关推荐
- FPGA定点小数计算(Verilog版)第七篇——平方根倒数运算(使用John Carmack方法)
更多精彩内容,请微信搜索"FPGAer俱乐部"关注我们. 有一段时间没有写博客了,突然想起前一段时间挖的坑,所以决定今天来填一下--其实,这一篇原本打算写的是采用牛顿迭代法的平方根 ...
- 用C语言编写程序计算对角线的和,C语言入门级代码 计算二维数组主对角线上的元素之和...
镇场诗:吾心为他人,此智不私藏.学术有小成,愿帮大家忙. // #include void main(){ int i=0,j=0; int a[4][4]={{1,2,3,4},{1,2,3,4}, ...
- verilog存小数_FPGA定点小数计算(Verilog版)第二篇——乘法运算
发布一下这两天的成果,用Verilog实现的FPGA定点小数计算,一共有N篇,包括加法.乘法.除法.平方根.平方等--目前加法.乘法已完成调试,除法.平方根和平方等尚未完成--时间仓促,此次博文直接贴 ...
- 51 8位 单片机 定点数 除法 c语言,单片机C语言快速精度除法方案
目前的51单片机在进行带小数点结果的除法一般可以采用浮点数计算的方式,但是浮点数计算有一个缺点就是非常耗时,在对时间要求严格的工况就不太适用. 笔者的工作室长期承接单片机.电路.机电液.工控.自动化. ...
- c语言整形如何正确使用除法,简单的C语言移位计算整形乘法和除法值
最近一直都没写什么文章,随便写点最近看到的东西.首先要提一点,在SOC系统中,运算速度一般是移位>乘法>除法. 1.乘法. 最简单的A*B,用C语言for循环 for(int i=0;i ...
- C语言求x和y的乘积,计算方程式,求x,C语言中怎么计算x,y的值?
导航:网站首页 > 计算方程式,求x,C语言中怎么计算x,y的值? 计算方程式,求x,C语言中怎么计算x,y的值? 匿名网友: (x-1)=0吧,写题也这么不仔细呀. 哈哈m/x=n/(x-1) ...
- FPGA:计算滑动求和----信号检测计算信号功率
FPGA:计算滑动求和----信号检测计算信号功率 在进行简单信号检测过程中,需要计算信号的能量,这时候需要用到滑动求和的计算过程. 这里记录如何利用Verilog编写滑动求和过程. 思路:滑动求和的 ...
- R语言sd函数计算数值标准差实战(Standard Deviation)
R语言sd函数计算数值标准差实战(Standard Deviation) 目录 R语言sd函数计算数值标准差实战(Standard Deviation) #基本语法 #sd
- R语言自定义函数计算dataframe每列中的缺失值NA的个数、缺失值问题及其填充示例
R语言自定义函数计算dataframe每列中的缺失值NA的个数.缺失值问题及其填充示例 目录
最新文章
- 处有未经处理的异常:0xC0000005 : 读取位置 0x00000000 时发生访问冲突。
- C++ Primer 5th笔记(10)chapter10 泛型算法 :write
- modbus协议和串口服务器,Modbus RTU通信模式与Modbus ASCII通信模式的异同点
- Winform中使用NPOI实现Excel导入并赋值给DataTable
- python find函数 和index的区别_find方法和index方法的区别
- ORA-01502 state unusable错误成因和解决方法[转]
- 积温空间分布数据、气温分布数据、日照数据、降雨量分布、太阳辐射数据、地表径流数据、土地利用数据、npp数据、ndvi数据
- hive 日誌怎麼查看_Hive日志调试 | 学步园
- html5页面制作成品,dw网页设计成品代码
- nano命令,vi ed pico sed joe emacs jed ex
- android 改机型玩王者,抱歉,Xposed真的可以为所欲为——2.改为OV机型流畅玩耍高帧率王者农药...
- 得到条形码的校验位函数
- 【Java框架】CSFramework框架的应用——简易聊天室
- pentaho开源商业智能平台的搭建
- 缩放指数型线性单元(SELU)
- 13款入侵检测系统介绍(HIDS)
- fast路由器pppoe连接服务器无响应,迅捷路由器系统日志如何排除PPPOE拨号故障
- 【计算机网络】物理层 : 香农定理 ( 噪声 | 信噪比 | 香农定理 | “香农定理“公式 | “香农定理“ 计算示例 | “奈氏准则“ 与 “香农定理“ 对比 与 计算示例)★
- 梦泪的服务器是qq还是微信,梦泪发现微信区1奇特现象,赛季末分数远不如QQ区,看到1细节,懂了...
- 指令系统由计算机组成决定,《计算机组成原理》第5章指令系统.ppt