定点数基础知识小记

  • 一、概述
  • 二、定点数的定义
  • 三、负数求补码的三种方法
  • 四、浮点转定点的一些方法:
  • 五、说说浮点数


一、概述

在设计实现一套通信算法时,通常我们先用浮点数进行仿真,达到预期效果后将浮点数转换为定点数再次仿真比对是否达到预期结果,最后根据定点数在FPGA或DSP上实现,可见定点数在实际算法仿真及实现上的重要性。
当然在一些雷达、医学成像等领域,可以直接用浮点数实现算法,将占用很多FPGA或DSP处理资源,处理时间也将大幅增加。
因此这里浮点数的大动态范围高精度、实现简单但占用很多资源,与定点数的动态范围及精度有限,实现复杂节约资源是一对矛盾,可以认识事物都是有优缺点及边界条件的。

二、定点数的定义

定点数是小数点固定地隐含在某一位置上的数据。我们可以将定点数分为整数(小数点在数据的最右边)、纯小数(小数点在数据的最左边)、带小数部分的定点数(通常的定点数)。

整数又分为无符号整数和有符号整数。无符号整数用原码表示,有符号的正数用原码表示,负数用补码表示。

N位的无符号数表示的范围为:

lua定点数 何谓定点数_浮点转定点


N位的有符号数表示的范围为:

lua定点数 何谓定点数_定点数_02


以8位的有符号为例,其表示的范围是[-128,127],用二进制数表示则为[8’b10000000,8’b11111111],其中0表示为8‘b00000000,因此8’b10000000表示为-128,而不是代表0,不能有两个代表0的数,因此8位的有符号范围是[-128,127],而不是[-127,127],这里需要特别注意。

三、负数求补码的三种方法

方法一:

lua定点数 何谓定点数_浮点转定点_03


方法二:

求出负数绝对值|X|的原码,然后取反加1(符号位不变)

方法三:

求出负数绝对值|X|的原码,从左到右逐位取反,直到遇到最后一个1为止,例如-7绝对值的二进制为4’b0111,从左边第一位0取反为1,再遇到第四位最后一个1停止,即为1001。注意这个算法。

四、浮点转定点的一些方法:

1、方法一:利用maltab中的HDL code将浮点算法模型转换为定点算法模型,并给出了各个变量的合理字长,此方法具有一定的局限性,要求浮点算法模型中的运算必须是HDL code所支持的数学运算。

2、方法二:将浮点小数通过归一化转换为整数在FPGA或DSP中使用。

lua定点数 何谓定点数_定点数_04


具体的matlab代码如下:

lua定点数 何谓定点数_浮点数_05


3、方法三:maltab与Xilinx合作的system generater 及 Xilinx Vivado HLS对定点数的支持。

4、方法四:通过maltab自主定标。

五、说说浮点数

浮点数由四部分组成:符号位(s)、尾数(m)、基数®和指数(e)组成,以基数为2为例,其表示的浮点数值为:

lua定点数 何谓定点数_lua定点数_06


再以基数10为例,其浮点数构成如下图:

lua定点数 何谓定点数_lua定点数_07


浮点数的加法与乘法运算过程如下:

浮点加法:

lua定点数 何谓定点数_浮点数_08


浮点乘法:

lua定点数 何谓定点数_浮点数_09