Я удалил свой первоначальный ответ, так как @ 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;