FPDivider.Lola.txt 982 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. MODULE FPDivider( (*NW 9.9.2016*)
  2. IN clk, run: BIT; x, y: WORD;
  3. OUT stall: BIT; z: WORD);
  4. REG (clk) S: [5] BIT; (*state*)
  5. R: [24] BIT; (*remainder*)
  6. Q: [26] BIT; (*quotient*)
  7. VAR sign: BIT;
  8. xe, ye: [8] BIT;
  9. e0, e1: [9] BIT;
  10. r0, r1, d: [25] BIT;
  11. q0: [26] BIT;
  12. z0, z1: [25] BIT;
  13. BEGIN
  14. sign := x.31 ^ y.31; (*xor*)
  15. xe := x[30:23]; ye := y[30:23];
  16. e0 := {0'1, xe} - {0'1, ye};
  17. e1 := e0 + 126 + Q.25;
  18. stall := run & (S # 26);
  19. r0 := (S = 0) -> {1'2, x[22:0]} : {R, 0'1};
  20. r1 := d.24 -> 0 : d;
  21. d := r0 - {1'2, y[22:0]};
  22. q0 := (S = 0) -> 0 : Q;
  23. z0 := Q.25 -> Q[25:1] : Q[24:0]; (* normalize*)
  24. z1 := z0 + 1; (*round*)
  25. z := (xe = 0) -> 0 :
  26. (ye = 0) -> {sign, 0FFH'8, 0'23} : (*divide by 0*)
  27. ~e1.8 -> {sign, e1[7:0], z1[23:1]} :
  28. ~e1.7 -> {sign, 0FFH'8, z0[23:1]} : 0; (*overflow*)
  29. R := r1[23:0];
  30. Q := {q0[24:0], ~d.24};
  31. S := run -> S+1 : 0
  32. END FPDivider.