FPGA小数定点化

FPGA技术交流群:838607138

在算法中经常会出现小数,而在FPGA上处理小数是一件极其耗费资源的操作,甚至可以说在硬件平台上0 1这种表示方式天生就对小数不友好。那么就衍生出来了不同的表示方法,主要分为两种:

  • 定点数
  • 浮点数
    浮点数有著名的IEEE754标准,他将数分为了指数,尾数和符号位。这个就不多说了,有兴趣可以查查。今天的重点是定点数的表示。

定点数就是小数点固定的数,比如采用16bit的数据,其中低8位是小数,高8位是整数。这样我们就把小数点固定到8位上了。如下图所示15到8bit是整数位,7到0bit是小数位。(中间的橙色方块表示小数点,因为我们固定了小数点的位置,所以不需要单独的1bit来表示小数点,因此下面画的图虽然是17个格子,但仍然是16bit),为了下面描述方便,我们采用P-Q这样一个表示法,P代表整数位数,Q表示小数位数,所以下面这个示例就记作8-8。
在这里插入图片描述
那么知道怎么表示定点数了,我们来介绍一下精度问题。这个精度就等于1/2Q,Q代表小数的位数。以上面这个Q是8为例,精度就是1/28=0.00390625。

那么2.5用8-8这样表示为00000010_10000000,其中00000010为整数2,10000000为小数0.5 。0.5/0.00390625=128,128表示为2进制的10000000。
知道了怎么表示定点数,下步就来介绍一下运算规则,以a,b代表浮点数,x,y代表相应的定点数,并且小数点为n位,即Q=n。

  • a + b = x + y

  • a - b = x - y

  • a * b = x * y /(2^n)

  • a / b = x / y * (2^n)

加减好理解,以乘法为例说明为什么需要有2^n参与运算。为了表示方便就以10进制为例,2.5*3.1=7.75,也就是原来都是1位小数,相乘后变成两位小数了,但是由于我们的小数点位数是固定的,所以需要移动小数点变成7.7或者7.8,取决于round的实现方法。

计算方法也有了,这个用verilog实现也不困难,主要是需要细心,不要把在进行饱和截位的时候弄错bit数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA 中,通常使用定点数进行数值计算,因为定点数可以更高效地实现。如果需要对浮点数进行计算,需要将浮点数转换为定点数。下面是一种简单的方法来将浮点数转换为定点数。 假设我们要将一个浮点数 x 转换为定点数 Q,其中 Q 有 n 位整数部分和 m 位小数部分,总共有 n+m 位。则可以按照以下步骤进行转换: 1. 将浮点数 x 乘以 2^(m),得到一个整数 y。 2. 将整数 y 左移 n 位,得到一个 n+m 位的整数 z。 3. 将整数 z 再除以 2^(m),得到定点数 Q。 这个方法的原理是将浮点数的小数部分转换为整数部分,然后将整数部分左移 n 位,再将小数部分除以 2^(m),得到定点数的小数部分。 在 Verilog 中,可以使用 shift 和 divide 操作来实现这个方法。以下是一个示例代码: ```verilog module float2fix(input [31:0] x, output reg [15:0] Q); integer y, z; always @* begin y = x * 65536; // 2^16 = 65536 z = y << 16; // shift left by 16 bits Q = z >> 16; // shift right by 16 bits end endmodule ``` 这个例子将浮点数 x 乘以 2^16,然后将整数部分左移 16 位,最后将结果右移 16 位得到定点数 Q。这个例子中,定点数 Q 有 16 位整数部分和 16 位小数部分。 需要注意的是,这个方法只是一个简单的转换方法,可能会存在精度损失。如果需要更高精度的定点数转换,可以使用更复杂的算法,例如 CORDIC 算法或者牛顿迭代法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值