使用NAND逻辑门构建乘法器


20

基于我之前相同类型的问题,使用NAND逻辑门构建加法器,这一次要求您乘以而不是加。

建立的(双线)NAND逻辑门的图,将采取的输入线A1A2A4B1B2B4,代表两个二进制数AB对输出线从0到7,并返回值C1C2C4C8C16,和C32,表示C,这是产品AB

您的分数取决于您使用的与非门的数量(每个门1分)。为简化起见,您可以在图表中使用AND,OR,NOT和XOR门,并具有以下相应的分数:

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

这些分数中的每一个都对应于构建相应门所需要的NAND门数量。

最低分获胜。


我试图在Logisim中做最后一个例子。这东西很难。
Joe Z.

我在学校里有足够的东西,不用了。
Johannes Kuhn

7
我有一个针对此类任务的通用优化程序。它可证明找到最短的程序来计算k输出布尔函数。如果我给它一个星期,它可以告诉我它发现的13门2x2乘数是否最佳。3x3?我会死的,直到它结束。
13年

1
13门2x2乘法器是最佳的(包含在Jan的答案中)。有了这一点,以及我可以优化的其他几部分,我非常怀疑60是解决此问题的最佳选择。我真的希望有人证明我错了。

@boothby不是。天真的应用加法树会导致18门解决方案(4个AND,2个半加法器),这使我想到:我应该能够利用13门来窃取^ k ^ k ^ k ^ k ^ k 2x2乘法器。
John Dvorak

Answers:


24

60 55 50 48门

48门乘法器


最初的(60门)是系统的方法-将每个数字与每个数字相乘,然后将它们相加。即,看华莱士树达达树

60门乘法器

上半部分是乘法网络-将每个数字与每个数字相乘,并将具有相同权重的输出数字分组。一些位已经被倒置以保存门。

后半部分是加法器网络。每个方框代表一个加法器-半加法器(5个门-1x XOR和一个反相器),或一个全加法器(9个门-2x XOR和NAND反向的进位位)。顶部是输入,底部是和,左侧是进位。 看到以前的挑战

然后将2x2乘数手动优化为定制的13门网络,这是 @boothby 找到的最佳大小。谢谢!

将其粘贴到低位角落并重新优化加法器树可节省五个门(请参阅修订版2)。但是,将其粘贴到高位角也会产生重叠。一点数学运算告诉我们,删除高乘法器的低位可解决重叠问题,剩下要做的就是将其余两位相加并求和。

不幸的是,仅此一项并不能带来任何节省,但是它确实带来了两个优化。首先,两个乘法器有两个共同的门,并且可以融合在一起。此时,我们回到55。其次,在加法网络中,我们不需要半加器,因为我们知道其进位将为零。我们可以用OR替换它。或为与非,其输入取反。这使我们在每个分支上具有两个2的NOT的2链,然后可以将其删除,总共节省了5个门。不幸的是,C16处的半加法器仍然有效,因此我们不能在那做同样的事情。第三,完整的加法器具有有用的属性:如果反转其输入和输出,它的行为仍然相同。由于其所有输入均已反相,因此我们也可以将反相器移到其后。两次。我们原本可以做到的,但是... 那好吧。我们仍然有一个带有两个反相输入的半加法器。我想进一步优化这一部分,但我怀疑可以。

由于我们要从组件内部提取NOT,因此必须以某种方式表示这一点。我们以四个门的成本获得了带有反向进位的半加法器(AKA抽头XOR)。

同时,我们也重绘了该图。


看起来可能是可优化的唯一部分是加法器的中间部分。逻辑要求是一个超全加器(需要4个输入位,有两个进位输出位)和一个全加器。您的带有两个全加器和两个半加器的实现看起来很难改进。
彼得·泰勒

昨晚我试图建立这种精确的网络,但似乎我对逻辑网络不够精通。
Joe Z.

最优秀!

9

39门

我敢肯定,这里没有比我更简单的设计了。这很难做到。我也做了其他最小的电路。

传输延迟由薄片上每个与非门的向下位置指示。

最小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 '18

它太大了,不可能被证明是最小的,也许将来的量子计算机除外。因此,我使用统计方法来验证其最优性。仍然需要大量的计算时间。
KimOyhus

2
乔纳森要求提供有效性证明,而不是最优性证明。我认为您无需证明其有效。但是,如果我们能够更轻松地测试这是否有效,而不是
信守承诺

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.