Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2019
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns/1ps
  2.  
  3. module divider
  4.   #(
  5.     parameter DIVIDEND_WIDTH = 16,
  6.     parameter DIVISOR_WIDTH = 8,
  7.     parameter QUOTIENT_WIDTH  = 16,
  8.     parameter TWO_STAGE_SUB = 1
  9.   )
  10.   (
  11.     input wire clk,
  12.     input wire start,
  13.     input wire reset,
  14.     input wire [DIVIDEND_WIDTH - 1:0] dividend,
  15.     input wire [DIVISOR_WIDTH - 1:0] divisor,
  16.     output wire [QUOTIENT_WIDTH - 1:0] quotient,
  17.     output reg ready = 1'b1
  18. );
  19.  
  20.   reg args_comp = 1'b0;
  21.   reg [$clog2(DIVIDEND_WIDTH + 1) - 1:0] cnt = 'b0;
  22.  
  23.   reg sub_trig = 1'b0;
  24.   reg [DIVIDEND_WIDTH - 1:0] reg_sub = 'b0;
  25.   reg [DIVIDEND_WIDTH - 1:0] dividend_reg = 'b0;
  26.   reg [DIVIDEND_WIDTH + DIVISOR_WIDTH - 2:0] divisor_reg = 'b0;
  27.   reg [DIVIDEND_WIDTH - 1:0] quotient_reg = 'b0;
  28.  
  29.   assign quotient = quotient_reg[QUOTIENT_WIDTH - 1:0];
  30.  
  31.   always @(posedge clk) begin
  32.     args_comp <= (divisor_reg <= dividend_reg);
  33.     reg_sub <= dividend_reg - divisor_reg;
  34.   end
  35.  
  36.   always @(posedge clk) begin
  37.     if (ready) begin
  38.       if (start) begin
  39.         ready <= 1'b0;
  40.         cnt <= 'b0;
  41.         sub_trig <= 1'b0;
  42.         dividend_reg <= dividend;
  43.         quotient_reg <= 'b0;
  44.         divisor_reg <= {divisor, {(DIVIDEND_WIDTH - 1){1'b0}} };
  45.       end
  46.     end else begin
  47.       sub_trig <= !sub_trig;
  48.       if (sub_trig || !TWO_STAGE_SUB) begin
  49.         if (cnt == (DIVIDEND_WIDTH - 1)) begin
  50.           ready <= 1'b1;
  51.         end
  52.         if ((TWO_STAGE_SUB  && args_comp) || (!TWO_STAGE_SUB && (divisor_reg <= dividend_reg))) begin
  53.           dividend_reg <= TWO_STAGE_SUB ? reg_sub : (dividend_reg - divisor_reg);
  54.           quotient_reg <= (quotient_reg << 1) | 1'b1;
  55.         end else begin
  56.           quotient_reg <= (quotient_reg << 1);
  57.         end
  58.         divisor_reg <= divisor_reg >> 1;
  59.         cnt <= cnt + 1'b1;
  60.       end
  61.     end
  62.   end
  63. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement