首页 > 编程知识 正文

定点数和浮点数的表示,ieee短浮点数转换

时间:2023-05-05 03:06:24 阅读:26750 作者:4056

本论文的目的是记录在学习《数字信号处理的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};

结束

结束

最终模块

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。