Połączony wykres jest wykresem, który zawiera ścieżkę między dwoma wierzchołkami.
Wyzwanie
Zbuduj obwód [2-wejściowa bramka NAND], który określa, czy podłączony jest wykres 4-wierzchołkowy.
(2 wejścia bramki mogą być tym samym bitem wejściowym lub inną bramą.)
Wyjście Prawda, jeśli wykres jest podłączony, i False w przeciwnym razie.
Wejście
Sześć możliwych krawędzi prostego wykresu z 4 wierzchołkami:
[ 0 e 1 , 0 e 2 , 1 e 2 , 0 e 3 , 1 e 3 , 2 e 3 ]
gdzie e b przedstawia czy istnieje krawędź pomiędzy wierzchołkami i B
Łączność jest równoważna z następującymi warunkami:
Jeśli mniej niż 3 wartości wejściowe to Prawda, wówczas wartość wyjściowa False.
Jeśli więcej niż 3 wartości wejściowe są Prawdą, wówczas wartość wyjściowa Prawda.
Jeśli dokładnie 3 dane wejściowe są Prawdą i tworzą one trójkąt, wówczas wysyłają False.
W przeciwnym razie należy wyprowadzić wartość True.
Odpowiedź wykorzystująca najmniej bramek wygrywa. Więzy zostaną zerwane przez
najniższą głębokość obwodu (długość najdłuższych ścieżek od wejścia do wyjścia).
0
i1
? Co powiesz na wynik?Odpowiedzi:
30 NANDS
Zamiast pytać, kiedy otrzymujemy 1, zadałem pytanie, kiedy otrzymujemy 0. Lepiej jest zadawać to w ten sposób, ponieważ jest mniej 0 niż 1.
Oto rozkład według liczby krawędzi (6. rząd trójkąta Pascala)
Zadając pytanie w ten sposób, otrzymujemy następujący schemat i wyrażenie
Zakładamy, że wyjście będzie domyślnie ustawione na 1, ale zmieni się na 0 w dowolnym z poniższych warunków
1.A 0 dla trzech sąsiednich krawędzi (test 3 wejścia)
2.A 0 dla dwóch przeciwnych par krawędzi (test 4 wejścia)
Powyższe warunki są już uporządkowane w sposób, który umożliwi ich grupowanie, jak poniżej. (Nawiasem mówiąc, ta wersja wyrażenia jest obrotowo symetryczna względem wierzchołka AFB.)
Wynik dla każdego
&
lub|
jest umieszczony pod symbolem i uzasadniony w następujący sposób:Poziom 0: Inwestujemy w falownik dla każdego wejścia: 6 NANDS
Poziom 1: Możemy zbudować OR z bramki NAND, umieszczając falownik na wejściu (łącznie 3 NANDS), ale ponieważ już zainwestowaliśmy w 6 NANDS w poprzednim kroku, możemy wykonać 7 bram OR z 7 bram NAND. Potrzebujemy również 3 bramek. W tym celu użyjemy NAND i pozostawimy wynik odwrócony. 10 NANDS
Poziom 2: Ponownie budujemy 4 bramki OR z bram NAND. W każdym przypadku mamy 1 wejście z bramki OR, więc musimy to odwrócić. Ale drugie wejście jest już odwrócone (pochodzące z jednego z NAND w poprzednim kroku, który odpowiada
&
symbolowi w trzech przypadkach, oraz z falownika w ostatnim), więc potrzebujemy tylko 2 bramek dla każdej funkcji OR. 4 * 2 = 8Poziom 3: Teraz musimy ORAZ cztery wyjścia razem. Wymaga to 3 bramek AND, każda zbudowana z 2 NAND, 3 * 2 = 6
To łącznie 30 bramek NAND, przy maksymalnej głębokości 2 + 2 + 4 = 8 NAND dla gałęzi
|
na poziomie 1 lub 3 + 1 + 4 = 8 NAND dla gałęzi&
na poziomie 1.Poniższy skrypt Ruby wizualnie potwierdza, że powyższe wyrażenie jest poprawne.
źródło
19 NAND
Nie ma prostszego obwodu niż ten.
Pod obrazem znajduje się kod do testowania. Jeśli chodzi o zrozumienie, to trudne. Jest tam kilka bram IF, a dane wejściowe są trochę zgrupowane w trójkąt z wolnymi liniami narożnymi dodawanymi do analizy jeden po drugim, ale nie w prosty sposób. Jeśli komuś uda się to zrozumieć, będę pod wrażeniem.
Kod Verilog z testowaniem:
Kim Øyhus
źródło
Mathematica, 17 bramPo prostu wyliczamy wszystkie reguły, konstruujemy funkcję boolowską i minimalizujemy ją w
NAND
formie.Wynik :
, gdzie
#1...#6
jest 6 miejsc na argumenty.Przypadki testowe :
źródło
not (p&q&r)
? Co oznacza twój ostateczny wynik?p⊼q⊼r
oznacza(p⊼q)⊼r
, co jest równoważne z!(p&&q&&r)
.(p⊼q)⊼r
nie jest równoważne!(p&&q&&r)
.64 NAND
Sześć krawędzi można podzielić na trzy pary przeciwległych krawędzi. Aby wykres mógł zostać połączony, muszą istnieć dwie przeciwległe krawędzie oraz trzecia krawędź lub trzy krawędzie połączone z tym samym wierzchołkiem.
Przeciwnymi parami są UX, VY, WZ, więc:
Budując bramy AND i OR w zwykły sposób, całkowita liczba użytych bram wynosi
3*3+7*3+34
= 64.źródło