|
- module float_decode( //解码float(单精度浮点数)的符号位,指数位,尾数位
- input [31:0] float, //[32位宽] 单精度浮点数输入
- output sign, //符号位 0:正数 1:负数
- output signed [7:0] exponent, //[8位宽有符号] 指数位 范围:-127~128 此值为正数表示小数大于等于2的N次方,负数表示小数大于0小于1(无视符号位),最大则INF或NAN
- output [22:0] fraction //[23位宽] 尾数位 范围:0~8388607 (指数位最大 0:INF 非0:NAN)
- );
- assign sign = float[31];
- assign exponent = float[30:23] - 8'd127;
- assign fraction = float[22:0];
- endmodule
- module float_encode( //编码float(单精度浮点数)的符号位,指数位,尾数位
- input sign, //符号位
- input signed [7:0] exponent, //[8位宽有符号] 指数位
- input [22:0] fraction, //[23位宽] 尾数位
- output [31:0] float //单精度浮点数输出
- );
- wire [7:0] i = exponent + 8'd127;
- assign float = {sign,i,fraction};
- endmodule
- module double_decode( //解码double(双精度浮点数)的符号位,指数位,尾数位
- input [63:0] double, //[64位宽] 双精度浮点数输入
- output sign, //符号位 0:正数 1:负数
- output signed [10:0] exponent, //[11位宽有符号] 指数位 范围:-1023~1024
- output [51:0] fraction //[52位宽] 尾数位 范围:0~4503599627370495
- );
- assign sign = double[63];
- assign exponent = double[62:52] - 11'd1023;
- assign fraction = double[51:0];
- endmodule
- module double_encode( //编码double(双精度浮点数)的符号位,指数位,尾数位
- input sign, //符号位
- input signed [10:0] exponent, //[11位宽有符号] 指数位
- input [51:0] fraction, //[52位宽] 尾数位
- output [63:0] double //[64位宽] 双精度浮点数输出
- );
- wire [10:0] i = exponent + 11'd1023;
- assign double = {sign,i,fraction};
- endmodule
- module float_to_double( //将32位单精度浮点数转换成64位双精度浮点数
- input [31:0] float, //[32位宽] 单精度浮点数输入 输入INF(无穷大)或NAN 输出INF或NAN
- output [63:0] double //[64位宽] 双精度浮点数输出
- );
- wire sign;
- wire signed [7:0] exponent;
- wire [22:0] fraction;
- float_decode float_decode(
- .float(float),
- .sign(sign),
- .exponent(exponent),
- .fraction(fraction)
- );
- double_encode double_encode(
- .sign(sign),
- .exponent((exponent == -8'd128) ? 11'd1024 : exponent),
- .fraction({fraction,29'd0}),
- .double(double)
- );
- endmodule
- module double_to_float( //将64位双精度浮点数转换成32位单精度浮点数
- input [63:0] double, //[64位宽] 双精度浮点数输入
- output [31:0] float //[32位宽] 单精度浮点数输出 超范围返回INF(无穷大)
- );
- wire sign;
- wire signed [10:0] double_exponent;
- wire [51:0] fraction_double;
- wire [22:0] fraction_float = fraction_double[51:29];
- wire max = (double_exponent > 128) ? 1'b1 : 1'b0;
- wire min = (double_exponent < -127) ? 1'b1 : 1'b0;
- wire signed [7:0] float_exponent = max ? 8'd128 : (min ? -8'd127 : double_exponent[7:0]);
- wire [22:0] round = (!(&fraction_float) && fraction_double[28]) ? 23'd1 : 23'd0;
- double_decode double_decode(
- .double(double),
- .sign(sign),
- .exponent(double_exponent),
- .fraction(fraction_double)
- );
- float_encode float_encode(
- .sign(sign),
- .exponent(float_exponent),
- .fraction((min | max) ? 23'd0 : fraction_float + round),
- .float(float)
- );
- endmodule
- /*
- 浮点小数:123.456 IEEE754编码规范:
- 单精度:32'h42F6E979 双精度:64'h405EDD2F1A9FBE77
- 单精度正无穷:32‘h7F800000 双精度正无穷:64'h7FF0000000000000
- 单精度负无穷:32‘hFF800000 双精度负无穷:64'hFFF0000000000000
- */
- module main(
- input [63:0] double_in,
- input [31:0] float_in,
- output [63:0] double_out,
- output [31:0] float_out
- );
- double_to_float double_to_float(
- .double(double_in),
- .float(float_out)
- );
- float_to_double float_to_double(
- .float(float_in),
- .double(double_out)
- );
- endmodule
复制代码 |
|