FPMultiplier.Lola.txt 868 B

12345678910111213141516171819202122232425262728293031323334
  1. MODULE FPMultiplier(
  2. IN clk, run: BIT; x, y: WORD;
  3. OUT stall: BIT; z: WORD);
  4. REG (clk) S: [5] BIT; (*state*)
  5. B2, A2: [24] BIT;
  6. VAR sign: BIT;
  7. xe, ye: [8] BIT;
  8. e0, e1: [9] BIT;
  9. B0: [25] BIT;
  10. B00, B01, B1, A1, A0, z0: [24] BIT;
  11. BEGIN sign := x.31 ^ y.31; (*xor*)
  12. xe := x[30:23]; ye := y[30:23]; e0 := {0'1, xe} + {0'1, ye};
  13. B00 := (S = 0) -> 0 : B2;
  14. B01 := A0.0 -> {1'1, y[22:0]} : 0;
  15. B0 := {0'1, B00} + {0'1, B01};
  16. B1 := B0[24:1];
  17. A0 := (S = 0) -> {1'1, x[22:0]} : A2;
  18. A1 := {B0.0, A0[23:1]};
  19. e1 := e0 - 127 + B1.23;
  20. z0 := B1.23 -> B1 : {B1[22:0], A1.23};
  21. z := (xe = 0) | (ye = 0) -> 0 :
  22. ~e1.8 -> {sign, e1[7:0], z0[22:0]} :
  23. ~e1.7 -> {sign, 0FFH'8, z0[22:0]} : 0; (*overflow*)
  24. stall := run & (S # 23);
  25. B2 := B1; A2 := A1;
  26. S := run -> S+1 : 0;
  27. END FPMultiplier.