FPAdder.v 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. `timescale 1ns / 1ps // NW 4.10.2016 pipelined
  2. // u = 1: FLT; v = 1: FLOOR
  3. module FPAdder(
  4. input clk, run, u, v,
  5. input [31:0] x, y,
  6. output stall,
  7. output [31:0] z);
  8. reg [1:0] State;
  9. wire xs, ys, xn, yn; // signs, null
  10. wire [7:0] xe, ye;
  11. wire [24:0] xm, ym;
  12. wire [8:0] dx, dy, e0, e1;
  13. wire [7:0] sx, sy; // shift counts
  14. wire [1:0] sx0, sx1, sy0, sy1;
  15. wire sxh, syh;
  16. wire [24:0] x0, x1, x2, y0, y1, y2;
  17. reg [24:0] x3, y3;
  18. reg [26:0] Sum;
  19. wire [26:0] s;
  20. wire z24, z22, z20, z18, z16, z14, z12, z10, z8, z6, z4, z2;
  21. wire [4:0] sc; // shift count
  22. wire [1:0] sc0, sc1;
  23. wire [24:0] t1, t2;
  24. reg [24:0] t3;
  25. assign xs = x[31]; // sign x
  26. assign xe = u ? 8'h96 : x[30:23]; // expo x
  27. assign xm = {~u|x[23], x[22:0], 1'b0}; //mant x
  28. assign xn = (x[30:0] == 0);
  29. assign ys = y[31]; // sign y
  30. assign ye = y[30:23]; // expo y
  31. assign ym = {~u&~v, y[22:0], 1'b0}; //mant y
  32. assign yn = (y[30:0] == 0);
  33. assign dx = xe - ye;
  34. assign dy = ye - xe;
  35. assign e0 = (dx[8]) ? ye : xe;
  36. assign sx = dy[8] ? 0 : dy;
  37. assign sy = dx[8] ? 0 : dx;
  38. assign sx0 = sx[1:0];
  39. assign sx1 = sx[3:2];
  40. assign sy0 = sy[1:0];
  41. assign sy1 = sy[3:2];
  42. assign sxh = sx[7] | sx[6] | sx[5];
  43. assign syh = sy[7] | sy[6] | sy[5];
  44. // denormalize, shift right
  45. assign x0 = xs&~u ? -xm : xm;
  46. assign x1 = (sx0 == 3) ? {{3{xs}}, x0[24:3]} :
  47. (sx0 == 2) ? {{2{xs}}, x0[24:2]} : (sx0 == 1) ? {xs, x0[24:1]} : x0;
  48. assign x2 = (sx1 == 3) ? {{12{xs}}, x1[24:12]} :
  49. (sx1 == 2) ? {{8{xs}}, x1[24:8]} : (sx1 == 1) ? {{4{xs}}, x1[24:4]} : x1;
  50. always @ (posedge(clk))
  51. x3 <= sxh ? {25{xs}} : (sx[4] ? {{16{xs}}, x2[24:16]} : x2);
  52. assign y0 = ys&~u ? -ym : ym;
  53. assign y1 = (sy0 == 3) ? {{3{ys}}, y0[24:3]} :
  54. (sy0 == 2) ? {{2{ys}}, y0[24:2]} : (sy0 == 1) ? {ys, y0[24:1]} : y0;
  55. assign y2 = (sy1 == 3) ? {{12{ys}}, y1[24:12]} :
  56. (sy1 == 2) ? {{8{ys}}, y1[24:8]} : (sy1 == 1) ? {{4{ys}}, y1[24:4]} : y1;
  57. always @ (posedge(clk))
  58. y3 <= syh ? {25{ys}} : (sy[4] ? {{16{ys}}, y2[24:16]} : y2);
  59. // add
  60. always @ (posedge(clk)) Sum <= {xs, xs, x3} + {ys, ys, y3};
  61. assign s = (Sum[26] ? -Sum : Sum) + 1;
  62. // post-normalize
  63. assign z24 = ~s[25] & ~ s[24];
  64. assign z22 = z24 & ~s[23] & ~s[22];
  65. assign z20 = z22 & ~s[21] & ~s[20];
  66. assign z18 = z20 & ~s[19] & ~s[18];
  67. assign z16 = z18 & ~s[17] & ~s[16];
  68. assign z14 = z16 & ~s[15] & ~s[14];
  69. assign z12 = z14 & ~s[13] & ~s[12];
  70. assign z10 = z12 & ~s[11] & ~s[10];
  71. assign z8 = z10 & ~s[9] & ~s[8];
  72. assign z6 = z8 & ~s[7] & ~s[6];
  73. assign z4 = z6 & ~s[5] & ~s[4];
  74. assign z2 = z4 & ~s[3] & ~s[2];
  75. assign sc[4] = z10; // sc = shift count of post normalization
  76. assign sc[3] = z18 & (s[17] | s[16] | s[15] | s[14] | s[13] | s[12] | s[11] | s[10])
  77. | z2;
  78. assign sc[2] = z22 & (s[21] | s[20] | s[19] | s[18])
  79. | z14 & (s[13] | s[12] | s[11] | s[10])
  80. | z6 & (s[5] | s[4] | s[3] | s[2]);
  81. assign sc[1] = z24 & (s[23] | s[22])
  82. | z20 & (s[19] | s[18])
  83. | z16 & (s[15] | s[14])
  84. | z12 & (s[11] | s[10])
  85. | z8 & (s[7] | s[6])
  86. | z4 & (s[3] | s[2]);
  87. assign sc[0] = ~s[25] & s[24]
  88. | z24 & ~s[23] & s[22]
  89. | z22 & ~s[21] & s[20]
  90. | z20 & ~s[19] & s[18]
  91. | z18 & ~s[17] & s[16]
  92. | z16 & ~s[15] & s[14]
  93. | z14 & ~s[13] & s[12]
  94. | z12 & ~s[11] & s[10]
  95. | z10 & ~s[9] & s[8]
  96. | z8 & ~s[7] & s[6]
  97. | z6 & ~s[5] & s[4]
  98. | z4 & ~s[3] & s[2];
  99. assign e1 = e0 - sc + 1;
  100. assign sc0 = sc[1:0];
  101. assign sc1 = sc[3:2];
  102. assign t1 = (sc0 == 3) ? {s[22:1], 3'b0} :
  103. (sc0 == 2) ? {s[23:1], 2'b0} : (sc0 == 1) ? {s[24:1], 1'b0} : s[25:1];
  104. assign t2 = (sc1 == 3) ? {t1[12:0], 12'b0} :
  105. (sc1 == 2) ? {t1[16:0], 8'b0} : (sc1 == 1) ? {t1[20:0], 4'b0} : t1;
  106. always @ (posedge(clk)) t3 <= sc[4] ? {t2[8:0], 16'b0} : t2;
  107. assign stall = run & ~(State == 3);
  108. always @ (posedge(clk)) State <= run ? State + 1 : 0;
  109. assign z = v ? {{7{Sum[26]}}, Sum[25:1]} : // FLOOR
  110. xn ? (u|yn ? 0 : y) : // FLT or x = y = 0
  111. yn ? x :
  112. ((t3 == 0) | e1[8]) ? 0 :
  113. {Sum[26], e1[7:0], t3[23:1]};
  114. endmodule