tag 标签: 浮点转整数,fpga,verilog

相关博文
  • 热度 13
    2014-7-18 15:36
    1321 次阅读|
    0 个评论
    考虑几个方面: 1:可能是非规格化格式   形式是:8位阶码位=0,而且尾数位!=0,,,这样的数太小,必将导致精度损失。 2:因为32位补码整数能表示的范围只能是-2 31 =d=2 31,而单精度浮点数能表示的数的范围比整数大的多,所以很多浮点数不能转换成整数,不能太小,也不能太大。 转换的方法:    先根据阶数计算出右移位数n,和根据尾数组成frac0,然后将frac0右移n位形成f_abs,截取f_abs ,如果全是0 则精度没有损失,如果有则精度损失。 最后根据符号位,将f_abs 就是结果,如果是负的,将f_abs 转换成负数。   wire shift_right_bits=9'b010011110-{1'b0,a };/////需要右移的位数   wire frac0={hidden_bit,a ,32'h0};///////////为能检测出精度是否损失,使用了56位的数据格式,左32位为结果,右24位是被移除的位。   wire f_abs=($signed(shift_right_bits)9'h20)?frac06'h20:frac0shift_right_bits;/////frac0右移后的数据 wire lost_bits=|f_abs ;//判别是否精度损失 wire int32 = (sign)? -f_abs :f_abs ;//根据符号,转换,并取出结果。   代码: module f2i(a,d,precision_lost,denormlized,invalid,state); input a; output reg   d; output reg precision_lost; output denormlized; output reg  invalid; output reg state; wire hidden_bit=|a ; wire frac_is_not_0=|a ; assign denormlized=~hidden_bitfrac_is_not_0; wire is_zero=~hidden_bit~frac_is_not_0; wire sign =a ; wire shift_right_bits=9'b010011110-{1'b0,a }; wire frac0={hidden_bit,a ,32'h0}; wire f_abs=($signed(shift_right_bits)9'h20)?frac06'h20:frac0shift_right_bits; wire lost_bits=|f_abs ; wire int32 = (sign)? -f_abs :f_abs ; always @* begin       if(denormlized) begin              precision_lost=1;             invalid=0;             d=32'h00000000;             state=3'b000;        end     else          begin            if(shift_right_bits ) begin                precision_lost=0;              invalid=1;              d=32'h80000000;              state=3'b001;            end           else              begin               if(shift_right_bits 8'h1f) begin                   if(is_zero)  precision_lost=0;                  else  precision_lost=1;                  invalid=0;                  d=32'h00000000;                  state=3'b010;                  end              else begin                    if(sign!=int32 ) begin                          precision_lost=0;                         invalid=1;                         d=32'h80000000;                          state=3'b011;                         end                    else                       begin                           if(lost_bits)  precision_lost=1;                          else  precision_lost=0;                          invalid=0;                          d=int32;                          state=3'b100;                      end                  end              end         end  end    endmodule