Divider.v.html 650 B

12345678910111213141516171819202122232425262728
  1. `timescale 1ns / 1ps // NW 20.9.2015
  2. module Divider(
  3. input clk, run, u,
  4. output stall,
  5. input [31:0] x, y, // y > 0
  6. output [31:0] quot, rem);
  7. reg [5:0] S; // state
  8. reg [63:0] RQ;
  9. wire sign;
  10. wire [31:0] x0, w0, w1;
  11. assign stall = run & ~(S == 33);
  12. assign sign = x[31] & u;
  13. assign x0 = sign ? -x : x;
  14. assign w0 = RQ[62: 31];
  15. assign w1 = w0 - y;
  16. assign quot = ~sign ? RQ[31:0] :
  17. (RQ[63:32] == 0) ? -RQ[31:0] : -RQ[31:0] - 1;
  18. assign rem = ~sign ? RQ[63:32] :
  19. (RQ[63:32] == 0) ? 0 : y - RQ[63:32];
  20. always @ (posedge(clk)) begin
  21. RQ <= (S == 0) ? {32'b0, x0} : {(w1[31] ? w0 : w1), RQ[30:0], ~w1[31]};
  22. S <= run ? S+1 : 0;
  23. end
  24. endmodule