aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarrick Lo <warrick.s.z.lo@gmail.com>2026-02-03 07:36:04 -0800
committerWarrick Lo <warrick.s.z.lo@gmail.com>2026-02-03 07:36:04 -0800
commit7df28b9e812f278a93bdc68dea2c33850d2506af (patch)
tree9c57f63d34154811b3c430c32d8170e3255b6752
parentAdd 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.sv2
-rw-r--r--task5/statemachine.sv96
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;