Tic Tac Toe Verilog
Tic Tac Toe Verilog
input clock,
input reset,
input play,
input pc,
input [3:0] computer_position,player_position,
output wire [1:0] pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9,
output wire[1:0]who
);
wire [15:0] PC_en;
wire [15:0] PL_en;
wire illegal_move;
wire win;
wire computer_play;
wire player_play;
wire no_space;
winner_detector
win_detect_unit(pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9,win,who);
position_decoder pd1(computer_position,computer_play,PC_en);
position_decoder pd2(player_position,player_play,PL_en);
illegal_move_detector
imd_unit(pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9,PC_en[8:0],
PL_en[8:0],illegal_move);
nospace_detector nsd_unit(pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9,no_space);
fsm_controller
tic_tac_toe_controller(clock,reset,play,pc,illegal_move,no_space,win,computer_play,
player_play );
endmodule
// Position 1
always @(posedge clock or posedge reset)
begin
if(reset)
pos1 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos1 <= pos1;// keep previous position
else if(PC_en[0]==1'b1)
pos1 <= 2'b10; // store computer data
else if (PL_en[0]==1'b1)
pos1 <= 2'b01;// store player data
else
pos1 <= pos1;// keep previous position
end
end
// Position 2
always @(posedge clock or posedge reset)
begin
if(reset)
pos2 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos2 <= pos2;// keep previous position
else if(PC_en[1]==1'b1)
pos2 <= 2'b10; // store computer data
else if (PL_en[1]==1'b1)
pos2 <= 2'b01;// store player data
else
pos2 <= pos2;// keep previous position
end
end
// Position 3
// Position 4
always @(posedge clock or posedge reset)
begin
if(reset)
pos4 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos4 <= pos4;// keep previous position
else if(PC_en[3]==1'b1)
pos4 <= 2'b10; // store computer data
else if (PL_en[3]==1'b1)
pos4 <= 2'b01;// store player data
else
pos4 <= pos4;// keep previous position
end
end
// Position 5
always @(posedge clock or posedge reset)
begin
if(reset)
pos5 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos5 <= pos5;// keep previous position
else if(PC_en[4]==1'b1)
pos5 <= 2'b10; // store computer data
else if (PL_en[4]==1'b1)
pos5 <= 2'b01;// store player data
else
pos5 <= pos5;// keep previous position
end
end
// Position 6
always @(posedge clock or posedge reset)
begin
if(reset)
pos6 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos6 <= pos6;// keep previous position
else if(PC_en[5]==1'b1)
pos6 <= 2'b10; // store computer data
else if (PL_en[5]==1'b1)
pos6 <= 2'b01;// store player data
else
pos6 <= pos6;// keep previous position
end
end
// Position 7
always @(posedge clock or posedge reset)
begin
if(reset)
pos7 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos7 <= pos7;// keep previous position
else if(PC_en[6]==1'b1)
pos7 <= 2'b10; // store computer data
else if (PL_en[6]==1'b1)
pos7 <= 2'b01;// store player data
else
pos7 <= pos7;// keep previous position
end
end
// Position 8
always @(posedge clock or posedge reset)
begin
if(reset)
pos8 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos8 <= pos8;// keep previous position
else if(PC_en[7]==1'b1)
pos8 <= 2'b10; // store computer data
else if (PL_en[7]==1'b1)
pos8 <= 2'b01;// store player data
else
pos8 <= pos8;// keep previous position
end
end
// Position 9
always @(posedge clock or posedge reset)
begin
if(reset)
pos9 <= 2'b00;
else begin
if(illegal_move==1'b1)
pos9 <= pos9;// keep previous position
else if(PC_en[8]==1'b1)
pos9 <= 2'b10; // store computer data
else if (PL_en[8]==1'b1)
pos9 <= 2'b01;// store player data
else
pos9 <= pos9;// keep previous position
end
end
endmodule
parameter IDLE=2'b00;
parameter PLAYER=2'b01;
parameter COMPUTER=2'b10;
parameter GAME_DONE=2'b11;
always @(*)
begin
case(current_state)
IDLE: begin
if(reset==1'b0 && play == 1'b1)
next_state <= PLAYER;
else
next_state <= IDLE;
player_play <= 1'b0;
computer_play <= 1'b0;
end
PLAYER:begin
player_play <= 1'b1;
computer_play <= 1'b0;
if(illegal_move==1'b0)
next_state <= COMPUTER;
else
next_state <= IDLE;
end
COMPUTER:begin
player_play <= 1'b0;
if(pc==1'b0) begin
next_state <= COMPUTER;
computer_play <= 1'b0;
end
else if(win==1'b0 && no_space == 1'b0)
begin
next_state <= IDLE;
computer_play <= 1'b1;
end
else if(no_space == 1 || win ==1'b1)
begin
next_state <= GAME_DONE;
computer_play <= 1'b1;
end
end
GAME_DONE:begin
player_play <= 1'b0;
computer_play <= 1'b0;
if(reset==1'b1)
next_state <= IDLE;
else
next_state <= GAME_DONE;
end
assign no_space =((((((((temp1 & temp2) & temp3) & temp4) & temp5) & temp6) &
temp7) & temp8) & temp9);
endmodule