我正在尝试转换 IEEE single precision二进制格式数字转换为整数。我正在使用以下循环:
for(i=22;i>=0;i=i-1)
begin
a1=in1[i]*(2**(i-23));
end
a1=a1+1;
a1=a1*(2**(in1[30:23]-8'b01111111));
a1=((-1)**(in1[32]))*a1;
我需要在我的程序中再执行 7 次。我的问题是是否有一个库可以做到这一点,它接受 32 位输入并给出整数输出?如果是,我如何将该函数包含在我的程序中? 谢谢。
更新:上面的代码片段可以正常工作吗?
最佳答案
一种方法是:
- 以 64 位 double 格式重新打包操作数
- 使用
$bitstoreal
将值转换为实数 - 使用 native verilog float 学对实数进行运算
- 使用
$realtobits
将实数转换回位 - 将 64 位 double 格式转换回单精度格式。如果该值超出了可表示的范围,则需要进行剪裁(“离零太远”和“离零太近”两种情况都需要剪裁)。
如果您想使用问题中的策略将 float 转换为定点,请记住 Verilog 没有 native 定点支持。您无法将 2^(负指数)有意义地评估为整数,您只会得到零。要么重构算法,使指数始终为正,要么使用右移 (>>
),而不是乘以 2 的负幂。
关于integer - verilog IEEE 754 单精度到整数的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758543/