本论文的目的是记录在学习《数字信号处理的FPGA实现》的过程中,用verilog语言实现从简单的固定点数向浮点数转换的经验。
如果f[31:0]表示单精度32比特浮点数字,则f[31]表示已编码比特,‘0’表示正数,‘1’表示负数; f[30336023]这8位是指数位,为了表示负指数,将实际指数加127得到的结果称为f[30336023]; f[22:0]表示小数位(尾数),与科学计数法相似,但省略整数位[二进制科学计数法中整数位必须采用1]1,小数位从上至下存储在f[2233600]中,不足23位在末尾补0 例如,也有小数位数仅为“10011001”的无限大、0、NAN、非正规数等特殊代码,但这里不考虑。 稍后再详细讨论吧。
我用verilog语言编写的定点转换浮点模块实现了25位有符号定点整数到32位单精度浮点数的转换,并不完全符合标准。 例如,没有考虑特殊的编码等。 第一步实现补码到原始码的转换,第二步计算指数和尾数。
代码如下。
模块ifix浮动(clk,rst_n,ifix,ofloat );
input clk,rst_n;
input [24:0] ifix;
//reg [24:0] ifix;
output [31:0] ofloat;
reg [24:0] ifix_r;
reg [31:0] ofloat_r;
reg [23:0] ustd_tail;
reg [22:0] std_tail;
reg [7:0] exp;
reg s1、s2;
assign ofloat=ofloat_r;
always @ (posedgeclkornegedgerst _ n )
比根
if (! rst_n )
比根
//ifix=25'd100;
ofloat_r=32'd0;
ustd_tail=23'd0;
exp=8'd0;
结束
else
比根
ustd_tail=ifix_r[23:0];
s1=ifix[24];
s2=s1;
if(ifix(24 )==1'B1 ) ) ) ) ) ) )。
比根
ifix_r=~ifix 24'd1;
结束
else
比根
ifix_r=ifix;
结束
if(ustd_tail[23]==1'B1 ) ) )
比根
exp=8'd127 8'd23;
std_tail=ustd_tail[22:0];
结束
elseif(ustd_tail[22]==1'B1 ) )
比根
exp=8'd127 8'd22;
std_tail={ustd_tail[21:0],1'd0};
结束
elseif(ustd_tail[21]==1(B1 ) ) ) ) ) ) ) )。
比根
exp=8'd127 8'd21;
std_tail={ustd_tail[20:0],2'd0};
结束
elseif(ustd_tail[20]==1'B1 ) )
比根
exp=8'd127 8'd20;
std_tail={ustd_tail[19:0],3'd0};
结束
) ) )
比根
exp=8'd127 8'd19;
std_tail={ustd_tail[18:0],4'd0};
结束
) ) )
比根
exp=8'd127 8'd18;
std_tail={ustd_tail[17:0],5'd0};
结束
) ) )
比根
exp=8'd127 8'd17;
std_tail={ustd_tail[16:0],6'd0};
结束
) ) )
比根
exp=8'd127 8'd16;
std_tail={ustd_tail[15:0],7'd0};
结束
) ) )
比根
exp=8'd127 8'd15;
std_tail={ustd_tail[14:0],8'd0};
结束
) ) )
比根
exp=8'd127 8'd14;
std_tail={ustd_tail[13:0],9'd0};
结束
) ) )
比根
exp=8'd127 8'd13;
std_tail={ustd_tail[12:0],10'd0};
结束
elseif(ustd_tail[12]==1(B1 ) ) ) ) ) ) ) ) )。
比根
exp=8'd127 8'd12;
std_tail={ustd_tail[11:0],11'd0};
结束
elseif(ustd_tail[11]==1'B1 ) ) ) )
比根
exp=8'd127 8'd11;
std_tail={ustd_tail[10:0],12'd0};
结束
elseif(ustd_tail[10]==1'B1 ) )
比根
exp=8'd127 8'd10;
std_tail={ustd_tail[9:0],13'd0};
结束
elseif(ustd_tail[9]==1'B1 ) )
比根
exp=8'd127 8'd9;
std_tail={ustd_tail[8:0],14'd0};
结束
elseif(ustd_tail[8]==1'B1 ) )
比根
exp=8'd127 8'd8;
std_tail={ustd_tail[7:0],15'd0};
结束
elseif(ustd_tail[7]==1'B1 ) )
比根
exp=8'd127 8'd7;
std_tail={ustd_tail[6:0],16'd0};
结束
elseif(ustd_tail[6]==1'B1 ) )
比根
exp=8'd127 8'd6;
std_tail={ustd_tail[5:0],17'd0};
结束
elseif(ustd_tail[5]==1'B1 ) )
比根
exp=8'd127 8'd5;
std_tail={ustd_tail[4:0],18'd0};
结束
elseif(ustd_tail[4]==1'B1 ) )
比根
exp=8'd127 8'd4;
std_tail={ustd_tail[3:0],19'd0};
结束
elseif(ustd_tail[3]==1'B1 ) )
比根
exp=8'd127 8'd3;
std_tail={ustd_tail[2:0],20'd0};
结束
elseif(ustd_tail[2]==1'B1 ) )
比根
exp=8'd127 8'd2;
std_tail={ustd_tail[1:0],21'd0};
结束
elseif(ustd_tail[1]==1'B1 ) )
比根
exp=8'd127 8'd1;
std_tail={ustd_tail[0],22'd0};
结束
else
比根
exp=8'd127 8'd24;
std_tail=23'd0;
结束
ofloat_r={s2,exp,std_tail};
结束
结束
最终模块