FPGA中常用到的计算转换

算法经过软件设计和调试之后,需要映射到FPGA中,由于软硬件的区别,大部分算法需要经过等效转换,变成硬件容易实现的方式,才能映射。这里记录一下学习到的知识,以后忘记了也可以看看。

1,计算机中的数

1.1 定点数

     计算机中的数分为定点数和浮点数。定点数一般用二进制补码表示,对于一个二进制补码表示的数,如果其小数点位置固定,则为定点数;特殊的,当小数点后面为0位时,表示一个整数;当小数点前只有一位符号位时,表示纯小数,归一化的小数一般也也是这个形式任意一个数N的补码可以用2^n + N表示,即模加上它本身。 定点数通常用Qm.n的形式表示,m表示整数部分有多少个二进制位(第一位为符号位),n表示小数部分有多少个二进制位,其值用如下公式表示,精度1/2^n,范围 -2^(m-1)~~~~~(2^(m+n-1) - 1)/(2^n),模为2^m

    上列式子可以计算任意补码表示的定点数Qm.n的十进制值,那给定一个十进制数,如何转换为二进制形式的定点数呢?上列式子可以进一步化简,如下图所示。

首先需要确定Qm.n中的m和n的位数。例如给定一个数-12.367,那么选定精度为0.001时,能较准确的表示这个数,即n等于10(精度为0.000977);然后根据范围,选定m等于5;即用Q5.10表示这样一个数,范围在-16~~15.999。然后在计算具体的m和n。先用-12.367乘以1024(2的n次方),等于-12663.808,取其整数部分,即为-12664,然后计算其补码(注意这里模也应该乘1024)32768-12664 =20104(100111010001000),即最后的定点数为100111010001000,转换回去为-12.3671875,较精确的表示了给定的数。

1.1.1 定点数加法

      定点数加法比较简单,只需要将符号位扩展一位(如果两个数都定义为signed类型的数,那么综合器会自动按符号位扩展;如果存在一个无符号数,那么综合器会按0扩展;因此,根据设计需要最好手动扩展),然后相加即可,小数点位置无需移动。例如两个Q4.4的数想加,0010_1000(2.5)与1000_1000(-7.5)。先将两个数进行符号位扩展,如00010_1000与11000_1000,然后执行二进制加法,即可得到最终数11011_0000(-5)。

1.1.2 定点数乘法

      定点数乘法推导比较复杂,具体可以搜索关键字“二进制补码乘法”或者“补码一位乘法”。在verilog中,如果被乘数和乘数都定义为signed,那么乘法按二进制补码进行;如果两个数中有一个没有定义为signed,则按无符号二进制乘法进行。这一点与加法很相似,所以我们在计算的时候一定要注意。

      另外,乘法运算会导致小数点增多,这时候考虑到存储资源的问题,我们有时候会截断数据。例如两个数011.100(3.5)

与110.110(-1.25),如下图所示,最终结果为1111011.101000(-4.375)。这时候截取可以从两方面入手,一是降低精度,将低位截断,如去掉最低3位,此例为000;二是从高位入手,截取掉符号位,这里需要先预估一下最终结果的范围,比如两个Q3.3的数相乘,完全可以用Q5.3的数表示,那么就可以把结果中的高符号位部分截掉,此例11,那么最终的数为11011.101。

1.2 浮点数

       浮点数即小数点浮动的数,通常用符号位(S)+指数e+无符号尾部数m表示,故浮点数是不存在补码形式的,其值可以用如下公式表示,E为指数e所占用的二进制位数,浮点数的最小分度为1/(2^(e-(2^(E-1) - 1))),绝对值最大数即为各字段值都为1。

      当一个数的绝对值小于某规定的数的最小值,计算机会将它作为0处理,称为下溢出;当一个数的绝对值大于某规定的数的最大值,计算机将无法表示,称为上溢出。

1.3 浮点数与定点数转化

      浮点数转定点数。以float型数据为例,1符号位+8指数位+23位尾数位。具体思路是先将尾数最高位加一位1,构成24尾数,小数点就在这个1后面。然后判断指数e与127的大小,如果e更大,则尾数左移,偏移量为e-127;如果e更小,则尾数右移,偏移量为127-e。最后将符号位加上即可,小数点的位置在23+(127-e)位的前面。但这样得到的是定点数表示的原码,还需要转换为补码。

      定点数转浮点数。还是以转float为例。对于一个Qm.n的数,先将其转换为原码。最高位为符号位,即Q[m+n-1]为符号位。然后确定指数部分,从符号位后开始,寻找第一个1,记录位置为Q[m+n-x],那么Q就需要向右移m-x位,即有-(m-x)=e-127,即e=127+x-m。最后尾数部分即为移位后的Q``[m+n-x-1:0],如果尾数不足23位,则在后面补0。

2,常用的转换

    十进制数转二进制数,整数部分,采用除2法,一直到商为0,然后倒着取余数;小数部分,采用乘2法,然后顺着取整数部分。

    定常数转换。即一个信号乘以或者除以一个常数,这种通常转换为移位和加法的形式,因为这是在fpga好实现的方式。如a*121=a*(2^7 - 2^2 - 2^1  - 1)。

又如a/25 = (a*2^10)/(25*2^10) = a*40.96*(2^-10) = a*(2^5 + 2^3 + 2^-1 + 2^-2 + 2^-3 + 2^-4 + 2^-6 + 2^-7)*(2^-10),具体精度根据设计需求而定,精度越高,消耗的资源也越高。

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值