Multiplier.Lola.txt 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. MODULE Multiplier ( (*NW 7.9.2014*)
  2. IN clk, run, u: BIT;
  3. OUT stall: BIT;
  4. IN x, y: WORD; (*32 bit*)
  5. OUT z: [64] BIT);
  6. VAR b0, b00, b01: [33] BIT;
  7. b1, a0, a1: WORD;
  8. REG (clk) S: [5] BIT; (*state*)
  9. B, A: WORD; (*high and low parts of partial product*)
  10. BEGIN stall := run & ~(S = 31);
  11. b00 := (S = 0) -> 0'33 : {B.31, B};
  12. b01 := a0.0 -> {y.31 & u, y} : 0'33;
  13. b0 := ((S = 31) & u) -> b00 - b01: b00 + b01;
  14. b1 := b0[32:1];
  15. a0 := (S = 0) -> x : A;
  16. a1 := {b0.0, a0[31:1]};
  17. z := {b1, a1};
  18. B := b1; A := a1;
  19. S := run -> S+1 : 0
  20. END Multiplier.
  21. MODULE Multiplier1 ( (*NW 5.10.2014*)
  22. IN clk, run, u: BIT;
  23. OUT stall: BIT;
  24. IN x, y: WORD; (*32 bit*)
  25. OUT z: [64] BIT);
  26. TYPE MULT18X18 := MODULE (OUT P: [36] BIT; IN A, B: [18] BIT) ^;
  27. VAR M0, M1, M2, M3: MULT18X18;
  28. p0, p1, p2, p3: [36] BIT;
  29. REG (clk) S: BIT; (*state*)
  30. z0: [16] BIT; z1, z2: [48] BIT;
  31. BEGIN
  32. M0(p0, {0'2, x[15:0]}, {0'2, y[15:0]});
  33. M1(p1, {u&x.31, u&x.31, x[31:16]}, {0'2, y[15:0]});
  34. M2(p2, {0'2, x[15:0]}, {u&y.31, u&y.31, y[31:16]});
  35. M3(p3, {u&x.31, u&x.1, x[31:16]}, {u&y.31, u&y.31, y[31:16]});
  36. stall := run & ~S;
  37. z := {z1 + z2, z0};
  38. S := stall;
  39. z0 := p0[15:0];
  40. z1 := {0'32, p0[31:16]} + {(u&p1.31)!16, p1[31:0]};
  41. z2 := {u&p2.31!16, p2[31:0]} + {p3[31:0], 0'16}
  42. END Multiplier1.