1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
`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,
load_dcard1, load_dcard2, load_dcard3,
player_win_light, dealer_win_light);
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, state_next;
/* 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,
load_dcard1, load_dcard2, load_dcard3}
= 8'b0;
case (state)
`STATE_DEAL_P1: load_pcard1 = 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_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;
end
endcase
end
endmodule: statemachine
|