NAND論理ゲートを使用して乗算機を構築する


20

同じタイプの以前の質問「NAND論理ゲートを使用して加算マシンを構築する」に基づいて、今回は加算ではなく乗算するように求められています。

入力線を取る(二線式)NAND論理ゲートの図を構築するA1A2A4B1B2B4、2つの2進数表現AB出力配線に0から7まで、および戻り値をC1C2C4C8C16、とC32表しますC、これの産物であるAB

スコアは、使用するNANDゲートの数(ゲートごとに1ポイント)によって決まります。物事を簡単にするために、ダイアグラムでAND、OR、NOT、XORゲートを使用し、以下の対応するスコアを使用できます。

  • NOT: 1
  • AND: 2
  • OR: 3
  • XOR: 4

これらの各スコアは、対応するゲートを構築するために必要なNANDゲートの数に対応しています。

最低スコアが勝ちます。


Logisimで最後の例を作ろうとしています。このようなものは難しいです。
ジョーZ。13年

私は学校でこのようなものを十分に手に入れました。
ヨハネ

7
このようなタスク用のユニバーサルオプティマイザーがあります。k出力ブール関数を計算するための最短プログラムを見つけることができます。1週間与えれば、見つかった13ゲート2x2乗数が最適かどうかを知ることができます。3x3?終わる前に死んでしまいます。
ブースバイ

1
その13ゲート2x2乗数は最適です(1月の答えに含まれています)。それと、私が最適化できる別のいくつかのピースを使用すると、この問題に対して60が最適であると非常に強く疑います。誰かが私の間違いを証明してくれることを本当に願っています。
ブースビー

@boothbyそうではありません。加算器ツリーを単純に適用すると、18ゲートのソリューション(4つのAND、2つの半加算器)が得られます。 2x2乗数。
ジョンドヴォルザーク

回答:


24

60 55 50 48門

48ゲート乗算器


元の(60ゲート)は体系的なアプローチでした。各桁にそれぞれを掛けて、合計します。つまり、ウォレスの木ダダの木を参照してください

60ゲート乗算器

上半分は乗算ネットワークです。各桁にそれぞれを掛け、出力桁を同じ重みでグループ化します。一部のビットは、ゲートを節約するために反転されたままになっています。

後半は加算器ネットワークです。各ボックスは、半加算器(5ゲート-1x XORおよびインバーター)、または全加算器(9ゲート-2x XORおよびNANDの反転キャリービット)の単一加算器を表します。上部は入力、下部の出力は合計、左の出力はキャリーアウトです。 前の挑戦を見る

この2x2乗算器は、カスタムビルドの13ゲートネットワークに最適化されておりこれは@boothbyで見つかった最適なサイズです。ありがとう!

低ビットコーナーに貼り付けて加算器ツリーを再最適化すると、5つのゲートが節約されます(リビジョン#2を参照)。ただし、高ビットコーナーにも貼り付けると、オーバーラップが発生します。ただし、ちょっとした計算で、高乗数の低ビットをドロップするとオーバーラップが解決され、残りの2ビットを足して合計することが残っていることがわかります。

残念ながら、これだけでは節約にはなりませんが、2つの最適化が可能になります。まず、2つの乗算器には共通の2つのゲートがあり、一緒に融合できます。この時点で、55に戻りました。次に、加算ネットワークでは、キャリーがゼロになることがわかっているため、半加算器は必要ありません。ORに置き換えることができます。ORは、入力が反転したNANDです。これにより、各ブランチにNOTの2つの2チェーンが生成されます。この2チェーンは削除でき、合計5つのゲートを節約できます。残念ながら、C16の半加算器はまだ搭載されているため、同じことはできません。第三に、全加算器には便利なプロパティがあります。入力と出力を反転しても、同じように動作します。すべての入力がすでに反転しているため、インバーターをその背後に移動することもできます。二回。オリジナルでも同じことができましたが... しかたがない。2つの反転入力を備えた半加算器がまだあります。この部分をさらに最適化したいのですが、できるとは思えません。

コンポーネント内からNOTを引き出しているので、どういうわけかそれを示す必要があります。4ゲートのコストで、反転キャリー(別名タップXOR)を備えた半加算器が得られました。

それまでの間、図を大幅に再描画しました。


潜在的に最適化可能と思われる唯一の部分は、加算器の中央ブロックです。論理要件は、スーパーフル加算器(4つの入力ビットを取り、2つのキャリー出力ビットを使用)と全加算器です。2つの全加算器と2つの半加算器を使用した実装の改善は困難です。
ピーターテイラー

昨夜、この正確なネットワークを作成しようとしましたが、論理ネットワークに精通していないようです。
ジョーZ。13年

最も素晴らしい!
ブースビー

9

39門

ここにあるものよりも単純なデザインはないはずです。作るのはとても大変でした。他の最小限の回路も作ります。

伝送遅延は、シート上の各NANDゲートの下向きの位置によって示されます。

最小3ビット乗算器

Verilogコードとテスト:

// MINIMAL 3 BIT MULTIPLICATOR
//
// The simplest 3 bit multiplicator possible, using 39 NAND gates only.
//
// I have also made multiplicators that are faster, more efficient,
// use different gates, and multiply bigger numbers. And I also do
// hard optimization of other circuits. You may contact me at
// kim.oyhus@gmail.com
// 
// This is my entry to win this hard Programming Puzzle & Code Golf
// at Stack Exchange:
// /codegolf/12261/build-a-multiplying-machine-using-nand-logic-gates/
//
// By Kim Øyhus 2018 (c) into (CC BY-SA 3.0)
// This work is licensed under the Creative Commons Attribution 3.0
// Unported License. To view a copy of this license, visit
// https://creativecommons.org/licenses/by-sa/3.0/


module mul3x3 ( in_000, in_001, in_002, in_003, in_004, in_005, out000, out001, out002, out003, out004, out005 );
  input  in_000, in_001, in_002, in_003, in_004, in_005;
  output out000, out001, out002, out003, out004, out005;
  wire   wir000, wir001, wir002, wir003, wir004, wir005, wir006, wir007, wir008, wir009, wir010, wir011, wir012, wir013, wir014, wir015, wir016, wir017, wir018, wir019, wir020, wir021, wir022, wir023, wir024, wir025, wir026, wir027, wir028, wir029, wir030, wir031, wir032;

  nand gate000 ( wir000, in_000, in_005 );
  nand gate001 ( wir001, in_000, in_004 );
  nand gate002 ( wir002, in_000, in_003 );
  nand gate003 ( out000, wir002, wir002 );
  nand gate004 ( wir003, in_004, in_001 );
  nand gate005 ( wir004, wir003, wir003 );
  nand gate006 ( wir005, in_003, in_002 );
  nand gate007 ( wir006, wir000, wir005 );
  nand gate008 ( wir007, in_004, in_002 );
  nand gate009 ( wir008, in_001, in_005 );
  nand gate010 ( wir009, wir008, wir007 );
  nand gate011 ( wir010, in_001, in_003 );
  nand gate012 ( wir011, wir001, wir010 );
  nand gate013 ( wir012, out000, wir004 );
  nand gate014 ( wir013, wir004, wir012 );
  nand gate015 ( wir014, wir011, wir012 );
  nand gate016 ( out001, wir014, wir014 );
  nand gate017 ( wir015, in_002, in_005 );
  nand gate018 ( wir016, wir015, wir015 );
  nand gate019 ( wir017, out000, wir016 );
  nand gate020 ( wir018, wir017, wir013 );
  nand gate021 ( wir019, wir016, wir018 );
  nand gate022 ( wir020, wir019, wir009 );
  nand gate023 ( wir021, wir020, wir017 );
  nand gate024 ( wir022, wir020, wir009 );
  nand gate025 ( wir023, wir022, wir021 );
  nand gate026 ( out005, wir022, wir022 );
  nand gate027 ( wir024, wir016, wir022 );
  nand gate028 ( wir025, wir006, wir018 );
  nand gate029 ( wir026, wir025, wir006 );
  nand gate030 ( wir027, wir025, wir018 );
  nand gate031 ( out002, wir026, wir027 );
  nand gate032 ( wir028, wir004, wir027 );
  nand gate033 ( wir029, wir023, wir028 );
  nand gate034 ( wir030, wir028, wir028 );
  nand gate035 ( wir031, wir030, wir021 );
  nand gate036 ( out004, wir031, wir024 );
  nand gate037 ( wir032, wir029, wir031 );
  nand gate038 ( out003, wir032, wir032 );
endmodule


module mul3x3_test; 
   reg  [5:0] AB; // C=A*B
   wire [5:0] C;

  mul3x3 U1 ( 
  .in_000 (AB[0]), 
  .in_001 (AB[1]), 
  .in_002 (AB[2]), 
  .in_003 (AB[3]), 
  .in_004 (AB[4]), 
  .in_005 (AB[5]), 
  .out000 (C[0]), 
  .out001 (C[1]), 
  .out002 (C[2]), 
  .out003 (C[3]), 
  .out004 (C[4]), 
  .out005 (C[5])
  ); 

  initial  AB=0;
  always  #10  AB = AB+1;
  initial  begin
    $display("\t\ttime,\tA,\tB,\tC"); 
    $monitor("%d,\t%b\t%b\t%b",$time, AB[5:3], AB[2:0],C); 
  end 
  initial  #630  $finish; 
endmodule


// iverilog -o mul3x3_test mul3x3_test.v
// vvp mul3x3_test

キム・オイフス


2
あなたの答えが有効であるという証拠がありますか?
ジョナサンフレッチ

3
Logisimで図を作成することをお勧めします(無料)。簡単に確認してテストできるようになります。
mbomb007

おそらく将来の量子コンピューターを除いて、最小であると証明するには大きすぎます。そのため、統計的手法を使用してその最適性を検証します。計算に時間がかかりすぎます。
キムオイフス

2
Jonathonは、最適性の証明ではなく、妥当性の証明を求めました。有効であると証明する必要はないと思います。しかし、これが有効であるかどうかをテストする方が、あなたの言葉を
受け入れるの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.