Tic Tac Toe VHDL Студенческий проект - PullRequest
1 голос
/ 14 апреля 2019

Проблема в том, что выходы не совпадают с ifs. Я хочу, пример строки A, если все равно 1, выход должен быть 11., но это не должно быть

library ieee;  
 use ieee.std_logic_1164.all;  
 use ieee.numeric_std.all;  

 entity galo_ports is  
  port( LinA : in unsigned(2 downto 0); 
    LinB : in unsigned(2 downto 0);
    LinC : in unsigned(2 downto 0);

    output : out unsigned(1 downto 0)); 
 end galo_ports;

ARCHITECTURE main OF galo_ports IS
SIGNAL values: std_logic_vector(1 downto 0);
SIGNAL condition1A: boolean;
SIGNAL condition2A: boolean;
SIGNAL condition3A: boolean;
SIGNAL condition1B: boolean;
SIGNAL condition2B: boolean;
SIGNAL condition3B: boolean;
SIGNAL condition1C: boolean;
SIGNAL condition2C: boolean;
SIGNAL condition3C: boolean;
SIGNAL condition1COL1: boolean;
SIGNAL condition2COL1: boolean;
SIGNAL condition3COL1: boolean;
SIGNAL condition1COL2: boolean;
SIGNAL condition2COL2: boolean;
SIGNAL condition3COL2: boolean;
SIGNAL condition1COL3: boolean;
SIGNAL condition2COL3: boolean;
SIGNAL condition3COL3: boolean;
SIGNAL condition1DIG1: boolean;
SIGNAL condition2DIG1: boolean;
SIGNAL condition3DIG1: boolean;
SIGNAL condition1DIG2: boolean;
SIGNAL condition2DIG2: boolean;
SIGNAL condition3DIG2: boolean;
BEGIN
values <= "10";

--CONDIÇÃOES:
--LINHA 1
condition1A <= LinA(0) = LinA(1) and LinA(1) = LinA(2);
condition2A <= LinA(0) = values(0) or LinA(0) = values(1);
condition3A <= LinA(0) = values(1);
--LINHA 2
condition1B <= LinB(0) = LinB(1) and LinB(1) = LinB(2);
condition2B <= LinB(0) = values(0) or LinB(0) = values(1);
condition3B <= LinB(0) = values(1);
--LINHA 3
condition1C <= LinC(0) = LinC(1) and LinC(1) = LinC(2);
condition2C <= LinC(0) = values(0) or LinC(0) = values(1);
condition3C <= LinC(0) = values(1);
--COLUNA 1
condition1COL1 <= LinA(0) = LinB(0) and LinB(0) = LinC(0);
condition2COL1 <= LinA(0) = values(0) or LinA(0) = values(1);
condition3COL1 <= LinA(0) = values(1);
--COLUNA 2
condition1COL2 <= LinA(1) = LinB(1) and LinB(1) = LinC(1);
condition2COL2 <= LinA(1) = values(0) or LinA(1) = values(1);
condition3COL2 <= LinA(1) = values(1);
--COLUNA 3
condition1COL3 <= LinA(2) = LinB(2) and LinB(2) = LinC(2);
condition2COL3 <= LinB(2) = values(0) or LinA(2) = values(1);
condition3COL3 <= LinB(2) = values(1);
--DIAGONAL 1
condition1DIG1 <= LinA(0) = LinB(1) and LinB(1) = LinC(2);
condition2DIG1 <= LinA(0) = values(0) or LinA(0) = values(1);
condition3DIG1 <= LinA(0) = values(1);
--DIAGONAL 2
condition1DIG2 <= LinA(2) = LinB(1) and LinB(1) = LinC(0);
condition2DIG2 <= LinA(2) = values(0) or LinA(2) = values(1);
condition3DIG2 <= LinA(2) = values(1);
    PROCESS(LinA, LinB, LinC)
    BEGIN
        --LINHA 1
        IF condition1A=TRUE and condition2A=TRUE and condition3A=TRUE THEN output <= "11";
        END IF;
        --LINHA 2
        IF (condition1B) and (condition2B) and (condition3B) THEN output <= "11"; ELSE output <="00";
        END IF;
        --LINHA 3
        IF condition1C and condition2C and condition3C THEN output <= "11";
        END IF;
        --COLUNA 1
        IF condition1COL1 and condition2COL1 and condition3COL1 THEN output <= "11";
        END IF;
        --COLUNA 2
        IF condition1COL2 and condition2COL2 and condition3COL2 THEN output <= "11";
        END IF;
        --COLUNA 3
        IF condition1COL3 and condition2COL3 and condition3COL3 THEN output <= "11";
        END IF;
        --DIAGONAL 1
        IF condition1DIG1 and condition2DIG1 and condition3DIG1 THEN output <= "11";
        END IF;
        --DIAGONAL 2
        IF condition1DIG2 and condition2DIG2 and condition3DIG2 THEN output <= "11";
        END IF;

    END PROCESS;
END main;

Игра содержит доску из 9 позиций, каждый игрок делает свой ход в свободном доме, помечая его «0» (игрок A) или «1» (игрок B).

Победа присуждается игроку, который может поставить 3 "0" или 3 "1" по горизонтали, вертикали или диагонали.

Решение должно сигнализировать на выходе, какой игрок выигрывает, или сигнализировать ничью - если ни один из игроков не может достичь поставленной цели.

1 Ответ

0 голосов
/ 16 апреля 2019

Я удалил свой первоначальный ответ, так как @ pm101 заметил, что он был совершенно не верен.

После компиляции вашего проекта в предупреждениях указывается очевидная причина:

Предупреждение оператора процесса VHDL на galo_ports.vhd (142): сигнал «condition1A» читается внутри оператора процесса, но не находится в Список чувствительности оператора процесса

Значения сигналов conditionXXX обновляются при изменении linA, linB или linC. Однако процесс выполняется одновременно, и значения этих сигналов состояния еще не обновлены. Если вы имитируете дизайн, вы увидите, что значение output отстает: оно обновляется при изменении входных данных, но, вероятно, будет отображать результат игры с предыдущими входными данными.

Исправить список чувствительности процесса, чтобы он содержал все сигналы состояния. Затем процесс будет выполнен, когда ваши conditionXXX сигналы изменятся и условные выражения будут оценены правильно. Так что-то вроде:

PROCESS(condition1A, condition2A, condition3A, condition1B, condition2B, condition3B, condition1C, condition2C, condition3C, condition1COl1, condition2COL1, condition3COL1, condition1COL2, condition2COL2, condition3COL2, condition1COL3, condition2COL3, condition3COL3, condition1DIG1, condition2DIG1, condition3DIG1, condition1DIG2, condition2DIG2, condition3DIG2)

Кроме того, я бы обернул этот список условий в один IF блок с ELSIF инструкциями. Затем в операторе ELSE вы также должны определить значение output, когда нет победителя (или 0 - победитель):

  --LINHA 1
  IF condition1A=TRUE and condition2A=TRUE and condition3A=TRUE THEN output <= "11";
  --LINHA 2
  ELSIF (condition1B) and (condition2B) and (condition3B) THEN output <= "11";
  --LINHA 3
  ELSIF condition1C and condition2C and condition3C THEN output <= "11";
  --COLUNA 1
  ELSIF condition1COL1 and condition2COL1 and condition3COL1 THEN output <= "11";
  --COLUNA 2
  ELSIF condition1COL2 and condition2COL2 and condition3COL2 THEN output <= "11";
  --COLUNA 3
  ELSIF condition1COL3 and condition2COL3 and condition3COL3 THEN output <= "11";
  --DIAGONAL 1
  ELSIF condition1DIG1 and condition2DIG1 and condition3DIG1 THEN output <= "11";
  --DIAGONAL 2
  ELSIF condition1DIG2 and condition2DIG2 and condition3DIG2 THEN output <= "11";
  ELSE output <= "00"; -- 0 wins or no winner. 
  END IF;
...