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

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

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

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

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

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

Ответы (1)

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

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

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

Но если вы объедините два метода, например, использование таймера для получения непредсказуемого начального значения, а затем использование регистра сдвига с линейной обратной связью, чтобы смешать его (или, возможно, позволить 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 и подождите, пока пользователь не нажмет кнопки в этой последовательности.