-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathresult.v
78 lines (71 loc) · 3.03 KB
/
result.v
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
// Combinatorial logic to determine if a
// board layout is a win for X, a win for O, a
// draw or none of the above.
//
// Author: Warren Toomey
// (c) 2018, Warren Toomey, GPL3
`default_nettype none
module result(i_board, o_result);
input wire [17:0] i_board;
output reg [1:0] o_result;
localparam NONE = 0;
localparam XWIN = 1;
localparam OWIN = 2;
localparam DRAW = 3;
// An X move is 11, an O move is 01 on the board
always @(*)
// See if we have the right bit pattens for X wins and O wins
if ((i_board & 18'b111111000000000000) == 18'b111111000000000000)
o_result = XWIN;
else if ((i_board & 18'b111111000000000000) == 18'b010101000000000000)
o_result = OWIN;
else if ((i_board & 18'b000000111111000000) == 18'b000000111111000000)
o_result = XWIN;
else if ((i_board & 18'b000000111111000000) == 18'b000000010101000000)
o_result = OWIN;
else if ((i_board & 18'b000000000000111111) == 18'b000000000000111111)
o_result = XWIN;
else if ((i_board & 18'b000000000000111111) == 18'b000000000000010101)
o_result = OWIN;
else if ((i_board & 18'b110000110000110000) == 18'b110000110000110000)
o_result = XWIN;
else if ((i_board & 18'b110000110000110000) == 18'b010000010000010000)
o_result = OWIN;
else if ((i_board & 18'b001100001100001100) == 18'b001100001100001100)
o_result = XWIN;
else if ((i_board & 18'b001100001100001100) == 18'b000100000100000100)
o_result = OWIN;
else if ((i_board & 18'b000011000011000011) == 18'b000011000011000011)
o_result = XWIN;
else if ((i_board & 18'b000011000011000011) == 18'b000001000001000001)
o_result = OWIN;
else if ((i_board & 18'b110000001100000011) == 18'b110000001100000011)
o_result = XWIN;
else if ((i_board & 18'b110000001100000011) == 18'b010000000100000001)
o_result = OWIN;
else if ((i_board & 18'b000011001100110000) == 18'b000011001100110000)
o_result = XWIN;
else if ((i_board & 18'b000011001100110000) == 18'b000001000100010000)
o_result = OWIN;
// See if we have some empty squares still left
else if ((i_board & 18'b110000000000000000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b001100000000000000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000011000000000000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000000110000000000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000000001100000000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000000000011000000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000000000000110000) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000000000000001100) == 18'b000000000000000000)
o_result = NONE;
else if ((i_board & 18'b000000000000000011) == 18'b000000000000000000)
o_result = NONE;
// No winner, no empty squares, must be a draw
else o_result = DRAW;
endmodule