Zainspirowany tym pytaniem Game of Life .
Wireworld symuluje „elektrony” przepływające przez „druty”, których proste układy wytwarzają typowe zachowanie bramki logicznej.
Wzywam was do zbudowania zegara cyfrowego w automacie komórkowym Wireworld. Twój zegar musi liczyć w górę od 00:00 do 23:59 w zwykły sposób lub do 11:59 ze wskaźnikiem AM / PM, a następnie zresetować.
Wpis powinien być wyraźnie podzielony na dwie części. Część A powinna zawierać całą logikę nie wyświetlającą się, wszystkie części zaangażowane w inkrementację i zapętlanie cyfr. Część B będzie wyświetlaczem i logiką, która je napędza. Jedynym połączeniem między tymi dwiema częściami powinno być 16 przewodów reprezentujących cztery cyfry czasu w BCD (z jednym opcjonalnym przewodem dla wskaźnika AM / PM i jednym opcjonalnym przewodem dla linii zegara sygnału, jeśli sygnały nie są ciągłe). (EDYCJA: zawsze można zerować przewody)
Czas zachowania zegara powinien być spójny. Symulacja powinna przyjąć taką samą liczbę tyknięć dla każdego z 1440 przejść między stanami. Wszelkie elektrony na 16 drutach powinny jednocześnie emitować z części A i rozpocząć swoją podróż równolegle.
To zawody w golfa. Twój wynik to obszar wyrównanej do osi ramki ograniczającej otaczającej część A.
Analogicznie, gdyby był to język tekstowy, twój wynik byłby wielkością funkcji zarządzania zegarem wytwarzającej cztery 4-bitowe wyjścia, które zawierają pętlę i logikę dla 4 liczników, a nie funkcję dekodującą i drukującą to wyjście.
Twoja część B może być tak duża lub mała, jak chcesz. Jest to wymagane tylko po to, aby wynik twojego przesłania był widoczny dla kogoś, kto go uruchomi, ponieważ nie ma łatwego sposobu na po prostu „debugowanie” wyjść z obwodu wireworld. Istnieje wiele obwodów BCD-> 7segmentowych dostępnych online. Możesz użyć dowolnego, który chcesz, lub stworzyć własny, jeśli potrzebujesz taktowanej linii sygnałowej i wyświetlać wskaźnik AM / PM w skali podobnej do cyfr.
EDYCJA: Część B jest teraz opcjonalna. Jeśli masz tylko wyjścia BCD z części A, możesz je przesłać. Potwierdzenie, że zegar działa, będzie bardziej nużące, ale potrafię dobrze odczytać rząd bitów w wstrzymanej symulacji.
źródło
Odpowiedzi:
Zatrzaskowy zegar
Wynik - 53.508 (z czego tylko 36.828 jest aktywnie wykorzystywanych ze względu na kształt litery L)
Nagrywanie w wysokiej jakości - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Wzorzec Golly - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw
Zasady przewodnie -
Część I: Licznik minut
Matematyka
Liczenie binarne od 0 do 9 (dla najmniej znaczącej cyfry minut) wygląda następująco -
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
Czytanie, że jako kolumny najmniej znaczący (strumień bitów 2 ^ 0 jednostek) to 01010101, strumień 2 ^ 1 jednostek to 0011001100, strumień 2 ^ 2 jednostek to 0000111100, a strumień 2 ^ 3 jednostek to 0000000011.
Pierwszy jest łatwy - wystarczy przerzucić flip 01 na zawsze. Trzeci to strumień czterech zer, sześć zer z przesuniętą fazą o sześć zer. Czwarty to strumień ośmiu zer i dwóch zer.
Drugi jest nieco trudniejszy, ponieważ ma nieprzyjemną asymetrię. Zauważam jednak, że (gdzie. Jest operatorem konkat):
0011001100. 0011001100 = 0011001100. NOT (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 00000000001111111111
(Nawiasem mówiąc, jak wspomniałem później, większość mojego zegara działa na tikrze 60-taktowym. Fala podwójnej długości 00000000001111111111 jest tam, gdzie pojawia się potrzeba tiksu 120-taktowego).
Projekt
Strumienie wyjściowe od góry do dołu to Jednostki minut (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3), a następnie Dziesiątki minut (2 ^ 0, 2 ^ 2, 2 ^ 1). Zauważ, że dolne dwa przewody są skrzyżowane.
Część II: Licznik godzin
Wyjaśnienie
Wejście do licznika godzin to pojedynczy impuls elektronowy, raz na godzinę. Pierwszym krokiem jest zredukowanie tego do pojedynczego impulsu elektronowego, raz na dwanaście godzin. Osiąga się to za pomocą kilku operacji podstawowych „zatrzask i chwyt”.
„Zatrzask” to 6-mikronowy przerzutnik podłączony do AND-NOT i bramki AND w celu uzyskania 6-mikronowego zatrzasku. „Złap” pobiera ciągły strumień elektronów na wejściu, przepuszcza pierwszy, a następnie unicestwia każdy inny elektron za sobą, aż strumień się skończy, w którym to momencie łapanie resetuje się.
Umieszczenie zatrzasku, a następnie zatrzasku, w szeregu, powoduje, że jeden elektron wchodzi -> włącza zatrzask, jeden elektron na drugim końcu (resztę chwyta złapanie). Następnie drugi elektron w -> wyłącza zatrzask, łapanie cicho resetuje. Efekt netto: pierwszy elektron przechodzi, drugi elektron jest anihilowany, i tak dalej, i tak dalej, bez względu na to, jak długie jest opóźnienie między tymi elektronami .
Teraz połącz dwa „zatrzask i złap” szeregowo, a masz tylko jeden na cztery elektrony przechodzące.
Następnie weź trzeci „zatrzask i złap”, ale tym razem zatwierdź cały czwarty zatrzask i złap się na linii zestawu klap, między bramką AND-NOT a klapką. Pomyślę o tym, jak to działa, ale tym razem przechodzi tylko jeden na trzy elektrony, niezależnie od tego, jak długie jest opóźnienie między tymi elektronami .
Na koniec weź jeden na cztery elektrony i jeden na trzy, połącz je z bramką AND i tylko jeden na dwanaście elektronów przechodzi. Cały ten odcinek to niechlujny skręt ścieżek w lewym górnym rogu licznika godzin poniżej.
Następnie weź elektron co 12 godzin i dziel go z powrotem na jedną co godzinę, ale wysyłaj każdy na inny przewód przewodzący. Osiąga się to za pomocą długiego zwiniętego przewodu z trzynastoma punktami wyjścia.
Weź te elektrony - jedną godzinę w dół różnych przewodników i uderz w linię SET flip-flop. Linia RESET na tym samym klapie jest następnie uderzana przez przewód następnej godziny, dając sześćdziesiąt impulsów w dół każdego drutu na godzinę.
Na koniec - weź te impulsy i przekaż je do siedmiu i pół bajtu ROM (pamięć tylko do odczytu), aby wyprowadzić prawidłowe strumienie bitów BCD. Bardziej szczegółowe wyjaśnienie ROM WireWorld znajduje się tutaj: http://www.quinapalus.com/wires6.html
Projekt
Notatki
Przydatne linki
Nauczyłem się podstaw WireWorld od http://www.quinapalus.com/wi-index.html . Doskonały zasób.
Do stworzenia i symulacji automatu komórkowego użyłem Golly: http://golly.sourceforge.net/
Wziąłem projekt bramki AND ze strony http://mathworld.wolfram.com/WireWorld.html
Właśnie znalazłem tę stronę, więc nie korzystałem z niej, ale wygląda świetnie: http://karlscherer.com/Wireworld.html
źródło
Pamięć linii opóźniającej - 51 x 2880 = 146880
Oddalony:
Wyjście wychodzi z góry każdej pętli.
Za pomocą tego lua umieszczam wszystkie stany bezpośrednio na drucie, pozwalając
golly
elektronom przesuwać się naprzód między bitami, abyśmy nie musieli podążać za drutem kursorem.Użyłem tej naiwnej metody, aby ustawić bar i tor wyścigowy wireworld, golly i lua.
Do testów dodałem te górne przewody i obserwowałem ich wskazówki.
Oto skrypt, aby zebrać 4 zestawy 4-przewodowego BCD do gałki ocznej.
Ostateczna odpowiedź wymaga przycinania zawsze zerowych linii i kierowania pozostałych do ich prawidłowych wejść BCD.
źródło