【发布时间】:2017-11-24 05:36:36
【问题描述】:
我正在制作一个简单的井字游戏,但有问题。
显然,“玩家”信号从来都不是我想要的。我尝试将其声明为布尔值并将其初始化为真,但它从未进入 if 子句;但是,当我将其更改为 false 时,它也没有进入子句。然后,我尝试将其更改为位,是的..同样的问题
library ieee;
use ieee.std_logic_1164.all;
entity ticTacToe is
port(
hex: OUT STD_LOGIC_VECTOR(0 TO 6);
useless : out bit := '1';
win_X : out bit := '1';
win_O : out bit := '1';
row0line0_in : in std_logic := 'U';
row1line0_in : in std_logic := 'U';
row2line0_in : in std_logic := 'U';
row0line1_in : in std_logic := 'U';
row1line1_in : in std_logic := 'U';
row2line1_in : in std_logic := 'U';
row0line2_in : in std_logic := 'U';
row1line2_in : in std_logic := 'U';
row2line2_in : in std_logic := 'U'
);
end ticTacToe;
architecture behaviour of ticTacToe is
signal player : bit; --X starts game
shared variable wins : boolean := false;
shared variable row0line0 : std_logic := 'U';
shared variable row1line0 : std_logic := 'U';
shared variable row2line0 : std_logic := 'U';
shared variable row0line1 : std_logic := 'U';
shared variable row1line1 : std_logic := 'U';
shared variable row2line1 : std_logic := 'U';
shared variable row0line2 : std_logic := 'U';
shared variable row1line2 : std_logic := 'U';
shared variable row2line2 : std_logic := 'U';
function winner(row0line0, row0line1, row0line2, row1line0, row1line1,
row1line2, row2line0, row2line1, row2line2:std_logic) return boolean is
begin
--check if X wins
if(row0line0 = '1' and row0line1 = '1' and row0line2 = '1') then
win_X <= '0';
end if;
if(row0line0 = '1' and row1line0 = '1' and row2line0 = '1') then
win_X <= '0';
end if;
if(row0line0 = '1' and row1line1 = '1' and row2line2 = '1') then
win_X <= '0';
end if;
if(row1line0 = '1' and row1line1 = '1' and row1line2 = '1') then
win_X <= '0';
end if;
if(row2line0 = '1' and row2line1 = '1' and row2line2 = '1') then
win_X <= '0';
end if;
if(row2line0 = '1' and row1line1 = '1' and row0line2 = '1') then
win_X <= '0';
end if;
if(row0line1 = '1' and row1line1 = '1' and row2line1 = '1') then
win_X <= '0';
end if;
if(row0line2 = '1' and row1line2 = '1' and row2line2 = '1') then
win_X <= '0';
end if;
--check if O wins
if(row0line0 = '0' and row0line1 = '0' and row0line2 = '0') then
win_O <= '0';
end if;
if(row0line0 = '0' and row1line0 = '0' and row2line0 = '0') then
win_O <= '0';
end if;
if(row0line0 = '0' and row1line1 = '0' and row2line2 = '0') then
win_O <= '0';
end if;
if(row1line0 = '0' and row1line1 = '0' and row1line2 = '0') then
win_O <= '0';
end if;
if(row2line0 = '0' and row2line1 = '0' and row2line2 = '0') then
win_O <= '0';
end if;
if(row2line0 = '0' and row1line1 = '0' and row0line2 = '0') then
win_O <= '0';
end if;
if(row0line1 = '0' and row1line1 = '0' and row2line1 = '0') then
win_O <= '0';
end if;
if(row0line2 = '0' and row1line2 = '0' and row2line2 = '0') then
win_O <= '0';
end if;
return false;
end winner;
begin
--variable becomes '0' for player O and '1' for player X
process(row0line0_in, row0line1_in, row0line2_in, row1line0_in, row1line1_in,
row1line2_in, row2line0_in, row2line1_in, row2line2_in)is
begin
if(row0line0_in'event and row0line0_in = '1')then
if(player = '0')then
row0line0 := '1';
else
useless <= '0';
row0line0 := '0';
end if;
end if;
if(row0line1_in'event and row0line1_in = '1')then
if(player = '0')then
row0line1 := '1';
else
row0line1 := '0';
end if;
end if;
if(row0line2_in'event and row0line2_in = '1')then
if(player = '0')then
row0line2 := '1';
else
row0line2 := '0';
end if;
end if;
if(row1line0_in'event and row1line0_in = '1')then
if(player = '0')then
row1line0 := '1';
else
row1line0 := '0';
end if;
end if;
if(row1line1_in'event and row1line1_in = '1')then
if(player = '0')then
row1line1 := '1';
else
row1line1 := '0';
end if;
end if;
if(row1line2_in'event and row1line2_in = '1')then
if(player = '0')then
row1line2 := '1';
else
row1line2 := '0';
end if;
end if;
if(row2line0_in'event and row2line0_in = '1')then
if(player = '0')then
row2line0 := '1';
else
row2line0 := '0';
end if;
end if;
if(row2line1_in'event and row2line1_in = '1')then
if(player = '0')then
row2line1 := '1';
else
row2line1 := '0';
end if;
end if;
if(row2line2_in'event and row2line2_in = '1') then
if(player = '0')then
row2line2 := '1';
else
row2line2 := '0';
end if;
end if;
player <= not player;
end process;
--check winner
process(player)is
begin
wins := winner(row0line0, row0line1, row0line2, row1line0, row1line1,
row1line2, row2line0, row2line1, row2line2);
end process;
end behaviour;
如果有人知道问题可能是什么,我将不胜感激!
【问题讨论】:
-
如果您查看FPGA Tic Tac Toe,您会发现游戏板由多色 LED 组成,一个玩家为红色,另一个玩家为绿色。这意味着游戏板在 3x3 网格上的每个位置都有两个位。请注意,它使用时钟(和重置)。还要注意它在两条对角线上的得分。
标签: vhdl fpga tic-tac-toe