Divider0.v.html 559 B

12345678910111213141516171819202122232425262728
  1. `timescale 1ns / 1ps // NW 31.10.10
  2. module Divider(
  3. input clk, run,
  4. output stall,
  5. input [31:0] x, y, // x >= 0, y > 0
  6. output [31:0] quot, rem);
  7. reg [4:0] S; // state
  8. reg [31:0] R, Q;
  9. wire [31:0] r0, r1, r2, q0, q1, d;
  10. assign stall = run & ~(S == 31);
  11. assign r0 = (S == 0) ? 0 : R;
  12. assign d = r1 - y;
  13. assign r1 = {r0[30:0], q0[31]};
  14. assign r2 = d[31] ? r1 : d;
  15. assign q0 = (S == 0) ? x : Q;
  16. assign q1 = {q0[30:0], ~d[31]};
  17. assign rem = r2;
  18. assign quot = q1;
  19. always @ (posedge(clk)) begin
  20. R <= r2; Q <= q1;
  21. S <= run ? S+1 : 0;
  22. end
  23. endmodule