设为首页收藏本站帮助中心
查看: 59|回复: 0
收起左侧

Quartus Verilog HDL/FPGA 双精度64位IEEE754浮点数比大小模块:大于,小于,等于,不等于

[复制链接]
发表于 2023-12-19 17:03:32 | 显示全部楼层 |阅读模式
main.png
  1. module double_decode(        //解码double(双精度浮点数)的符号位,指数位,尾数位
  2.         input [63:0] double,        //[64位宽] 双精度浮点数输入
  3.         output sign,                        //符号位 0:正数 1:负数
  4.         output nan,                                //NAN非数字标志位 指数位最大且尾数位不为0
  5.         output signed [10:0] exponent,                //[11位宽有符号] 指数位 范围:-1023~1024
  6.         output [51:0] fraction                        //[52位宽] 尾数位 范围:0~4503599627370495
  7. );
  8. assign sign = (|double[62:0]) ? double[63] : 1'b0;                //负0转正0
  9. assign exponent = double[62:52] - 11'd1023;
  10. assign fraction = double[51:0];
  11. assign nan = (&double[62:52] && |fraction);
  12. endmodule

  13. module double_cmp(                //64位双精度浮点数 比较两个数值的大小
  14.         input [63:0] ain,                //[64位宽IEEE754浮点数] 被比较数A
  15.         input [63:0] bin,                //[64位宽IEEE754浮点数] 比较数B
  16.         output reg equ,                //A等于B (NAN只能等于或不等于比较)
  17.         output neq,                                //A不等于B (NAN不比较符号位)
  18.         output lss,                                //A小于B (A小于B输出1,否则0)
  19.         output leq,                                //A小于等于B
  20.         output reg gtr,                //A大于B
  21.         output geq                                //A大于等于B
  22. );

  23. wire signA;
  24. wire signed [10:0] exponentA;
  25. wire [51:0] fractionA;
  26. wire nanA;
  27. double_decode A(
  28.         .double(ain),
  29.         .sign(signA),
  30.         .nan(nanA),
  31.         .exponent(exponentA),
  32.         .fraction(fractionA)
  33. );

  34. wire signB;
  35. wire signed [10:0] exponentB;
  36. wire [51:0] fractionB;
  37. wire nanB;
  38. double_decode B(
  39.         .double(bin),
  40.         .sign(signB),
  41.         .nan(nanB),
  42.         .exponent(exponentB),
  43.         .fraction(fractionB)
  44. );

  45. wire nan = |{nanA,nanB};
  46. assign neq = !equ;
  47. assign geq = nan ? 1'b0 : |{gtr,equ};
  48. assign lss = nan ? 1'b0 : !geq;
  49. assign leq = nan ? 1'b0 : !gtr;

  50. always @(*) begin
  51.         equ = 1'b0;
  52.         if(ain[62:0] == 63'd0 && bin[62:0] == 63'd0) begin                //正负零不比较符号位
  53.                 equ = 1'b1;
  54.         end else if(ain == bin || (nanA && nanB)) begin
  55.                 equ = 1'b1;
  56.         end
  57. end

  58. always @(*) begin
  59.         gtr = 1'b0;
  60.         if(!nan) begin
  61.                 if(signA != signB) begin                //符号位不同
  62.                         gtr = signB;
  63.                 end else begin                        //符号位相同
  64.                         if(exponentA > exponentB) begin                        //A指数大于B指数
  65.                                 gtr = !signB;
  66.                         end else if(exponentA < exponentB) begin                //A指数小于B指数
  67.                                 gtr = signB;
  68.                         end else begin                 //A与B指数相同,比较尾数
  69.                                 gtr = signB ? (fractionA < fractionB) : (fractionA > fractionB);
  70.                         end
  71.                 end
  72.         end
  73. end
  74. endmodule

  75. module main(
  76.         input [63:0] ain,
  77.         input [63:0] bin,
  78.         output equ,
  79.         output neq,
  80.         output lss,
  81.         output leq,
  82.         output gtr,
  83.         output geq
  84. );

  85. double_cmp double_cmp(
  86.         .ain(ain),
  87.         .bin(bin),
  88.         .equ(equ),
  89.         .neq(neq),
  90.         .lss(lss),
  91.         .leq(leq),
  92.         .gtr(gtr),
  93.         .geq(geq)
  94. );

  95. endmodule

复制代码

相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则