Inspirado en esta pregunta de Game of Life .
Wireworld simula los "electrones" que fluyen a través de los "cables", cuyos arreglos simples producen el comportamiento típico de la puerta lógica.
Te desafío a construir un reloj digital en el autómata celular Wireworld. Su reloj debe contar hacia arriba de 00:00 a 23:59 de la manera habitual, o hasta las 11:59 con un indicador AM / PM, luego reiniciar.
Su entrada debe estar visiblemente dividida en dos partes. La Parte A debe contener toda la lógica de no visualización, todas las partes involucradas en el incremento y el bucle de los dígitos. La Parte B será la pantalla y la lógica que lo impulsa. La única conexión entre estas dos partes debe ser 16 cables que representan los cuatro dígitos del tiempo en BCD (con un cable opcional para el indicador AM / PM y un cable opcional para una línea de reloj de señal si sus señales no son continuas). (EDITAR: siempre se pueden omitir cables cero)
El momento del comportamiento del reloj debe ser consistente. La simulación debería tomar la misma cantidad de ticks para cada una de las 1440 transiciones entre estados. Todos los electrones en los 16 cables deben emitirse desde la parte A al mismo tiempo y comenzar su viaje en paralelo.
Esta es una competencia de código de golf. Su puntaje es el área del cuadro delimitador alineado con el eje que rodea la parte A.
Por analogía, si este fuera un lenguaje textual, su puntaje sería el tamaño de la función de gestión del reloj que produce cuatro salidas de 4 bits, que contiene un bucle y la lógica para 4 contadores, no la función que decodifica e imprime esa salida.
Su parte B puede ser tan grande o pequeña como desee. Solo es necesario para que alguien que lo ejecute pueda ver la salida de su envío, ya que no hay una manera fácil de simplemente "depurar" las salidas de un circuito de mundo de cables. Hay varios circuitos BCD-> 7 segmentos disponibles en línea. Siéntase libre de usar el que desee, o haga el suyo si necesita una línea de señal sincronizada, y muestre su indicador AM / PM a una escala similar a los dígitos.
EDITAR: la Parte B ahora es opcional. Si solo tiene las salidas BCD de su parte A, no dude en enviarlas. Será más tedioso confirmar que el reloj funciona, pero puedo leer una fila de bits muy bien en una simulación en pausa.
fuente
Respuestas:
Reloj de enganche
Puntuación: 53,508 (de los cuales solo 36,828 se usan activamente debido al diseño en forma de L)
Grabación de alta calidad - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Patrón Golly - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw
Principios rectores -
Parte I: El contador de minutos
Matemáticas
El conteo de 0 a 9 en binario (para el dígito de minutos menos significativo) es el siguiente:
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
Leyendo que como columnas, el flujo menos significativo (2 ^ 0 unidades de bits) va 01010101, el flujo de 2 ^ 1 unidades va 0011001100, el flujo de 2 ^ 2 unidades va 0000111100 y el flujo de 2 ^ 3 unidades va 0000000011.
El primero es fácil: solo voltear y voltear 01 para siempre. El tercero es un flujo de cuatro 1s, seis 0s, fase desplazada por seis ceros. El cuarto es un flujo de ocho ceros y dos ceros.
El segundo es un poco más difícil ya que tiene una asimetría desagradable. Sin embargo, noto que (donde. Es operador concat):
0011001100. 0011001100 = 0011001100. NO (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 00000000001111111111
(Por cierto, como se mencionó más adelante, la mayoría de mi reloj funciona con un ticker de 60 latidos. La onda de doble longitud 00000000001111111111 es donde entra en juego la necesidad del ticker de 120 latidos).
Diseño
Los flujos de salida de arriba a abajo van Unidades de minutos (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3) y luego Decenas de minutos (2 ^ 0, 2 ^ 2, 2 ^ 1). Tenga en cuenta que los dos cables inferiores están cruzados.
Parte II: El contador de horas
Explicación
La entrada al contador de horas es un pulso electrónico único, una vez por hora. El primer paso es reducir esto a un solo pulso de electrones, una vez cada doce horas. Esto se logra utilizando varias primitivas de "enganche y captura".
Un "pestillo" es un flip-flop de 6 micrones conectado a un AND-NOT y una compuerta AND para proporcionar un pestillo de encendido / apagado de 6 micrones. Una "captura" toma una corriente continua de electrones como entrada, permite el primer paso, luego aniquila todos los demás electrones detrás, hasta que la corriente termina en ese punto la captura se restablece.
Colocar un pestillo, seguido de una captura, en serie, da como resultado que un electrón entre -> enciende el pestillo, un electrón sale del otro extremo (el resto queda atrapado por la captura). Luego, el segundo electrón en -> apaga el pestillo, la captura se reinicia en silencio. Efecto neto: el primer electrón pasa a través, el segundo electrón se aniquila, y así sucesivamente, independientemente de cuánto tiempo transcurra el retraso entre esos electrones .
Ahora encadene dos "pestillos y capturas" en serie, y solo tendrá que pasar uno de cada cuatro electrones.
A continuación, tome un tercer "pestillo y atrape", pero esta vez incruste un cuarto pestillo y atrape en la línea SET de flip-flop, entre la puerta AND-NOT y el SET de flip-flop. Te dejo para que pienses cómo funciona esto, pero esta vez solo uno de cada tres electrones pasa, independientemente de cuánto tiempo transcurra el retraso entre esos electrones. .
Finalmente, tome el uno de cada cuatro electrones, y el uno de cada tres, combínelos con una puerta AND, y solo uno de cada doce electrones pasa. Toda esta sección es el desordenado garabato de caminos hacia la parte superior izquierda del contador de horas a continuación.
Luego, tome el electrón cada doce horas y vuelva a dividirlo en uno cada hora, pero envíe cada uno a un cable conductor diferente. Esto se logra utilizando el conductor en espiral largo con trece puntos de salida.
Tome estos electrones, uno por hora por diferentes conductores, y golpee una línea SET de flip-flop. La línea RESET en ese mismo flip flop es golpeada por el conductor de la siguiente hora, dando sesenta pulsos por cada cable por hora.
Finalmente, tome estos pulsos y páselos a siete bytes y medio de ROM (memoria de solo lectura) para generar los flujos de bits BCD correctos. Consulte aquí para obtener una explicación más detallada de WireWorld ROM: http://www.quinapalus.com/wires6.html
Diseño
Notas
Enlaces útiles
Aprendí los conceptos básicos de WireWorld en http://www.quinapalus.com/wi-index.html . Un excelente recurso.
Para crear y simular el autómata celular utilicé Golly: http://golly.sourceforge.net/
Tomé el diseño de la compuerta AND de http://mathworld.wolfram.com/WireWorld.html
Y acabo de encontrar esta página web, así que no la usé, pero se ve muy bien: http://karlscherer.com/Wireworld.html
fuente
Memoria de línea de retardo: 51 x 2880 = 146880
Alejado:
La salida sale de la parte superior de cada bucle.
Puse todos los estados directamente en el cable con este lua, dejando
golly
los electrones avancen entre los bits para que no tengamos que seguir el cable con un cursor.Utilicé este método ingenuo para establecer un bar y un curso acelerado de Wireworld, Golly y Lua.
Para probar agregué estos cables superiores y observé sus consejos.
Aquí está la secuencia de comandos para recopilar los 4 conjuntos de BCD de 4 hilos al globo ocular.
La respuesta final requiere la poda de las líneas siempre cero y enrutar el resto a sus entradas BCD correctas.
fuente