NAND 로직 게이트를 사용하여 곱셈기 구축


20

같은 유형의 이전 질문에 따라 NAND 논리 게이트를 사용하여 추가 기계를 빌드하십시오. 이번에는 add 대신 곱하기를 요청받습니다.

입력 배선을한다 (2 선) NAND 로직 게이트의 도면을 작성 A1, A2, A4, B1, B2, B4, 두 이진수 표현 AB출력 선에 0 내지 7 및 반환 값 C1, C2, C4, C8, C16, 및 C32, 나타내는 C, 이는의 제품 AB.

점수는 사용하는 NAND 게이트 수 (게이트 당 1 포인트)에 따라 결정됩니다. 일을 단순화하기 위해 다이어그램에서 AND, OR, NOT 및 XOR 게이트를 다음과 같은 점수로 사용할 수 있습니다.

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

이러한 각 점수는 해당 게이트를 구성하는 데 필요한 NAND 게이트 수에 해당합니다.

최저 점수가 이깁니다.


Logisim에서 마지막 장소를 만들려고합니다. 이 물건은 어렵다.
Joe Z.

학교에서 이런 것들을 충분히 얻었습니다. 고마워요.
Johannes Kuhn

7
이와 같은 작업에 대한 범용 최적화 프로그램이 있습니다. k- 출력 부울 함수를 계산하는 가장 짧은 프로그램을 찾을 수 있습니다. 내가 일주일을 주면 13 게이트 2x2 멀티 플라이어가 최적인지 알 수 있습니다. 3x3? 나는 그것이 끝나기 전에 죽을 것이다.
boothby

1
13 게이트 2x2 멀티 플라이어가 최적이며 Jan의 답변에 포함되어 있습니다. 그것과 내가 최적화 할 수있는 몇 가지 다른 부분으로, 나는이 문제에 대해 60이 최적이라고 생각합니다. 누군가가 나를 잘못 증명했으면 좋겠다.
boothby

@boothby 그렇지 않습니다. 가산기 트리를 순진하게 적용하면 18 게이트 솔루션 (4 ANDs, 2 반 가산기)이 생겨 아이디어를 얻습니다. 2x2 승수.
John Dvorak

답변:


24

60 55 50 48 개 게이트

48- 게이트 멀티 플라이어


원래 (60 게이트)는 체계적인 접근 방식으로 각 숫자에 각 숫자를 곱한 다음 합산합니다. 즉, 월리스 나무다다 나무를 참조하십시오

60 게이트 승수

상단 절반은 곱셈 네트워크입니다-각 숫자에 각 숫자를 곱하고 동일한 가중치로 출력 숫자를 그룹화하십시오. 게이트를 저장하기 위해 일부 비트는 반전되어 있습니다.

후반은 가산기 네트워크입니다. 각 상자는 반가산기 (5 게이트-1x XOR 및 인버터) 또는 완전 가산기 (9 게이트-2x XOR 및 반전 된 캐리 비트 NAND)와 같은 단일 가산기를 나타냅니다. 상단은 입력이고 하단 출력은 합계이며 왼쪽 출력은 캐리 아웃입니다. 이전 도전을 참조하십시오

그런 다음 2x2 멀티 플라이어는 @boothby가 찾은 최적의 크기 인 맞춤형 13 게이트 네트워크에 맞게 수동 최적화되었습니다 . 감사!

이를 낮은 비트 코너에 붙여넣고 가산기 트리를 다시 최적화하면 5 개의 게이트가 절약됩니다 (2 번 개정판 참조). 그러나이를 높은 비트 모서리에 붙여 넣으면 겹치게됩니다. 그러나 약간의 수학은 높은 승수의 낮은 비트를 삭제하면 겹치는 부분을 해결하고 남은 일은 나머지 두 비트를 더하고 요약하는 것입니다.

불행히도 이것만으로는 비용을 절감 할 수 없지만 두 가지 최적화가 가능합니다. 먼저, 두 곱셈기는 공통으로 두 개의 게이트를 가지며 서로 융합 될 수 있습니다. 이 시점에서, 우리는 55에 돌아 왔습니다. 둘째, 추가 네트워크에서 캐리가 0이 될 것이라는 것을 알기 때문에 반가산기가 필요하지 않습니다. OR로 바꿀 수 있습니다. OR은 입력이 반전 된 NAND입니다. 이로 인해 각 지점에 2 개의 2 체인 NOT의 NOT이 생성되어 제거되어 5 개의 게이트를 절약 할 수 있습니다. 불행히도 C16의 반가산기는 여전히 운송되므로 우리는 동일한 작업을 수행 할 수 없습니다. 셋째, 완전 가산기에는 유용한 속성이 있습니다. 입력과 출력을 반전해도 여전히 동일하게 작동합니다. 모든 입력이 이미 반전되었으므로 인버터를 그 뒤로 이동할 수도 있습니다. 두번. 우리는 원본에서 똑같이 할 수 있었지만 ... 오 잘. 우리는 여전히 2 개의 반전 입력을 가진 반가산기가 있습니다. 이 부분을 더 최적화하고 싶지만 할 수는 없습니다.

우리는 컴포넌트 내부에서 NOT을 꺼내기 때문에 어떻게 든 그것을 의미해야합니다. 우리는 4 개의 게이트 비용으로 역 캐리 (AKA Tapped XOR)를 가진 반가산기를 얻었습니다.

그 동안 다이어그램을 크게 다시 그렸습니다.


잠재적으로 최적화 가능한 것으로 보이는 유일한 부분은 가산기의 중간 블록입니다. 논리적 요구 사항은 수퍼 풀-가산기 (4 개의 입력 비트를 취하고 2 개의 캐리 출력 비트를 가짐)와 풀 가산기에 대한 것입니다. 두 개의 전체 가산기와 두 개의 반 가산기로 구현하면 개선하기가 어렵습니다.
피터 테일러

어젯밤 에이 정확한 네트워크를 만들려고했지만 논리 네트워크에 충분히 정통하지 않은 것 같습니다.
Joe Z.

가장 훌륭한!
boothby

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
귀하의 답변이 유효하다는 증거가 있습니까?
Jonathan Frech

3
Logisim (무료)으로 다이어그램을 작성하여 쉽게보고 테스트 할 수 있도록하는 것이 좋습니다 .
mbomb007

미래의 양자 컴퓨터를 제외하고는 최소한으로 증명하기에는 너무 큽니다. 따라서 통계적 방법을 사용하여 최적 성을 확인합니다. 여전히 컴퓨팅 시간이 너무 오래 걸립니다.
KimOyhus

2
Jonathon은 최적의 증거가 아니라 유효성의 증거를 요구했습니다. 나는 당신 그것을 증명 해야 한다고 생각하지 않습니다 . 그러나 이것이 당신의 말을
받아들이지

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.