Как реализовать игру Lights-Out, используя логические ворота или шлепки?

9

Во-первых, для тех, кто не знаком с игрой, так работает игра,

игровой процесс

Цель игры состоит в том, чтобы выключить все источники света, которые называются «Lights Out», и каждое нажатие кнопки / источника света инвертирует свое состояние, а также соседних с ним север / юг / восток / запад соседей, и это в значительной степени ,

Теперь я могу подумать о том, чтобы использовать SR-триггеры или JK-триггеры. Это связано с его способностью выступать в качестве элемента хранения (начальное состояние и следующее состояние). Но я не могу думать о способах их реализации.

Другая идея заключается в том, что каждый набор кнопок и смежных (NSEW) кнопок / индикаторов будет иметь свою собственную таблицу истинности, например:

логическая таблица

но возможно ли, чтобы входные переменные были такими же, как выходные переменные? Есть ли другие способы сделать это?

Julienn
источник

Ответы:

9

Очевидный подход состоит в том, чтобы использовать процессор и делать все это в прошивке.

Однако, если бы мне действительно нужно было сделать это с каменными ножами и шкурами медведя по какой-то причине, я бы посвятил переключающий триггер на каждую клетку. Триггер каждого квадрата будет переключаться нажатием его кнопки или одной из четырех соседних кнопок. Конечно, эти нажатия кнопок должны быть отменены. Опять же, это будет проще в прошивке.

Аппаратное решение не будет таким уж сложным, но все будет воспроизведено 25 раз, что сделает его большим и утомительным для сборки.

Добавлено:

Видимо, приведенное выше описание недостаточно ясно. Вот схема того, что находится в каждой ячейке:

Другие 4 входа в вентиль NAND приводятся в действие от нечетких сигналов 4 окружающих кнопок, которые также должны переключать состояние этого квадрата. Аналогичным образом, дебасовый сигнал от этой кнопки также поступает на один из входов NAND gate каждой из 4 окружающих ячеек.

Олин Латроп
источник
1
Это звучит как самая выполнимая вещь. Я бы использовал TFF и привязал бы все входы T к «1». Тогда у меня был бы кратковременный переключатель SPDT для каждой кнопки. Свяжите один бросок с «0», один бросок с «1», а затем полюс с соответствующими тактовыми входами TFF. Затем, когда вы нажимаете переключатель, он переключает окружающие триггеры, генерируя один положительный / отрицательный фронт.
Шамтам
1
@Shamtam: Да, это один из способов отменить, если у вас есть переключатели SPDT. Однако большинство кнопок просто нормально открыты SPST.
Олин Латроп
Я предполагаю, что мне придется использовать SPDT-переключатель для отмены выбора, будь то кнопка или нет. Теперь я понимаю, как подключить входы этой игры, но я не понимаю, как подключить выходы к светодиодам. Я имею в виду, что это не может быть просто вывод (Q) на светодиод и его соседей (Q '), верно? Кроме того, еще один вопрос, нужно ли использовать вход тактового сигнала TFF? Если да, то как?
Julienn
2
Триггер для каждой ячейки напрямую управляет ее светодиодом. Логика, связанная с соседними ячейками, вводится во вход для флип-флип, но выход остается локальным для ячейки. Нет, переключатели SPDT не требуются для устранения неполадок. Существуют различные способы устранения одного сигнала, например, от SPST-переключателя.
Олин Латроп
1
Нет, вы не понимаете логику. Обычно дебазованные выходы имеют высокий уровень, поэтому все входы в вентиль NAND имеют высокий уровень, что приводит к низкому уровню выходного сигнала. Когда какая-либо кнопка нажата, этот вход NAND получает низкий уровень, в результате чего выход NAND становится высоким. Этот низкий к верхнему краю заставляет FF переключать свое состояние.
Олин Латроп
0

Я бы сказал, что T триггеры, вероятно, будут самыми простыми, поскольку вы можете переключать их выходное состояние одним входом. Вы можете использовать один триггер для каждого светодиода, а вход связан с кнопкой, а выход - с светодиодом. Затем вы можете привязать каждую кнопку к входам 4 соседних триггеров, чтобы также переключать их состояние.

Если вы хотите использовать триггеры JK, вы можете сделать из них триггеры, передав свой вход на оба входа (J и K)

анонимное
источник
2
Вы могли бы расширить свой ответ, объяснив, как вы подключаете 5 переключателей к каждому триггеру, не мешая друг другу. Кроме того, как насчет переключателя отказов?
Дэйв Твид
0

Если бы кто-то хотел построить такую ​​игру размером до 7х7 из дискретной логики, наиболее практичным вариантом было бы, вероятно, использовать регистр сдвига с обращением для хранения состояния доски и шестибитовый счетчик для отслеживания сдвига. положение данных в реестре. Сдвиг данных через сдвиг в группах по 8 бит для управления мультиплексным дисплеем и сканирования мультиплексной клавиатуры. Имейте семибитовый счетчик «перевернутого света», который будет работать всякий раз, когда младшие шесть битов отличны от нуля, или когда состояние старшего бита совпадает с состоянием текущей декодированной кнопки. Переворачивайте состояние текущего источника света всякий раз, когда применимо все следующее:

6-bit counter isn't  xxx111
6-bit counter isn't  111xxx
7-bit counter isn't xxxxx00
7-bit counter isn't xx00xxx
7-bit counter is    00xx0xx

Обратите внимание, что, хотя для декодирования этих состояний счетчика потребуется значительное количество логики, это будет тривиально по сравнению с количеством микросхем, необходимых для реализации каждого источника света отдельно.

Supercat
источник