W oparciu o moje poprzednie pytanie tego samego typu: Zbuduj maszynę dodającą za pomocą bramek logicznych NAND , tym razem zostaniesz poproszony o pomnożenie zamiast dodania.
Budowanie schemat (dwuprzewodowy) logicznych Bramka NAND, która będzie miała przewody wejściowe A1
, A2
, A4
, B1
, B2
, B4
, reprezentujących dwie liczb binarnych A
na B
od 0 do 7, a wartości powrotne na przewodach wyjściowych C1
, C2
, C4
, C8
, C16
, i C32
, co oznacza C
, który jest produktem A
i B
.
Twój wynik zależy od liczby bramek NAND, z których korzystasz (1 punkt na bramkę). Aby uprościć rzeczy, możesz użyć bramek AND, OR, NOT i XOR na diagramie z następującymi odpowiednimi wynikami:
NOT: 1
AND: 2
OR: 3
XOR: 4
Każda z tych ocen odpowiada liczbie bramek NAND potrzebnych do zbudowania odpowiedniej bramki.
Najniższy wynik wygrywa.
źródło
Odpowiedzi:
60 55 5048 bramOryginał (60 bramek) był systematycznym podejściem - pomnóż każdą cyfrę z każdą, a następnie zsumuj je. Mianowicie zobacz drzewa Wallace i Dadda
Górna połowa to sieć mnożenia - pomnóż każdą cyfrę z każdą i zgrupuj cyfry wyjściowe o tej samej wadze. Niektóre bity zostały odwrócone, aby ocalić bramy.
Druga połowa to sieć dodatków. Każde pudełko reprezentuje pojedynczy sumator - albo pół-sumator (5 bramek - 1x XOR i falownik), albo pełny sumator (9 bramek - 2x XOR i NAND odwrócone bity przenoszenia). Górna część to dane wejściowe, dolna wartość wyjściowa to suma, lewe dane wyjściowe to realizacja. zobacz poprzednie wyzwanie
Mnożnik 2x2 został następnie ręcznie zoptymalizowany do niestandardowej sieci 13-bramkowej, która ma optymalny rozmiar znaleziony przez @boothby . Dzięki!
Wklejenie go do dolnego rogu i ponowna optymalizacja drzewa sumatorów powoduje zapisanie pięciu bramek (patrz wersja 2). Jednak wklejenie go również w górnym rogu powoduje nakładanie się. Trochę matematyki mówi nam jednak, że upuszczenie niskiego bitu wysokiego mnożnika rozwiązuje nakładanie się i pozostaje nam dodać dwa pozostałe bity i podsumować rzeczy.
Samo to niestety nie zapewnia żadnych oszczędności, ale otwiera dwie optymalizacje. Po pierwsze, dwa mnożniki mają dwie wspólne bramki i można je ze sobą łączyć. W tym momencie wróciliśmy do 55. Po drugie, w sieci dodatkowej nie potrzebujemy pół-sumatora, ponieważ wiemy, że jego przeniesienie wyniesie zero. Możemy go zastąpić OR. OR jest NAND z odwróconymi wejściami. To daje nam dwa 2 łańcuchy NOT na każdej gałęzi, które można następnie usunąć, co daje całkowitą oszczędność pięciu bramek. Niestety, pół-sumator w C16 nadal ma, więc nie możemy zrobić tego samego. Po trzecie, pełny sumator ma użyteczną właściwość: jeśli odwrócisz jego dane wejściowe i wyjściowe, nadal zachowuje się tak samo. Ponieważ wszystkie jego wejścia są już odwrócone, równie dobrze możemy przesunąć za nim falowniki. Dwa razy. Mogliśmy zrobić to samo w oryginale, ale ... No cóż. Nadal mamy pół sumatora z dwoma odwróconymi wejściami. Chcę bardziej zoptymalizować tę część, ale wątpię, czy potrafię.
Ponieważ wyciągamy NIE z wnętrza komponentu, musimy to jakoś zaznaczyć. Otrzymaliśmy pół-sumator z odwróconym przenoszeniem (AKA z gwintem XOR) kosztem czterech bram.
W międzyczasie znacznie przerysowaliśmy schemat.
źródło
39 bram
Jestem pewien, że nie ma tutaj prostszych projektów niż moje. To było bardzo trudne do zrobienia. Robię też inne minimalne obwody.
Opóźnienie transmisji jest wskazywane przez położenie w dół każdej bramki NAND na arkuszu.
Kod Verilog i testy:
Kim Øyhus
źródło