FPGA中浮点数与定点数的转化原理与转化方法(并使用乘法器进行两个定点数的相乘)
基础知识
什么是浮点数与定点数
浮点数:小数点是浮动的,不是在一个固定的位置上的
定点数:小数点的位置是固定的
在FPGA内部只能处理定点数无法处理浮点数
当浮点数转换成定点数的时候要明确的知道小数有多少位,整数有多少位
浮点数转换为定点数
3位整数位宽,12位的小数位宽,最高位的符号位1位。则这个就是16位的
对于16位的符号数最大可以表示的值为32767,最小值为-32768。
第14,13,12位最大可以表示7,小数最大12位能表示多大精度呢?计算精度的方法位1/(2的12次方)= 0.000244140625,也可以用8/2^15
以2.918为例:
2.918/0.000244140625=11952.128~=11952,包含小数,小数部分进行四舍五入,这个就叫做量化的误差。这个值就是定点后的2.918。
以3.1415926为例:3.1415926/0.000244140625=12,867.9632896~=12868//量化后的值为:
3.1416015625 量化误差为3.1416015625–3.1415926=0.0000089625
浮点数与定点数的相乘
对于两个数相乘:
浮点结果:2.9183.1415926=9.1671672068
定点结果:1195212868=153,798,336~=9.167095184326171875
整数位变为6位,小数位为24位,精度为1/2^24
固定值乘法:
a=2,3,6,8
b=5
b的值就一直不变
a=2,b=5-------->25=2’b103’b101=2’b10*(22+20)=2<<2+2<<0=4’b1010
所以定点数乘法器得时候就可以使用移位和加法器来实现
在quartusⅡ中使用乘法器完成两个定点数相乘
IP核的使用
.v文件与测试未见
module ex_mult(
input wire sclk,
input wire rst_n,
input wire [15:0] in_a,
input wire [15:0] in_b,
output wire [31:0] out
);
mult_16_16 mult_16_16_inst (
.clock ( sclk ),
.dataa ( in_a ),
.datab ( in_b ),
.result ( out )
);
endmodule
`timescale 1ns/1ns
module tb_ex_mult;
reg sclk,rst_n;
reg [15:0] in_d;
wire [31:0] out;
initial begin
rst_n=0;
sclk=0;
end
initial begin
#10;
gen_data();
end
always #10 sclk = ~sclk;
ex_mult ex_mult_inst(
.sclk(sclk),
.rst_n(rst_n),
.in_a(in_d),
.in_b(in_d),
.out(out)
);
task gen_data();
integer i;
begin
for(i=0;i<255;i=i+1)
begin
@(posedge sclk);
in_d <= ($random %32768);
end
end
endtask
endmodule
do文件
quit -sim
.main clear
vlib ./work
vmap work work
vlog ./tb_ex_mult.v
vlog ./../design/ex_mult.v
vlog ./../design/quartus_prj/ipcore_dir/mult_16_16.v
vlog ./altera_lib/220model.v
vsim -voptargs=+acc work.tb_ex_mult
add wave tb_ex_mult/ex_mult_inst/*
run 10us