FPMultiplier.Lola.txt 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. MODULE FPMultiplier( (*NW 28.10.2016*)
  2. IN clk, run: BIT; x, y: WORD;
  3. OUT stall: BIT; z: WORD);
  4. REG (clk) S: [5] BIT; (*state*)
  5. P: [48] BIT; (*product*)
  6. VAR sign: BIT;
  7. xe, ye: [8] BIT;
  8. e0, e1: [9] BIT;
  9. w0: [24] BIT;
  10. w1, z0: [25] BIT;
  11. BEGIN sign := x.31 ^ y.31; (*xor*)
  12. xe := x[30:23]; ye := y[30:23];
  13. e0 := {0'1, xe} + {0'1, ye};
  14. e1 := e0 - 127 + {0'8, P.47};
  15. stall := run & (S # 25);
  16. w0 := P.0 -> {1'1, y[22:0]} : 0;
  17. w1 := {0'1, P[47:24]} + {0'1, w0};
  18. P := (S = 0) -> {0'24, 1'1, x[22:0]} : {w1, P[23:1]};
  19. S := run -> S+1 : 0;
  20. z0 := P.47 -> P[47:23]+1 : P[46:22]+1; (*round & normalize*)
  21. z := (xe = 0) | (ye = 0) -> 0 :
  22. ~e1.8 -> {sign, e1[7:0], z0[23:1]} :
  23. ~e1.7 -> {sign, 0FFH'8, z0[23:1]} : 0; (*overflow*)
  24. END FPMultiplier.
  25. MODULE FPMultiplier(
  26. IN clk, run: BIT; x, y: WORD;
  27. OUT stall: BIT; z: WORD);
  28. REG (clk) S: [5] BIT; (*state*)
  29. B2, A2: [24] BIT;
  30. VAR sign: BIT;
  31. xe, ye: [8] BIT;
  32. e0, e1: [9] BIT;
  33. B0: [25] BIT;
  34. B00, B01, B1, A1, A0, z0: [24] BIT;
  35. BEGIN sign := x.31 ^ y.31; (*xor*)
  36. xe := x[30:23]; ye := y[30:23]; e0 := {0'1, xe} + {0'1, ye};
  37. B00 := (S = 0) -> 0 : B2;
  38. B01 := A0.0 -> {1'1, y[22:0]} : 0;
  39. B0 := {0'1, B00} + {0'1, B01};
  40. B1 := B0[24:1];
  41. A0 := (S = 0) -> {1'1, x[22:0]} : A2;
  42. A1 := {B0.0, A0[23:1]};
  43. e1 := e0 - 127 + B1.23;
  44. z0 := B1.23 -> B1 : {B1[22:0], A1.23};
  45. z := (xe = 0) | (ye = 0) -> 0 :
  46. ~e1.8 -> {sign, e1[7:0], z0[22:0]} :
  47. ~e1.7 -> {sign, 0FFH'8, z0[22:0]} : 0; (*overflow*)
  48. stall := run & (S # 23);
  49. B2 := B1; A2 := A1;
  50. S := run -> S+1 : 0;
  51. END FPMultiplier.