Advertisement
AlexanderAntonov

Untitled

Oct 18th, 2022
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module vending_fsm
  2. (
  3.     input clk_i
  4.     , input rst_i
  5.    
  6.     , input coin_put_i                  // 1-cycle tick
  7.     , input [7:0] coin_sum_bi
  8.    
  9.     , input select_good_i               // 1-cycle tick
  10.     , input [7:0] select_good_num_bi
  11.     , input [31:0] select_good_cost_bi
  12.    
  13.     , input cancel_i                    // 1-cycle tick
  14.  
  15.     , output logic give_order_o                 // 1-cycle tick
  16.     , output logic [7:0]  give_order_num_bo
  17.  
  18.     , output logic give_change_o                // 1-cycle tick
  19.     , output logic [31:0] give_change_sum_bo
  20. );
  21.  
  22. enum {IDLE, CREDIT, DELIIVERY, CHANGE} state;
  23.  
  24. logic [7:0] selected_good;
  25. logic [31:0] credit_accumulated;
  26.  
  27. always @(posedge clk_i)
  28.     begin
  29.     if (rst_i)
  30.         begin
  31.         state <= IDLE;
  32.         give_order_o <= 1'b0;
  33.         give_order_num_bo <= 0;
  34.         give_change_o <= 1'b0;
  35.         give_change_sum_bo <= 0;
  36.         end
  37.     else
  38.         begin
  39.  
  40.         // default values for "ticks"
  41.         give_order_o <= 1'b0;
  42.         give_change_o <= 1'b0;
  43.  
  44.         case (state)
  45.  
  46.             IDLE:
  47.                 begin
  48.                 if (coin_put_i)
  49.                     begin
  50.                     credit_accumulated <= coin_sum_bi;
  51.                     state <= CREDIT;
  52.                     end
  53.                 end
  54.  
  55.             CREDIT:
  56.                 begin
  57.                 if (coin_put_i)
  58.                     begin
  59.                     credit_accumulated <= credit_accumulated + coin_sum_bi;
  60.                     end
  61.                 else if (select_good_i)
  62.                     begin
  63.                     selected_good <= select_good_num_bi;
  64.                     credit_accumulated <= credit_accumulated - select_good_cost_bi;
  65.                     state <= DELIIVERY;
  66.                     end
  67.                 else if (cancel_i)
  68.                     begin
  69.                     state <= CHANGE;
  70.                     end
  71.                 end
  72.  
  73.             DELIIVERY:
  74.                 begin
  75.                 give_order_o <= 1'b1;
  76.                 give_order_num_bo <= selected_good;
  77.                 state <= CHANGE;
  78.                 end
  79.  
  80.             CHANGE:
  81.                 begin
  82.                 give_change_o <= 1'b1;
  83.                 give_change_sum_bo <= credit_accumulated;
  84.                 state <= IDLE;
  85.                 end
  86.  
  87.         endcase
  88.  
  89.         end
  90.     end
  91.  
  92. endmodule // vending_fsm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement