diff options
| author | Warrick Lo <warrick.s.z.lo@gmail.com> | 2026-02-03 07:36:04 -0800 |
|---|---|---|
| committer | Warrick Lo <warrick.s.z.lo@gmail.com> | 2026-02-03 07:36:04 -0800 |
| commit | 7df28b9e812f278a93bdc68dea2c33850d2506af (patch) | |
| tree | 9c57f63d34154811b3c430c32d8170e3255b6752 | |
| parent | Add task 5 code, state machine broken in edge cases (diff) | |
Redesign state machine
Signed-off-by: Warrick Lo <warrick.s.z.lo@gmail.com>
| -rw-r--r-- | task5/datapath.sv | 2 | ||||
| -rw-r--r-- | task5/statemachine.sv | 96 |
2 files changed, 50 insertions, 48 deletions
diff --git a/task5/datapath.sv b/task5/datapath.sv index 03f408d..ea99794 100644 --- a/task5/datapath.sv +++ b/task5/datapath.sv @@ -12,6 +12,8 @@ module datapath(slow_clock, fast_clock, resetb, logic [3:0] new_card, pcard1, pcard2, pcard3, dcard1, dcard2, dcard3; + assign pcard3_out = pcard3; + reg4 PCard1(new_card, load_pcard1, slow_clock, resetb, pcard1); reg4 PCard2(new_card, load_pcard2, slow_clock, resetb, pcard2); reg4 PCard3(new_card, load_pcard3, slow_clock, resetb, pcard3); diff --git a/task5/statemachine.sv b/task5/statemachine.sv index d6e9ae0..94dd95d 100644 --- a/task5/statemachine.sv +++ b/task5/statemachine.sv @@ -1,10 +1,10 @@ -`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 +`define STATE_DEAL_P1 3'd0 +`define STATE_DEAL_D1 3'd1 +`define STATE_DEAL_P2 3'd2 +`define STATE_DEAL_D2 3'd3 +`define STATE_DEAL_X1 3'd4 +`define STATE_DEAL_X2 3'd5 +`define STATE_END 3'd6 module statemachine(slow_clock, resetb, dscore, pscore, pcard3, load_pcard1, load_pcard2, load_pcard3, @@ -17,47 +17,28 @@ module statemachine(slow_clock, resetb, dscore, pscore, pcard3, load_dcard1, load_dcard2, load_dcard3, player_win_light, dealer_win_light; - logic [2:0] state; + logic [2:0] state, state_next; - 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; + /* Current state register. */ + always_ff @(posedge slow_clock) + if (~resetb) state <= `STATE_DEAL_P1; + else state <= state_next; + + /* Next state logic. */ + always_comb case (state) + `STATE_DEAL_P1: state_next = `STATE_DEAL_D1; + `STATE_DEAL_D1: state_next = `STATE_DEAL_P2; + `STATE_DEAL_P2: state_next = `STATE_DEAL_D2; + `STATE_DEAL_D2: state_next = `STATE_DEAL_X1; + `STATE_DEAL_X1: + if ((dscore <= 7) && (pscore <= 5)) + state_next = `STATE_DEAL_X2; + else + state_next = `STATE_END; + default: state_next = `STATE_END; endcase + /* Output logic. */ always_comb begin {player_win_light, dealer_win_light, load_pcard1, load_pcard2, load_pcard3, @@ -66,11 +47,30 @@ module statemachine(slow_clock, resetb, dscore, pscore, pcard3, 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_P2: load_pcard2 = 1'b1; `STATE_DEAL_D2: load_dcard2 = 1'b1; - `STATE_DEAL_D3: load_dcard3 = 1'b1; + `STATE_DEAL_X1: + /* Check for natural eight and nines first. */ + if ((dscore <= 7) && (pscore <= 5)) + load_pcard3 = 1'b1; + else if ((pscore <= 7) && (dscore <= 5)) + load_dcard3 = 1'b1; + `STATE_DEAL_X2: 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}: + load_dcard3 = 1'b1; + endcase `STATE_END: begin if (pscore >= dscore) player_win_light = 1'b1; if (dscore >= pscore) dealer_win_light = 1'b1; |