本文利用一个例子,简单的介绍了,FPGA定点数转换成双精度浮点数(IEEE754协议),文章后,贴有实现代码和仿真文件,我用的是quartus II 13.1。
一:双精度浮点数格式
双精度的指数部分(E)采用的偏置码为1023
假设待转换的数据是11(二进制)
第一步:将其扩展成64位2进制数
0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0011
第二步:计算首1是第几位
2
第三步:计算阶码
偏移值是1023
Code=1023+2-1=1024
第四步:计算尾数
4.1:因为首1是第2位,所以数据往左移52-2=50位
Pre_尾数=1100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000
4.2:将首1隐藏 Pre_尾数,往左移动一位
尾数=1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000
第五步:组合成新的浮点数
Double_Float=0100_0000_0000_1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000
0x4008000000000000
在这里插入代码片
module int_to_double_float
(
input clk,
input rst_n,
input signed [31:0]int_number, //输入进来的是32位整型数据,能表示到浮点数21474836648
output reg [63:0]double_float
);
//变量声明
reg [63:0]int_number_64; //输入的整型变量
reg [9:0]cnt; //计数器,进行时序约束
reg [5:0]first_one; //首1,所在的位置
reg [10:0]code; //11位的阶码
reg [31:0]pre_mantissa; //扩展后的数据,其中有效数据部分的首1,移位到第53位时的尾数
reg sign; //数据的符号位
//创建一个计数器,进行时序约束
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 10'd0;
else begin
if(cnt < 6)
cnt<= cnt + 1'b1;
else
cnt<= 10'd0;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
sign<= 1'd0;
else begin
sign