Inspiré par cette question Game of Life .
Wireworld simule des "électrons" traversant des "fils", dont les dispositions simples produisent un comportement typique de porte logique.
Je vous mets au défi de construire une horloge numérique dans l'automate cellulaire Wireworld. Votre horloge doit compter vers le haut de 00h00 à 23h59 de la manière habituelle, ou jusqu'à 11h59 avec un indicateur AM / PM, puis réinitialiser.
Votre entrée doit être visiblement divisée en deux parties. La partie A doit contenir toute la logique de non-affichage, toutes les parties impliquées dans l'incrémentation et la boucle des chiffres. La partie B sera l'affichage et la logique qui le pilote. La seule connexion entre ces deux parties devrait être 16 fils représentant les quatre chiffres de l'heure en BCD (avec un fil en option pour l'indicateur AM / PM et un fil en option pour une ligne d'horloge de signal si vos signaux ne sont pas continus). (EDIT: les fils toujours nuls peuvent être omis)
La synchronisation du comportement d'horloge doit être cohérente. La simulation devrait prendre le même nombre de ticks pour chacune des 1440 transitions entre états. Tous les électrons sur les 16 fils doivent être émis par la partie A en même temps et commencer leur voyage en parallèle.
Il s'agit d'une compétition de code-golf. Votre score est l'aire du rectangle de délimitation aligné autour de la partie A.
Par analogie, s'il s'agissait d'un langage textuel, votre score serait la taille de la fonction de gestion de l'horloge produisant quatre sorties 4 bits, qui contient une boucle et la logique pour 4 compteurs, pas la fonction qui décode et imprime cette sortie.
Votre partie B peut être aussi grande ou petite que vous le souhaitez. Il est uniquement nécessaire pour que la sortie de votre soumission puisse être vue par quelqu'un qui l'exécute, car il n'y a pas de moyen facile de simplement "déboguer" les sorties d'un circuit wireworld. Plusieurs circuits BCD-> 7 segments sont disponibles en ligne. N'hésitez pas à utiliser celui que vous souhaitez, ou créez le vôtre si vous avez besoin d'une ligne de signal cadencé, et affichez votre indicateur AM / PM à une échelle similaire aux chiffres.
EDIT: la partie B est désormais facultative. Si vous n'avez que les sorties BCD de votre partie A, n'hésitez pas à les soumettre. Il sera plus fastidieux de confirmer que l'horloge fonctionne, mais je peux très bien lire une rangée de bits dans une simulation interrompue.
Réponses:
Horloge à verrouillage
Score - 53 508 (dont seulement 36 828 sont activement utilisés en raison de la conception en forme de L)
Enregistrement de haute qualité - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Golly pattern - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmmw
Des principes directeurs -
Partie I: Le compteur de minutes
Mathématiques
Compter de 0 à 9 en binaire (pour le chiffre des minutes les moins significatives) va comme suit -
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
En lisant que sous forme de colonnes, le flux de bits le moins significatif (2 ^ 0 unités) passe à 01010101, le flux de 2 ^ 1 unités à 0011001100, le flux de 2 ^ 2 unités à 0000111100 et le flux de 2 ^ 3 unités à 0000000011.
Le premier est simple - il vous suffit de basculer 01 pour toujours. Le troisième est un flux de quatre 1, six 0, déphasé de six zéros. Le quatrième est un flux de huit 0 et deux 1.
Le second est un peu plus difficile car il a une asymétrie désagréable. Cependant, je remarque que (où. Est l'opérateur concat):
0011001100. 0011001100 = 0011001100. NON (1100110011) = 00110011001100110011 XOR 0000000000111111111111 = 5 (0011) XOR 00000000001111111111
(Par ailleurs, comme évoqué plus tard, la majorité de mon horloge fonctionne sur un ticker de 60 temps.
Conception
Les flux de sortie de haut en bas vont des unités de minutes (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3) puis des dizaines de minutes (2 ^ 0, 2 ^ 2, 2 ^ 1). Notez que les deux fils inférieurs sont croisés.
Partie II: Le compteur d'heures
Explication
L'entrée du compteur horaire est une impulsion électronique unique, une fois par heure. La première étape consiste à la réduire à une seule impulsion électronique, une fois toutes les douze heures. Ceci est réalisé en utilisant plusieurs primitives "verrouiller et rattraper".
Un «verrou» est une bascule de 6 microns connectée à un ET-NON et à une porte ET pour donner un verrou marche / arrêt de 6 microns. Un "catch" prend un flux continu d'électrons en entrée, laisse passer le premier, puis annihile tous les autres électrons derrière, jusqu'à ce que le flux se termine à quel point le catch se réinitialise.
Placer un verrou, suivi d'un verrou, en série, entraîne un électron dans -> allume le verrou, un électron à l'autre extrémité (le reste est capturé par le crochet). Ensuite, le deuxième électron entrant -> désactive le verrou, la capture se réinitialise silencieusement. Effet net: le premier électron passe à travers, le deuxième électron est annihilé, et ainsi de suite, quelle que soit la durée du retard entre ces électrons .
Maintenant, enchaînez deux "verrous et captures" en série, et vous n'avez plus qu'un électrons sur quatre à passer.
Ensuite, prenez un troisième "verrou et accrochage", mais cette fois, incorporez un quatrième verrou et accrochage sur la ligne SET de la bascule, entre la porte ET-NON et la bascule SET. Je vais vous laisser réfléchir à la façon dont cela fonctionne, mais cette fois, seul un électron sur trois passe, quelle que soit la durée du retard entre ces électrons .
Enfin, prenez un sur quatre électrons et un sur trois, combinez-les avec une porte ET, et seulement un sur douze électrons passe à travers. Cette section entière est le gâchis désordonné des chemins en haut à gauche du compteur d'heures ci-dessous.
Ensuite, prenez l'électron toutes les douze heures et divisez-le en un toutes les heures, mais sortez-les chacun sur un fil conducteur différent. Ceci est réalisé en utilisant le long conducteur enroulé avec treize points de sortie.
Prenez ces électrons - un par heure dans différents conducteurs, et frappez une ligne SET de bascule. La ligne RESET sur cette même bascule est alors frappée par le conducteur de l'heure suivante, donnant soixante impulsions sur chaque fil par heure.
Enfin - prenez ces impulsions et passez-les dans sept octets et demi de ROM (mémoire morte) pour sortir les flux binaires BCD corrects. Voir ici pour une explication plus détaillée de la ROM WireWorld: http://www.quinapalus.com/wires6.html
Conception
Remarques
Liens utiles
J'ai appris les bases de WireWorld sur http://www.quinapalus.com/wi-index.html . Une excellente ressource.
Pour créer et simuler l'automate cellulaire, j'ai utilisé Golly: http://golly.sourceforge.net/
J'ai pris la conception de la porte ET sur http://mathworld.wolfram.com/WireWorld.html
Et je viens juste de trouver cette page Web, je ne l'ai donc pas utilisée, mais elle a fière allure: http://karlscherer.com/Wireworld.html
la source
Mémoire de ligne à retard - 51 x 2880 = 146880
Zoom arrière:
La sortie sort du haut de chaque boucle.
Je mets tous les états directement sur le fil avec cette lua, laissant
golly
les électrons avancer entre les bits afin que nous n'ayons pas à suivre le fil avec un curseur.J'ai utilisé cette méthode naïve pour définir une barre et un cours accéléré wireworld, golly et lua.
Pour les tests, j'ai ajouté ces fils supérieurs et j'ai regardé leurs conseils.
Voici le script pour collecter les 4 ensembles de BCD 4 fils au globe oculaire.
La réponse finale nécessite l'élagage des lignes toujours nulles et le routage du reste vers leurs entrées BCD correctes.
la source