Advertisement
Tavi33

Divider

Apr 26th, 2016
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module divider(
  2.  
  3.    input clk,
  4.    input rst,
  5.    input [3:0] inA,
  6.    input [3:0] inB,
  7.    output [4:0] rem,
  8.    output [3:0] quot
  9.  
  10. );
  11.  
  12. reg [1:0] q;
  13. reg [3:0] A;
  14. reg [3:0] B;
  15. reg [4:0] P;
  16. reg [2:0] k;
  17. reg [3:0] cnt;
  18.  
  19. reg[3:0] state,state_nxt;
  20. localparam s0=3'd0, s1=3'd1,s2=3'd2,s3=3'd3;
  21.  
  22. always @(posedge clk or posedge rst)
  23. begin
  24.     if (rst) begin
  25.       state <= s0;
  26.       A <= inA;
  27.       B <= inB;
  28.       q <= 1'b0;
  29.       k <= 3'b0;
  30.       P <= 5'b0;
  31.       cnt <= 4'd3;
  32.    end
  33.    else begin
  34.       state <= state_nxt;
  35.      
  36.    end
  37. end
  38.  
  39.  
  40. always @(*)
  41. begin
  42.     case(state)
  43.         s0:
  44.            if(B[3] == 1'd0)
  45.               begin
  46.                   {P[4:0], A[3:0], B[3:0]} <= {P[3:0],A[3:0],B[3:0],1'b0};
  47.                   k = k + 1'b1;
  48.                   state_nxt = s0;
  49.               end
  50.            else
  51.               state_nxt = s1;
  52.         s1:
  53.         if(cnt > 0)
  54.            case({A[3],A[2],A[1]})
  55.               3'd0,3'd1: begin
  56.                   q = 2'd0;
  57.                   {P, A} = {P[3:0],A,1'b0};
  58.                   cnt = cnt - 1;
  59.                   state_nxt = s1;
  60.               end
  61.               default:
  62.                  begin
  63.                      if(P < 0) begin
  64.                         q = 2'b01;
  65.                         {P, A} = {P[3:0],A,1'b0};
  66.                         P = P + {1'b0,B};
  67.                         cnt = cnt - 1;
  68.                         state_nxt = s1;
  69.                      end
  70.                      else
  71.                      begin
  72.                         q = 2'b10;
  73.                         {P, A} = {P[3:0],A,1'b0};
  74.                         P = P - {1'b0,B};
  75.                         cnt = cnt - 1;
  76.                         state_nxt = s1;
  77.                      end
  78.                  end
  79.            endcase
  80.        else state_nxt = s2;
  81.        s2:
  82.           begin
  83.               if(P < 0)
  84.               begin
  85.                  P = P + {1'b0,B};
  86.                  q = q - 1'b1;
  87.                  P = P << k;
  88.               end
  89.           end
  90.   endcase
  91. end
  92.  
  93. assign rem = P;
  94. assign quot = A;
  95.  
  96. endmodule
  97.  
  98. //TB
  99.  
  100. module divider_tb(
  101.  
  102.    output reg clk,
  103.    output reg rst,
  104.    output reg [3:0] inA,
  105.    output reg [3:0] inB,
  106.    output [4:0] rem,
  107.    output [3:0] quot
  108.  
  109. );
  110.  
  111. divider d1(
  112.    .clk(clk),
  113.    .rst(rst),
  114.    .inA(inA),
  115.    .inB(inB),
  116.    .rem(rem),
  117.    .quot(quot)
  118.    
  119. );
  120.  
  121. initial begin
  122.       clk = 0;
  123.       repeat (30) #50 clk = ~clk;
  124. end
  125.  
  126. initial begin
  127.    inA = 4'd6;
  128.    inB = 4'd3;
  129. end
  130.  
  131. initial begin
  132.     rst = 1'b0;
  133.     #50 rst = 1'b1;
  134.     #100 rst = 1'b0;
  135. end
  136.  
  137. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement