Simon dice sin microcontrolador

Me gustaría crear el juego clásico de Simon Says utilizando nada más que circuitos lógicos, LED e IC, sin microcontroladores como el Arduino.

Me gustaría usar 4 LED y 4 interruptores táctiles para este circuito.

Estoy haciendo esto como un ejercicio educativo para mí, no estoy estudiando electrónica, sin embargo, estoy estudiando Ciencias de la Computación.

Entiendo que necesitaré varios componentes, incluidos contadores de décadas y temporizadores 555.

Sin embargo, mi pregunta es, ¿cómo puedo decidir qué LED mostrar en una secuencia aleatoria? Entiendo que puedo usar contadores de décadas/Flip Flops para almacenar la secuencia en la memoria.

Respuestas (1)

En general, para generar números "aleatorios" en hardware (para fines de entretenimiento), puede hacer algo como tomar un mecanismo que es algo impredecible y combinarlo con un mecanismo que es predecible, pero no obvio.

Por ejemplo, si tiene un contador que se ejecuta rápidamente y muestra la salida cada vez que el usuario presiona un botón (como mientras se reproduce la secuencia anterior), será algo aleatorio, ya que pueden tomar cantidades variables de tiempo. Pero alguien que juega con el sistema presionando los botones muy rápidamente podría tender a obtener los mismos valores una y otra vez (aunque si el reloj está en el rango de MHz, puede que no sea una preocupación realista).

Por el contrario, puede usar un registro de cambio de retroalimentación lineal (Wikipedia) que alimenta una función combinatoria del estado actual de un registro de cambio en su entrada, para generar una secuencia que no es obvia para los humanos, aunque su salida para las mismas entradas en realidad será completamente predecible. Usado solo, esto tampoco sería una buena idea, ya que daría las mismas secuencias en cada jugada del juego y sería memorizado rápidamente por un usuario repetido.

Pero, si combina dos métodos, como usar el temporizador para obtener un valor inicial impredecible y luego usar el registro de desplazamiento de retroalimentación lineal para mezclarlo (o tal vez dejar que el LFSR funcione libremente contra un reloj rápido y muestrearlo en función de interacción del usuario) debería poder obtener algo lo suficientemente aleatorio para un juego de entretenimiento.

Otra fuente que podría probar serían los bits de bajo orden de un convertidor de analógico a digital.

Hagas lo que hagas, probablemente querrás simularlo (y también el diseño general de tu sistema) antes de construir el circuito. El proyecto es lo suficientemente complejo como para que valga la pena usar un FPGA pequeño o un CPLD más grande.

Y, finalmente, tenga en cuenta que, históricamente, el juego original de Simon aparentemente usaba un microprocesador temprano, el TMS1000. En general, las operaciones secuenciales complejas se pueden implementar de manera más eficiente de esa manera, con máquinas de estado elegidas solo para problemas que son simples, deben ejecutarse extremadamente rápido o son sustitutos de aprendizaje para el trabajo eventual en tales problemas.

Editar:

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

Contiene algunas observaciones interesantes, incluido un cambio eventual del TMS1000 a lo que puede ser una versión etiquetada personalizada del mismo. Más relevante para su pregunta, sugiere que el original generó sus números aleatorios al muestrear un contador de ejecución libre cuando el usuario presionó un botón ;-)

Me pregunto cuántos chips, o cuán complejo sería un CPLD, para construir un "procesador" que pudiera manejar un juego similar a la unidad de la marca Simon usando un "programa" almacenado en una ROM. Supongo que podría hacerse con menos de una docena de chips discretos disponibles en el mercado y una ROM de 32Kx8 o más pequeña; cuantos más chips, menor será la ROM que se requerirá. Si uno no necesitara el "juego 2", un registro de desplazamiento de retroalimentación basado en software podría manejar cualquier longitud de "secuencia" con aproximadamente 40 bits de almacenamiento (al elegir una secuencia de color, ejecute un LFSR de 20 bits hasta que se presione un botón , luego copiarlo...
... a un registro de respaldo. Luego reproduzca la secuencia generada por ese LFSR, copie el registro de respaldo nuevamente al LFSR y espere a que el usuario presione los botones en esa secuencia.