Advertisement
asurkis

Untitled

Mar 13th, 2021
1,480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3. module accelerator(
  4.     input rst_i,
  5.     input clk_i,
  6.     input [7:0] a_in,
  7.     input [7:0] b_in,
  8.     output busy_out,
  9.     output [7:0] y_out
  10. );
  11.  
  12. reg [7:0] a;
  13. reg [8:0] x;
  14. reg [15:0] t;
  15. reg [7:0] r;
  16. reg [7:0] m;
  17. reg [3:0] state;
  18. reg [7:0] mult_i1;
  19. reg [7:0] mult_i2;
  20. wire [15:0] mult_out;
  21. reg mult_reset;
  22. wire mult_busy;
  23.  
  24. mult mult_1(
  25.     .clk_i(clk_i),
  26.     .rst_i(mult_reset),
  27.     .a_bi(mult_i1),
  28.     .b_bi(mult_i2),
  29.     .busy_o(mult_busy),
  30.     .y_bo(mult_out)
  31. );
  32.  
  33. localparam STATE0 = 4'b0000;
  34. localparam STATE1 = 4'b0001;
  35. localparam STATE2 = 4'b0010;
  36. localparam STATE3 = 4'b0011;
  37. localparam STATE4 = 4'b0100;
  38. localparam STATE5 = 4'b0101;
  39. localparam STATE6 = 4'b0110;
  40. localparam STATE7 = 4'b0111;
  41. localparam STATE8 = 4'b1000;
  42. localparam STATE9 = 4'b1001;
  43. localparam STATE10 = 4'b1010;
  44. /* localparam STATE11 = 4'b1011;
  45. localparam STATE12 = 4'b1100;
  46. localparam STATE13 = 4'b1101;
  47. localparam STATE14 = 4'b1110;
  48. localparam STATE15 = 4'b1111; */
  49.  
  50. assign busy_out = rst_i | |state;
  51. assign y_out = r;
  52.  
  53. always @(posedge clk_i) begin
  54.     if (rst_i) begin
  55.         a <= a_in;
  56.         x <= b_in;
  57.         t <= 0;
  58.         r <= 4;
  59.         m <= 4;
  60.         state <= STATE1;
  61.         mult_reset <= 0;
  62.     end else begin
  63.         case (state)
  64.             STATE0:
  65.                 begin
  66.                 end
  67.             STATE1:
  68.                 begin
  69.                     if (|m) begin
  70.                         mult_reset <= 1;
  71.                         mult_i1 <= r;
  72.                         mult_i2 <= r;
  73.                         state <= STATE2;
  74.                     end else begin
  75.                         state <= STATE5;
  76.                     end
  77.                 end
  78.             STATE2:
  79.                 begin
  80.                     if (mult_busy) begin
  81.                         mult_reset <= 0;
  82.                     end else begin
  83.                         mult_reset <= 1;
  84.                         mult_i1 <= mult_out;
  85.                         mult_i2 <= r;
  86.                         state <= STATE3;
  87.                     end
  88.                 end
  89.             STATE3:
  90.                 begin
  91.                     mult_reset <= 0;
  92.                     if (!mult_busy) begin
  93.                         if (x < mult_out) begin
  94.                             r <= r - m;
  95.                         end else if (x > mult_out) begin
  96.                             r <= r + m;
  97.                         end else begin
  98.                             m <= 0;
  99.                         end
  100.                         state <= STATE4;
  101.                     end
  102.                 end
  103.             STATE4:
  104.                 begin
  105.                     m <= m >> 1;
  106.                     state <= STATE1;
  107.                 end
  108.             STATE5:
  109.                 begin
  110.                     x <= a + r;
  111.                     m <= 64;
  112.                     state <= STATE6;
  113.                 end
  114.             STATE6:
  115.                 begin
  116.                     r <= 0;
  117.                     state <= STATE7;
  118.                 end
  119.             STATE7:
  120.                 begin
  121.                     t <= r | m;
  122.                     state <= STATE8;
  123.                     if (|m) begin
  124.                         state <= STATE8;
  125.                     end else begin
  126.                         state <= STATE0;
  127.                     end
  128.                 end
  129.             STATE8:
  130.                 begin
  131.                     r <= r >> 1;
  132.                     if (x >= t) begin
  133.                         state <= STATE9;
  134.                     end else begin
  135.                         state <= STATE10;
  136.                     end
  137.                 end
  138.             STATE9:
  139.                 begin
  140.                     x <= x - t;
  141.                     r <= r | m;
  142.                     state <= STATE10;
  143.                 end
  144.             STATE10:
  145.                 begin
  146.                     m <= m >> 2;
  147.                     state <= STATE7;
  148.                 end
  149.         endcase
  150.     end
  151. end
  152.  
  153. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement