Verilog中小数转十六进制转换原理及十进制显示问题咨询
转换原理说明
你看到的十六进制和小数的对应关系,是数字电路中常用的定点数表示法,Verilog本身没有内置小数类型,做CORDIC这类算法时通常会把小数映射为整数来做定点运算,避免浮点运算的资源消耗。
这里用的是Q31格式的定点数:32位有符号数的最高位是符号位,剩下31位全部是小数位,换算规则是:
- 小数转定点整数:
定点值 = 小数 * 2^31 - 定点整数转小数:
小数 = 定点值 / 2^31
你可以自行验证:0.6072529350088814乘以231(231等于2147483648),刚好就是你输出的整数652032874,和你代码打印的结果完全一致,只是你直接打印整数没有做除法转换,所以看不到小数结果。
代码调整方案
你可以在$display输出时做转换,把定点整数转为real类型再做除法,就能打印出对应小数,修改后的代码如下:
`timescale 1ns / 1ps module top( ); wire signed[31:0] init_value= 32'h26dd3b6a; // 对应Q31格式的0.6072529350088814 always@(*) begin // 先转成real类型再除以2^31,得到实际小数 $display("The init_value= %0.15f", $itor(init_value) / 2147483648.0); end endmodule
运行后输出就会是你预期的0.607252935008881左右的结果,如果你不需要这么高的精度,把格式符换成%f即可,默认会保留6位小数。
补充说明
如果后续做CORDIC全流程运算,所有中间值的运算都要统一使用相同的Q格式,避免位数错位导致结果错误。
内容的提问来源于stack exchange,提问作者sarika
相关产品推荐
相关产品推荐

