Inspiriert von dieser Game of Life-Frage .
Wireworld simuliert "Elektronen", die durch "Drähte" fließen, deren einfache Anordnungen ein typisches Logikgatterverhalten erzeugen.
Ich fordere Sie auf, eine Digitaluhr im Wireworld-Zellularautomaten zu bauen. Ihre Uhr muss wie gewohnt von 00:00 bis 23:59 Uhr aufwärts zählen oder mit einer AM / PM-Anzeige auf 11:59 Uhr, um dann zurückgesetzt zu werden.
Ihr Eintrag sollte sichtbar in zwei Teile geteilt sein. Teil A sollte die gesamte Nichtanzeigelogik und alle Teile enthalten, die an der Inkrementierung und Schleifenbildung der Ziffern beteiligt sind. Teil B wird das Display und die Logik sein, die es ansteuert. Die einzige Verbindung zwischen diesen beiden Teilen sollte aus 16 Kabeln bestehen, die die vier Stellen der Zeit in BCD darstellen (mit einem optionalen Kabel für die AM / PM-Anzeige und einem optionalen Kabel für eine Signaltaktleitung, wenn Ihre Signale nicht kontinuierlich sind). (BEARBEITEN: immer Null Drähte können weggelassen werden)
Das Timing des Uhrverhaltens sollte konsistent sein. Die Simulation sollte für jeden der 1440 Übergänge zwischen Zuständen dieselbe Anzahl von Ticks aufweisen. Alle Elektronen auf den 16 Drähten sollten gleichzeitig von Teil A emittiert werden und ihre Reise parallel beginnen.
Dies ist ein Code-Golf-Wettbewerb. Ihre Punktzahl ist der Bereich des achsenausgerichteten Begrenzungsrahmens, der Teil A umgibt.
Wenn dies eine Textsprache wäre, würde Ihre Punktzahl der Größe der Taktverwaltungsfunktion entsprechen, die vier 4-Bit-Ausgaben erzeugt, die eine Schleife und die Logik für 4 Zähler enthält, und nicht die Funktion, die diese Ausgabe decodiert und druckt.
Ihr Teil B kann so groß oder klein sein, wie Sie möchten. Es ist nur erforderlich, damit die Ausgabe Ihrer Übermittlung von jemandem gesehen werden kann, der sie ausführt, da es keine einfache Möglichkeit gibt, Ausgaben von einem Wireworld-Schaltkreis einfach zu "debuggen". Es sind mehrere BCD-> 7-Segment-Schaltkreise online verfügbar. Verwenden Sie einfach eine beliebige Option, oder erstellen Sie eine eigene, wenn Sie eine getaktete Signalleitung benötigen, und zeigen Sie Ihre AM / PM-Anzeige in einer Skala an, die den Ziffern ähnlich ist.
BEARBEITEN: Teil B ist jetzt optional. Wenn Sie nur die BCD-Ausgänge von Teil A haben, können Sie diese gerne einreichen. Es wird mühsamer sein, zu bestätigen, dass die Uhr funktioniert, aber ich kann in einer angehaltenen Simulation eine Reihe von Bits gut lesen.
quelle
Antworten:
Verriegelungsuhr
Partitur - 53.508 (von denen nur 36.828 aufgrund des L-förmigen Designs aktiv verwendet werden)
Aufnahme in hoher Qualität - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Golly-Muster - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw
Leitprinzipien -
Teil I: Der Minutenzähler
Mathematik
Das Zählen von 0 bis 9 im Binärformat (für die am wenigsten signifikante Minutenziffer) geht wie folgt vor sich:
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
Lesen Sie, dass als Spalten der niedrigstwertige (2 ^ 0-Einheiten-Bitstrom) 01010101, der 2 ^ 1-Einheiten-Strom 0011001100, der 2 ^ 2-Einheiten-Strom 0000111100 und der 2 ^ 3-Einheiten-Strom 0000000011 lautet.
Der erste ist einfach - nur Flip-Flip 01 für immer. Der dritte ist ein Strom von vier Einsen, sechs Nullen, phasenverschoben um sechs Nullen. Der vierte ist ein Strom von acht Nullen und zwei Einsen.
Die zweite ist etwas schwieriger, da sie eine unangenehme Asymmetrie aufweist. Allerdings stelle ich fest, dass (wo. Concat Operator ist):
0011001100. 0011001100 = 0011001100. NOT (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 000000000011111111
(Übrigens, wie später angedeutet, läuft der Großteil meiner Uhr auf einem 60-Takt-Ticker. Die 00000000001111111111-Welle mit doppelter Länge ist der Punkt, an dem der 120-Takt-Ticker benötigt wird.)
Design
Die Ausgabe-Streams von oben nach unten erfolgen in Einheiten von Minuten (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3) und dann in Zehnern von Minuten (2 ^ 0, 2 ^ 2, 2 ^ 1). Beachten Sie, dass die beiden unteren Drähte gekreuzt sind.
Teil II: Der Stundenzähler
Erläuterung
Der Eingang zum Stundenzähler ist ein Einzelelektronenimpuls, einmal pro Stunde. Der erste Schritt besteht darin, diesen einmal alle zwölf Stunden auf einen einzelnen Elektronenimpuls zu reduzieren. Dies wird mit mehreren "Latch & Catch" -Primitiven erreicht.
Ein "Latch" ist ein 6-Mikrometer-Flip-Flop, das mit einem UND-NICHT-Gatter und einem UND-Gatter verbunden ist, um ein 6-Mikrometer-Ein / Aus-Latch zu erhalten. Ein "Fang" nimmt einen kontinuierlichen Strom von Elektronen als Eingang, lässt das erste durch und vernichtet dann jedes andere dahinter liegende Elektron, bis der Strom endet, an welchem Punkt sich der Fang zurücksetzt.
Wenn Sie eine Verriegelung gefolgt von einer Verriegelung hintereinander platzieren, wird ein Elektron einge- schaltet -> die Verriegelung wird eingeschaltet, ein Elektron am anderen Ende (der Rest wird von der Verriegelung eingefangen). Dann zweites Elektron ein -> Latch ausschalten, still fangen, zurücksetzen. Nettoeffekt: Das erste Elektron geht durch, das zweite Elektron wird vernichtet und so weiter und so fort, unabhängig davon, wie lange die Verzögerung zwischen diesen Elektronen dauert .
Verketten Sie nun zwei "Latch & Catch" -Elektronen in Reihe, und Sie haben nur jedes vierte Elektron im Durchgang.
Nehmen Sie als nächstes ein drittes "Latch and Catch", aber binden Sie dieses Mal ein ganzes viertes Latch ein und fangen Sie an der Flip-Flop-SET-Leitung zwischen dem AND-NOT-Gatter und dem Flip-Flop-SET. Ich überlasse es Ihnen, darüber nachzudenken, wie dies funktioniert, aber dieses Mal passiert nur eines von drei Elektronen, unabhängig davon, wie lange die Verzögerung zwischen diesen Elektronen dauert .
Nehmen Sie zum Schluss eines von vier Elektronen und eines von drei, kombinieren Sie sie mit einem UND-Gatter, und nur eines von zwölf Elektronen tritt durch. Dieser ganze Abschnitt ist das chaotische Kräuseln der Pfade links oben im Stundenzähler unten.
Nehmen Sie als nächstes alle zwölf Stunden das Elektron und teilen Sie es jede Stunde wieder auf, aber geben Sie es jeweils auf einen anderen Leiterdraht aus. Dies wird mit dem langen Wendelleiter mit dreizehn Austrittspunkten erreicht.
Nehmen Sie diese Elektronen - eine Stunde lang auf verschiedenen Leitern - und treffen Sie eine Flip-Flop-SET-Leitung. Die RESET-Leitung auf demselben Flip-Flop wird dann von dem Leiter der nächsten Stunde getroffen, wobei 60 Impulse pro Draht pro Stunde abgegeben werden.
Schließlich - nimm diese Impulse und lasse sie in siebeneinhalb Bytes ROM (Nur-Lese-Speicher) laufen, um die korrekten BCD-Bitströme auszugeben. Weitere Informationen zu WireWorld ROM finden Sie hier: http://www.quinapalus.com/wires6.html
Design
Anmerkungen
Nützliche Links
Die Grundlagen von WireWorld habe ich unter http://www.quinapalus.com/wi-index.html gelernt . Eine ausgezeichnete Ressource.
Um den Zellularautomaten zu erstellen und zu simulieren, habe ich Golly verwendet: http://golly.sourceforge.net/
Ich habe das AND-Gate-Design von http://mathworld.wolfram.com/WireWorld.html übernommen
Und ich habe diese Webseite gerade erst gefunden, habe sie also nicht verwendet, aber sie sieht gut aus: http://karlscherer.com/Wireworld.html
quelle
Verzögerungszeilenspeicher - 51 x 2880 = 146880
Herausgezoomt:
Die Ausgabe erfolgt am Anfang jeder Schleife.
Ich habe mit dieser Lua alle Zustände direkt auf den Draht gesetzt und
golly
die Elektronen zwischen den Bits vorwärts laufen lassen, damit wir dem Draht nicht mit einem Cursor folgen müssen.Ich habe diese naive Methode benutzt, um einen Barren- und Crashkurs zu setzen, wireworld, golly und lua.
Zum Testen habe ich diese oberen Drähte hinzugefügt und ihre Tipps angesehen.
Hier ist das Skript, um die 4 Sätze von 4-Draht-BCD zu Augapfel zu sammeln.
Die endgültige Antwort erfordert das Beschneiden der Null-Zeilen und das Weiterleiten der restlichen Zeilen an die richtigen BCD-Eingänge.
quelle