Advertisement
Guest User

Untitled

a guest
Dec 27th, 2018
142
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 wire ready
  18. );
  19.  
  20.   localparam STATE_IDLE = 0;
  21.   localparam STATE_SHIFT = 1;
  22.   localparam STATE_SUB = 2;
  23.  
  24.   reg [7:0] state;
  25.   reg args_comp = 1'b0;
  26.   reg [$clog2(DIVIDEND_WIDTH) - 1:0] cnt = 'b0;
  27.   reg sub_trig = 1'b0;
  28.   reg [DIVIDEND_WIDTH - 1:0] reg_sub = 'b0;
  29.   reg [DIVIDEND_WIDTH - 1:0] dividend_reg = 'b0;
  30.   reg [DIVIDEND_WIDTH - 1:0] divisor_reg = 'b0;
  31.   reg [DIVIDEND_WIDTH - 1:0] quotient_reg = 'b0;
  32.  
  33.   assign quotient = quotient_reg[QUOTIENT_WIDTH - 1:0];
  34.   assign ready = state == STATE_IDLE;
  35.  
  36.   always @(posedge clk) begin
  37.     args_comp <= (divisor_reg <= dividend_reg);
  38.     reg_sub <= dividend_reg - divisor_reg;
  39.   end
  40.  
  41.   always @(posedge clk) begin
  42.     case (state)
  43.       STATE_IDLE: begin
  44.         if (start) begin
  45.           state <= STATE_SHIFT;
  46.           cnt <= 'b1;
  47.           sub_trig <= 1'b0;
  48.           dividend_reg <= dividend;
  49.           quotient_reg <= 'b0;
  50.           divisor_reg <= divisor;
  51.         end
  52.       end
  53.       STATE_SHIFT: begin
  54.         cnt <= cnt + 1'b1;
  55.         divisor_reg <= divisor_reg << 1;
  56.         if ((divisor_reg & (1 << (DIVIDEND_WIDTH - 2))) || (cnt == {$clog2(DIVIDEND_WIDTH){1'b1}})) begin
  57.           state <= STATE_SUB;
  58.         end
  59.       end
  60.       STATE_SUB: begin
  61.         if (TWO_STAGE_SUB) begin
  62.           sub_trig <= !sub_trig;
  63.           if (sub_trig) begin
  64.             if (cnt == 'b1) begin
  65.               state <= STATE_IDLE;
  66.             end
  67.  
  68.             if (args_comp) begin
  69.               dividend_reg <= reg_sub;
  70.               quotient_reg <= (quotient_reg << 1) | 1'b1;
  71.             end else begin
  72.               quotient_reg <= (quotient_reg << 1);
  73.             end
  74.             divisor_reg <= divisor_reg >> 1;
  75.             cnt <= cnt - 1'b1;
  76.           end
  77.         end else begin
  78.           if (cnt == 'b1) begin
  79.             state <= STATE_IDLE;
  80.           end
  81.           if (divisor_reg <= dividend_reg) begin
  82.             dividend_reg <= dividend_reg - divisor_reg;
  83.             quotient_reg <= (quotient_reg << 1) | 1'b1;
  84.           end else begin
  85.             quotient_reg <= (quotient_reg << 1);
  86.           end
  87.           divisor_reg <= divisor_reg >> 1;
  88.           cnt <= cnt - 1'b1;
  89.         end
  90.       end
  91.       default: begin
  92.         state <= STATE_IDLE;
  93.       end
  94.     endcase
  95.   end
  96. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement