Mam pytanie z egzaminu, którego nie udało mi się rozwiązać:
Muszę zbudować cyfrowy układ logiczny, który otrzymuje 4-bitową liczbę i zwrócić, true
jeśli liczba jest 0
, 7
lub 14
. Mam tylko jedną XOR
bramę (2 wejścia), jedno NOR
(3 wejścia), jedno NAND
(2 wejścia) i jeden dekoder 3 do 8.
Myślę, że to pytanie jest nierozwiązywalne, nie znalazłem żadnej kombinacji, która mogłaby to zrobić. Masz pomysł, jak to rozwiązać?
Odpowiedzi:
Napisałem algorytm w języku C #, który wypróbowuje każdą możliwą kombinację tych
Nor 3->1
Xor 2->1
Nand 2->1
iDecoder 3->8
.Po uruchomieniu go przez
7ipół miliona lat przez2 godziny, zwrócił42Fałsz. Uważam, że to dowodzi, że pytanie nie ma odpowiedzi, ponieważ ten algorytm sprawdza każdą możliwą kombinację. :)Poproszono mnie o opisanie tego, więc następna część zawiera wyjaśnienie części kodu, część po części. TL; DR - możesz po prostu przejść do kodu na końcu :)
Porozmawiajmy o liniach wejściowych, mają one 0 lub 1 stanów i dla każdego z możliwych wejść (od 0 do 15) mają różne wartości:
dla pierwszego wiersza wygląda to tak: 0 1 0 1 0 1 ... Drugi to: 0 0 1 1 0 0 1 1 ... trzeci: 0 0 0 0 1 1 1 1 .... jak binarny liczenie ... masz pomysł: P
Stworzyłem więc obiekt reprezentujący każdą linię w każdym z jego stanów:
Jak to mówi bitLine.IsActiveWhenInputIs [5] zwraca, czy linia była aktywna, gdy wejście miało wartość 5.
To jest kod, który tworzy linie wejściowe:
Stworzymy również „zawsze prawdziwe” i „zawsze fałszywe” linie bitowe - w celu zapewnienia stałego wejścia „0” lub „1”.
Teraz, jeśli zauważysz, to, czego szukamy, to konkretna bitLine, która jest prawdziwa, gdy dane wejściowe wynoszą 0, 7, 14. Przedstawmy to w naszej klasie:
To sprawiło, że wszystko stało się naprawdę proste: tak naprawdę szukamy sposobu na „wykuwanie” tej potrzebnej BitLine z wejściowej linii bitowej (w ten sposób reprezentuję mój program, co chcę, aby moje wyjście było).
Teraz, to jak idziemy na: za każdym razem używamy jakiegoś logicznego elementu na naszych bitLines jak
Xor
,Nor
,Nand
a nawetDecoder
jesteśmy rzeczywiście tworzenia nowego bitLine \ s. Znamy wartość każdej linii na każdym możliwym wejściu od 0 do 15, więc możemy obliczyć nową wartość bitLine również na każdym możliwym wejściu!Nand Nor i Xor są proste:
Dla każdego możliwego wejścia reprezentuje on działanie nowej BitLine.
Obsługa dekodera jest nieco trudna, ale pomysł jest taki: „jeśli bity na wejściu reprezentują liczbę x w formacie binarnym, wówczas x-ta wyjściowa linia bitowa będzie prawdziwa, podczas gdy wszystkie inne będą fałszywe. W przeciwieństwie do innych funkcja ta pobiera tablicę bitline i dodaje 8 nowych bitline do tablicy.
Teraz mamy wszystkie nasze podstawowe elementy, więc porozmawiajmy o algorytmie:
Zrobimy algorytm rekurencyjny, na każdej głębokości będzie próbował użyć innych elementów (ani \ nand \ xor \ dekodera) na aktualnie dostępnych liniach bitowych, a następnie ustawi element na niezdatny do użytku dla następnej rekurencyjnej głębokości. Za każdym razem, gdy dojdziemy do końca i nie mamy już więcej elementów do użycia, sprawdzimy, czy mamy linię bitową, której szukaliśmy.
Ten kod w dowolnym momencie sprawdza, czy bieżąca grupa linii zawiera poszukiwaną linię:
Jest to funkcja, której używa do sprawdzania, czy dwie linie są równe:
Ok, więc teraz w głównej części jest to główny algorytm:
Ta funkcja otrzymuje listę dostępnych linii bitowych, długość listy, wartość logiczną wskazującą, czy każdy element jest aktualnie dostępny (xor / nor / nand / dekoder) oraz bitLine reprezentującą poszukiwaną bitLine.
Na każdym etapie sprawdza, czy mamy więcej elementów do użycia, jeśli nie - sprawdza, czy zarchiwizowaliśmy potrzebną linię.
Jeśli nadal mamy więcej elementów, to dla każdego elementu wywołuje funkcję, która powinna obsługiwać tworzenie nowych bitLines przy użyciu tych elementów i wywoływanie następnej głębokości rekurencyjnej.
Wszystkie następne funkcje obsługi są dość proste, można je przetłumaczyć na „wybierz 2 \ 3 z dostępnych linii bitowych i połącz je za pomocą odpowiedniego elementu. Następnie wywołaj następną głębokość rekurencji, tyle że tym razem nie będzie ona zawierała ten element! ”.
są to funkcje:
I to jest to, po prostu wywołujemy tę funkcję z potrzebną linią, której szukamy, i sprawdza każdą możliwą kombinację części elektrycznych, aby sprawdzić, czy można je połączyć w taki sposób, że ostatecznie jedna linia będzie generowane z potrzebnymi wartościami.
* zauważ, że używam tej samej listy przez cały czas, więc nie będę musiał cały czas tworzyć nowych instancji linii bitów. Z tego powodu daję mu bufor 200.
Oto kompletny program:
Mam nadzieję, że tym razem jest to prawidłowe wyjaśnienie: P
źródło
To nie jest odpowiedź, aby odrzucić najbardziej oczywiste rozwiązanie.
Uproszczenie poprzedniego wyrażenia jest jednak następujące:
to nie jest oczekiwane:
Z tego powodu uważam, że prawdopodobny jest błąd w pytaniu, ponieważ „nand” oznacza „ani”, ani jeden.
źródło
Poprawną odpowiedzią na twoje pytanie będzie każdy obwód, który zawsze zwraca wartość true. Ponieważ zwróci wartość true również wtedy, gdy liczby wejściowe to 0,7 lub 14.
Sądzę, że pytanie powinno wyraźnie dotyczyć obwodu, który odpowiada prawdzie, jeśli liczby wejściowe wynoszą 0,7 lub 14, a w przeciwnym razie zwraca fałsz.
źródło
To jest wykonalne. Podpowiedź, że dwa środkowe bity są równe dla wszystkich tych wzorów bitów, więc xoring ich da 0, które następnie mogą być wejściem do dekodera z pozostałymi dwoma bitami. Pozostałe bramki są stosowane do trzech wyjść dekodera w celu zapewnienia prawidłowego wyjścia jednobitowego.
źródło