Uzyskaj liczbę ustawionych bitów w logice cyfrowej

9

W ramach ćwiczenia staram się zaprojektować implementację Gry Życia Conwaya w prostej cyfrowej logice. Mógłbym zrobić wszystko, minimalizując funkcję 9-zmiennych, ale wyobrażam sobie, że nadal będzie dość duża. Jednym z podstawowych elementów algorytmu jest ustalenie, ilu z twoich ośmiu sąsiadów „żyje”.

Biorąc pod uwagę 8 danych wejściowych, jaki jest najłatwiejszy sposób ustalenia, ile jest ustawionych? Szczególnie potrzebuję wyjścia, które jest wysokie, gdy ustawione są 2, i wyjścia, które jest wysokie, gdy ustawione są 3.

Mój główny pomysł składa się teraz z rejestru przesuwnego PISO, licznika i dekodera 3: 8, ale do sterowania tym wszystkim potrzebuję mikrokontrolera. Nie wydaje się to skomplikowane z powodu funkcji. Może ROM 256x2 też by działał, ale moje wyszukiwania nie wykazały żadnej z tego rodzaju części.

Wiem, że każde zdjęcie z 10 IO może zrobić to trywialnie, ale chcę go wdrożyć w jak najmniejszy możliwy sposób.

captncraig
źródło

Odpowiedzi:

13

Możesz znaleźć różne algorytmy oświecania szybkiego liczenia bitów . Dwa ostatnie: Nifty Parallel Count i MIT HAKMEM Count mogą być łatwo przekonwertowane na bramy. Zobacz tę stronę, aby uzyskać dobre wyjaśnienie tego, jak to działa.

Możesz to zrobić za pomocą sprzętu Gates. Użyj czterech 1-bitowych sumatorów, aby dodać pary bitów razem. To daje cztery liczby 3-bitowe. Dodaj je parami za pomocą dwóch 3-bitowych sumatorów. To daje dwie 4-bitowe liczby do dodania przy użyciu pojedynczego 4-bitowego sumatora. To daje ci 5-bitową wartość, ale możesz zignorować górny bit. Następnie użyj dwóch 4-bitowych komparatorów, aby sprawdzić wartości 2 i 3.

Dla minimalnej liczby części, dlaczego nie zrobić analogowej?

Utwórz dzielnik napięcia z jednym opornikiem u góry, a 8 wejść połączonych od dołu przez 8 oporników równolegle. Następnie użyj dwóch zestawów komparatorów do wykrycia poziomów napięcia, które wytworzą 2 lub 3 bity. To tylko 6 części:

Detektor liczby bitów

Sieć 8-rezystorowa wytworzy napięcie od 0 V (dla zestawu 0 bitów) do 5 V (dla zestawu 8 bitów). 2 bity wytworzą 0,5 V. 3 bity wytworzą 1,56 V.

  • Przy 0 lub 1 bitach wyjście będzie wynosić 00.
  • Przy 2 lub 3 bitach wyjście będzie wynosić 01.
  • Przy 4 lub więcej bitach wyjście będzie wynosić 11.

Dodany:

Dzięki DavidCary za doskonałą sugestię. Po wielu obliczeniach myślę, że znalazłem zestaw oporników, które działają, ale najpierw powinieneś dokładnie sprawdzić moje obliczenia. Tutaj używam komparatorów z wyjściami typu open-drain i myślę, że udało mi się uzyskać to, aby mieć jedno wyjście. Niski oznacza martwy w następnej rundzie, wysoki oznacza żywy w następnej rundzie.

Obwód życia Conwaya 2

Zaletą jest to, że ten obwód ma tylko dwa dodatkowe elementy niż drugi obwód. Wszystkie są rezystorami serii E8, więc powinno być możliwe ich zdobycie. Ponadto R6 powinien mieć wyższą wartość, np. 4,7 tys.

Rocketmagnet
źródło
4
+1 tylko dlatego, że twoja odpowiedź nie brzmi „Użyj mikrokontrolera”. To wydaje się być domyślnym trybem tutaj.
Connor Wolf,
@FakeName: Pierwsze odniesienie dotyczy rozwiązań programowych. Oczywiście nie musisz implementować ich na mikrokontrolerze, możesz także użyć superkomputera :)
Federico Russo,
@FedericoRusso - Podałem odniesienia do rozwiązań programowych, które dają pewien wgląd w to, jak mógłby to zaimplementować w sprzęcie.
Rocketmagnet
3
Być może: Dodaj 9. „rezystor sumujący” o wartości 20 kOhm od aktualnego stanu komórki centralnej do punktu sumującego wzmacniacza operacyjnego „+” w obwodzie Rocketmagnet - tj. Nadaj centralnej komórce wagę 1 i 8 sąsiednich komórek waga 2. Następnie dostosuj dzielnik napięcia, aby „narodziny” (centralna martwa komórka z 3 żywymi sąsiadami; suma = 6) i „pozostać przy życiu” (centralna martwa komórka żywa z 2 lub 3 żywymi sąsiadami, suma = 5 lub 7) daje wyniki „01”; i wszystkie inne przypadki (gdzie centralna komórka umiera lub pozostaje martwa) dają wartości wyjściowe „00” lub „11”. Następnie brama XOR podaje następny stan centralnej komórki.
davidcary
1
Kilka rzeczy, które znalazłem podczas eksperymentowania: opory nie są całkiem właściwe. Znalazłem kilka lepszych kombinacji, ale wciąż próbuję zoptymalizować. Ponadto, tworząc ich siatkę, prąd przepływa wstecz przez rezystory sumujące i psuje rzeczy. Diody na połączeniach są jednym ze sposobów, aby temu zapobiec.
captncraig
6

Co jest minimalne? Mikrokontroler jest tylko jedna część i może powodować wynik z minimalnym opóźnieniem (<1μs). Przy 54 centach ATTiny20 jest najtańszym mikrokontrolerem z 10 I / O w Digikey.

Tabela przeglądowa jest również tylko 1 częścią i jest szybsza niż mikrokontroler. Zapomnij o równoległych pamięciach EEPROM, są drogie. Użyj równoległej lampy błyskowej o szerokości całego bajtu . Ten ma 512 kB, czyli 2000 razy więcej niż potrzebujesz, ale jest to najtańsze rozwiązanie (1 dolar). I możesz dodać 6 dodatkowych funkcji 1-bitowych w tej samej cenie.

Możesz także użyć CPLD . Napisz funkcję w VHDL lub Verilog jako jedną długą instrukcję SOP (Sum Of Products) i pozwól syntezatorowi utworzyć logikę.

Rejestr przesuwny jest OK, jeśli można poczekać na wynik; to najwolniejsze rozwiązanie.

Wreszcie możesz to zrobić za pomocą bramek logicznych , ale poświęcisz dużo czasu na zredukowanie SOP do minimalnej postaci, jeśli chcesz przejść na wszystkie podstawowe. Rocketmagnet ma dobry pomysł, używając sumatorów, ale jego liczby są wyłączone: 1 bitowy sumator pół daje 2 bity, a nie 3. Tak więc dodanie wyjść pół sumatora dwa na dwa wymaga dwóch 2-bitowych pół sumatorów, dając dwa 3- bitowe wyniki. Użyj 3-bitowego sumatora, aby uzyskać wynik 4-bitowy. Używając 1-bitowych sumatorów potrzebujesz tylko jednego 2-bitowego sumatora.

stevenvh
źródło
1

Hybrydowe obwody równolegle-sekwencyjne mogą być znacznie bardziej kompaktowe niż obwody czysto równoległe. Na przykład, jeśli dostosujesz reguły tak, aby pole 3x3 obróci komórkę w środku martwą, jeśli będzie mniej niż trzy żywe komórki lub więcej niż cztery, i przełączysz ją, jeśli będą dokładnie trzy żywe komórki (zachowanie pod tymi nowe reguły będą pasować do oryginału), można uprościć logikę, wykonując dwuetapową sekwencję:

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] 'Suma dwóch bitów trzech liczb jednobitowych
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

Tablica tempVal[x,y]ma dwa bity na komórkę; ta ostatnia operacja sumuje trzy takie liczby, aby uzyskać wartość 0–9 (chociaż wszystkie wartości przekraczające cztery są równoważne), które można następnie wykorzystać do obliczenia jednobitowego stanu bieżącego / martwego dla następnej generacji.

BTW, alternatywą do wykonania sumy arytmetycznej w drugim etapie i zbadania wartości byłoby przekonwertowanie tempVal [x, y] na jedną gorącą reprezentację, a następnie jawne sprawdzenie jednej z dziewięciu kombinacji wartości, która dałaby trzy komórki lub jeden z dwunastu, który dałby cztery.

supercat
źródło