diff options
Diffstat (limited to '')
| -rw-r--r-- | task5/statemachine.sv | 87 |
1 files changed, 77 insertions, 10 deletions
diff --git a/task5/statemachine.sv b/task5/statemachine.sv index 1a01db2..d6e9ae0 100644 --- a/task5/statemachine.sv +++ b/task5/statemachine.sv @@ -1,13 +1,80 @@ -module statemachine(input logic slow_clock, input logic resetb, - input logic [3:0] dscore, input logic [3:0] pscore, input logic [3:0] pcard3, - output logic load_pcard1, output logic load_pcard2, output logic load_pcard3, - output logic load_dcard1, output logic load_dcard2, output logic load_dcard3, - output logic player_win_light, output logic dealer_win_light); +`define STATE_DEAL_P1 3'b000 +`define STATE_DEAL_D1 3'b001 +`define STATE_DEAL_P2 3'b010 +`define STATE_DEAL_D2 3'b011 +`define STATE_DEAL_P3 3'b100 +`define STATE_DEAL_D3 3'b101 +`define STATE_END 3'b110 -// The code describing your state machine will go here. Remember that -// a state machine consists of next state logic, output logic, and the -// registers that hold the state. You will want to review your notes from -// CPEN 211 or equivalent if you have forgotten how to write a state machine. +module statemachine(slow_clock, resetb, dscore, pscore, pcard3, + load_pcard1, load_pcard2, load_pcard3, + load_dcard1, load_dcard2, load_dcard3, + player_win_light, dealer_win_light); -endmodule + input logic slow_clock, resetb; + input logic [3:0] dscore, pscore, pcard3; + output logic load_pcard1, load_pcard2, load_pcard3, + load_dcard1, load_dcard2, load_dcard3, + player_win_light, dealer_win_light; + logic [2:0] state; + + always_ff @(posedge slow_clock) casex ({resetb, state}) + 4'b0_xxx: + state <= `STATE_DEAL_P1; + {1'b1, `STATE_DEAL_P1}: + state <= `STATE_DEAL_D1; + {1'b1, `STATE_DEAL_D1}: + state <= `STATE_DEAL_P2; + {1'b1, `STATE_DEAL_P2}: + state <= `STATE_DEAL_D2; + {1'b1, `STATE_DEAL_D2}: + if ((pscore >= 8) || (dscore >= 8)) state <= `STATE_END; + else if (pscore <= 5) state <= `STATE_DEAL_P3; + else if (dscore <= 5) state <=`STATE_DEAL_D3; + else state = `STATE_END; + {1'b1, `STATE_DEAL_P3}: casex ({dscore, pcard3}) + /* Banker 6 on a player's third card 6 or 7. */ + {4'd6, 4'd6}, {4'd6, 4'd7}, + /* Banker 5 on a player's third card 4 through 7. */ + {4'd5, 4'd4}, {4'd5, 4'd5}, {4'd5, 4'd6}, {4'd5, 4'd7}, + /* Banker 4 on a player's third card 2 through 7. */ + {4'd4, 4'd2}, {4'd4, 4'd3}, {4'd4, 4'd4}, + {4'd4, 4'd5}, {4'd4, 4'd6}, {4'd4, 4'd7}, + /* Banker 3 on a player's third card 1 through 7. */ + {4'd3, 4'd1}, {4'd3, 4'd2}, {4'd3, 4'd3}, {4'd3, 4'd4}, + {4'd3, 4'd5}, {4'd3, 4'd6}, {4'd3, 4'd7}, + /* Banker 0, 1, or 2. */ + {4'd0, 4'bxxxx}, {4'd1, 4'bxxxx}, {4'd2, 4'bxxxx}: + state <= `STATE_DEAL_D3; + /* Banker stands otherwise. */ + default: state <= `STATE_END; + endcase + {1'b1, `STATE_DEAL_D3}: + state <= `STATE_END; + {1'b1, `STATE_END}: + state <= `STATE_END; + default: + state <= `STATE_DEAL_P1; + endcase + + always_comb begin + {player_win_light, dealer_win_light, + load_pcard1, load_pcard2, load_pcard3, + load_dcard1, load_dcard2, load_dcard3} + = 8'b0; + + case (state) + `STATE_DEAL_P1: load_pcard1 = 1'b1; + `STATE_DEAL_P2: load_pcard2 = 1'b1; + `STATE_DEAL_P3: load_pcard3 = 1'b1; + `STATE_DEAL_D1: load_dcard1 = 1'b1; + `STATE_DEAL_D2: load_dcard2 = 1'b1; + `STATE_DEAL_D3: load_dcard3 = 1'b1; + `STATE_END: begin + if (pscore >= dscore) player_win_light = 1'b1; + if (dscore >= pscore) dealer_win_light = 1'b1; + end + endcase + end +endmodule: statemachine |