Advertisement
Tavi33

OC - Booth M.

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