FPGA浮点数的定点化以及浮点数和十进制数的转换

图1
在这里插入图片描述
转换成十进制的时候,浮点数的阶码需要先减去127;

首先明确输入的浮点数是什么格式的:其次明白要输出的定点数又是怎样的,最后两者之间的转换也就明了了:
输入的浮点数是:f[31:0]表示一个单精度32位浮点数,f[31]是符号位,其为‘0’表示正数、为‘1’表示负数;f[30:23]这8位为指数位,为了能表示负指数,将在实际指数的基础上加上127得到的结果存入f[30:23],如上图1所示;f[22:0]表示小数位(尾数),类似科学计数法,不过采用了省略整数位(2进制的科学计数法整数位必定是1)1。那么这个浮点数要转换成定点数,就需要先判断指数位与127的关系,小于127,则说明该指数位是正数,那么转化成定点数的话就需要将{8’d1,float_in[22:0]}右移127-float_in[30:23]位,否则左移float_in[30:23]-127位。
如前面的浮点数转10进制例子,1.10010010000000000000000,阶码算出为100,前面的“1”隐含而来。它是通过{1,float_in[22:0]}左移4位即1.10010010000000000000000左移4位变成11001.0010000000000000000,即11001.001
在这里插入图片描述

在这里插入图片描述

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、付费专栏及课程。

余额充值