Саймон говорит без микроконтроллера

8

Я хотел бы создать классическую игру Simon Says, использующую только логические схемы, светодиоды и ИС, а не микроконтроллеры, такие как Arduino.

Я хотел бы использовать 4 светодиода и 4 тактильных переключателя для этой схемы.

Я делаю это как учебное упражнение для себя, я не изучаю электронику, но я изучаю информатику.

Я понимаю, что мне понадобится несколько компонентов, включая счетчики десятилетий и 555 таймеров.

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

Джейкоб Кларк
источник

Ответы:

5

Как правило, для генерации случайных чисел в аппаратных средствах (для целей развлечения) вы можете сделать что-то, например, взять механизм, который несколько непредсказуем, и объединить его с механизмом, который предсказуем, но не очевиден.

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

И наоборот, вы можете использовать регистр сдвига с линейной обратной связью (Википедия), который передает комбинаторную функцию текущего состояния регистра сдвига обратно на его вход, чтобы сгенерировать последовательность, которая не является очевидной для человека, даже если ее выход для тех же входов на самом деле будет полностью предсказуемым. Само по себе это тоже не было бы хорошей идеей, так как при каждой игре играли бы одинаковые последовательности и так быстро запоминались бы повторным пользователем.

Но, если вы комбинируете два метода, таких как использование таймера для получения непредсказуемого начального значения, а затем использование регистра сдвига с линейной обратной связью, чтобы смешать его (или, возможно, позволить LFSR свободно работать против быстрых часов, и производить выборку на основе взаимодействие с пользователем) вы должны быть в состоянии получить что-то достаточно случайное для развлекательной игры.

Другой источник, который вы могли бы попробовать - это младшие биты аналого-цифрового преобразователя.

Что бы вы ни делали, вы, вероятно, захотите смоделировать это (и ваш общий дизайн системы), прежде чем строить схему. Проект достаточно сложный, поэтому стоит использовать небольшую FPGA или более крупную CPLD.

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

Редактировать:

http://www.waitingforfriday.com/index.php/Reverse_engineering_an_MB_Electronic_Simon_game

Содержит некоторые интересные наблюдения, включая возможное изменение с TMS1000 на то, что может быть его специальной маркировкой. Более релевантный вашему вопросу, он предполагает, что оригинал генерировал свои случайные числа путем выборки счетчика свободного хода, когда пользователь нажимал кнопку ;-)

Крис Страттон
источник
Интересно, сколько микросхем или сложный CPLD потребуется для создания «процессора», который мог бы обрабатывать игру, аналогичную бренду Simon, используя «программу», хранящуюся в ПЗУ? Я думаю, что это может быть сделано с менее чем дюжиной готовых дискретных чипов и ПЗУ 32Kx8 или меньше; чем больше чипов, тем меньше ПЗУ, которое потребуется. Если вам не нужна «игра 2», программный регистр сдвига с обратной связью может обрабатывать любую длину «последовательности» с 40 или около того битами памяти (при выборе цветовой последовательности запускайте 20-битный LFSR до нажатия кнопки , затем скопируйте это ...
суперкат
... в резервный регистр. Затем воспроизведите последовательность, сгенерированную этим LFSR, скопируйте резервный регистр обратно в LFSR и подождите, пока пользователь нажмет кнопки в этой последовательности.
суперкат