FPDivider.v 972 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. `timescale 1ns / 1ps // NW 18.9.2015
  2. module FPDivider(
  3. input clk, run,
  4. input [31:0] x,
  5. input [31:0] y,
  6. output stall,
  7. output [31:0] z);
  8. reg [4:0] S; // state
  9. reg [23:0] R;
  10. reg [24:0] Q;
  11. wire sign;
  12. wire [7:0] xe, ye;
  13. wire [8:0] e0, e1;
  14. wire [24:0] r0, r1, d, q0;
  15. wire [23:0] z0;
  16. assign sign = x[31]^y[31];
  17. assign xe = x[30:23];
  18. assign ye = y[30:23];
  19. assign e0 = {1'b0, xe} - {1'b0, ye};
  20. assign e1 = e0 + 126 + Q[24];
  21. assign stall = run & ~(S == 25);
  22. assign r0 = (S == 0) ? {2'b1, x[22:0]} : {R, 1'b0};
  23. assign d = r0 - {2'b1, y[22:0]};
  24. assign r1 = d[24] ? r0 : d;
  25. assign q0 = (S == 0) ? 0 : Q;
  26. assign z0 = Q[24] ? Q[24:1] : Q[23:0];
  27. assign z = (xe == 0) ? 0 :
  28. (ye == 0) ? {sign, 8'b11111111, 23'b0} :
  29. (~e1[8]) ? {sign, e1[7:0], z0[22:0]} :
  30. (~e1[7]) ? {sign, 8'b11111111, z0[22:0]} : 0;
  31. always @ (posedge(clk)) begin
  32. R <= r1[23:0];
  33. Q <= {q0[23:0], ~d[24]};
  34. S <= run ? S+1 : 0;
  35. end
  36. endmodule