Basierend auf meiner vorherigen Frage desselben Typs, Erstellen Sie eine Additionsmaschine mit NAND-Logikgattern . Dieses Mal werden Sie aufgefordert, zu multiplizieren, anstatt zu addieren.
Baue ein Diagramm (zweiadrige) NAND - Logikgatter, die die Eingangsdrähte nehmen A1
, A2
, A4
, B1
, B2
, B4
, , die zwei Binärzahlen A
auf B
0-7, und Rückgabewerte an den Ausgangsleitungen C1
, C2
, C4
, C8
, C16
, und C32
, darstellt C
, welches das Produkt von A
und ist B
.
Ihre Punktzahl richtet sich nach der Anzahl der von Ihnen verwendeten NAND-Gatter (1 Punkt pro Gatter). Zur Vereinfachung können Sie in Ihrem Diagramm AND-, OR-, NOT- und XOR-Gatter mit den folgenden entsprechenden Ergebnissen verwenden:
NOT: 1
AND: 2
OR: 3
XOR: 4
Jede dieser Bewertungen entspricht der Anzahl der NAND-Gatter, die zum Aufbau des entsprechenden Gatters erforderlich sind.
Die niedrigste Punktzahl gewinnt.
quelle
Antworten:
60 55 5048 ToreDas Original (60 Tore) war der systematische Ansatz - multiplizieren Sie jede Ziffer mit jeder und addieren Sie sie dann. Siehe Wallace-Bäume und Dadda-Bäume
Die obere Hälfte ist das Multiplikationsnetzwerk - multiplizieren Sie jede Ziffer mit jeder und gruppieren Sie die ausgegebenen Ziffern mit demselben Gewicht. Einige Bits wurden invertiert gelassen, um Tore zu retten.
Die zweite Hälfte ist das Addierernetzwerk. Jedes Kästchen repräsentiert einen einzelnen Addierer - entweder einen Halbaddierer (5 Gatter - 1x XOR und einen Inverter) oder einen Volladdierer (9 Gatter - 2x XOR und NAND die invertierten Übertragsbits). Die oberen sind Eingänge, der untere Ausgang ist die Summe, der linke Ausgang ist die Ausführung. Siehe die vorherige Herausforderung
Der 2x2-Multiplikator wurde dann von Hand für ein maßgeschneidertes 13-Gate-Netzwerk optimiert . Dies entspricht der von @boothby ermittelten optimalen Größe . Vielen Dank!
Durch Einfügen in die Ecke mit dem niedrigen Bit und erneutes Optimieren des Addiererbaums werden fünf Gates gespeichert (siehe Revision 2). Das Einfügen in die Ecke mit dem hohen Bit führt jedoch zu einer Überlappung. Ein bisschen Mathe sagt uns jedoch, dass das Fallenlassen des Low-Bits des High-Multiplikators die Überlappung löst und was zu tun bleibt, ist, die verbleibenden zwei Bits zu addieren und das Zeug zu summieren.
Dies alleine bringt leider keine Einsparungen, eröffnet aber zwei Optimierungen. Erstens haben die beiden Multiplikatoren zwei Gatter gemeinsam und können miteinander verschmolzen werden. Zu diesem Zeitpunkt sind wir wieder bei 55. Zweitens benötigen wir im Additionsnetzwerk keinen Halbaddierer, da wir wissen, dass sein Übertrag Null sein wird. Wir können es durch einen OP ersetzen. Ein ODER ist ein NAND, dessen Eingänge invertiert sind. Dies ergibt zwei 2-Ketten von NOTs auf jedem Zweig, die dann entfernt werden können, um insgesamt fünf Tore einzusparen. Leider trägt der Halbaddierer bei C16 immer noch, daher können wir dort nicht dasselbe tun. Drittens hat ein Volladdierer eine nützliche Eigenschaft: Wenn Sie seine Ein- und Ausgänge invertieren, verhält er sich immer noch gleich. Da alle Eingänge bereits invertiert sind, können wir auch die dahinter liegenden Inverter verschieben. Zweimal. Wir hätten das gleiche im Original tun können, aber ... Naja. Wir haben noch einen Halbaddierer mit zwei invertierten Eingängen. Ich möchte diesen Teil weiter optimieren, aber ich bezweifle, dass ich es kann.
Da wir ein NOT aus einer Komponente herausziehen, müssen wir das irgendwie anzeigen. Wir haben einen Halbaddierer mit invertiertem Übertrag (AKA-getapptes XOR) zu einem Preis von vier Gattern erhalten.
In der Zwischenzeit haben wir auch das Diagramm deutlich neu gezeichnet.
quelle
39 Tore
Ich bin mir ziemlich sicher, dass es hier keine einfacheren Designs gibt als meine. Es war sehr schwer zu machen. Ich mache auch andere Minimalschaltungen.
Die Übertragungsverzögerung wird durch die Abwärtsposition jedes NAND-Gatters auf dem Blatt angezeigt.
Verilog-Code und Testen:
Kim Øyhus
quelle