สร้างเครื่องทวีคูณโดยใช้ประตูตรรกะ NAND


20

จากคำถามก่อนหน้านี้ในประเภทเดียวกันสร้างเครื่องเพิ่มโดยใช้ประตูตรรกะ NANDคราวนี้คุณจะถูกขอให้คูณด้วยแทนที่จะเพิ่ม

สร้างแผนภาพของประตู (สองสาย) ตรรกะ NAND ที่จะนำสายไฟอินพุตA1, A2, A4, B1, B2, B4คิดเป็นสองเลขฐานสองAไปB0-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-output ถ้าฉันให้หนึ่งสัปดาห์มันจะบอกได้ว่าตัวคูณ 13 gate 2x2 ที่พบนั้นเหมาะสมหรือไม่ 3x3? ฉันจะตายก่อนที่มันจะเสร็จสิ้น
บูธโดย

1
ตัวคูณ 13 เกต 2x2 นั้นเหมาะสมที่สุด (และอยู่ในคำตอบของ ม.ค. ) ด้วยสิ่งนั้นและอีกสองสามชิ้นที่ฉันสามารถเพิ่มประสิทธิภาพได้ฉันจึงสงสัยอย่างยิ่ง 60 ว่าจะดีที่สุดสำหรับปัญหานี้ ฉันหวังว่าจะมีคนพิสูจน์ฉันผิด
บูธโดย

@boothby ไม่จริง แอปพลิเคชันไร้เดียงสาของต้นไม้ adder นำไปสู่วิธีแก้ปัญหาแบบ 18 ประตู (4 ANDs, 2 ครึ่งเสริม) ซึ่งทำให้ฉันมีความคิด: ฉันควรจะสามารถขโมย ^ k ^ k ^ k ^ k ^ k ^ k ^ k ใช้ประตู 13 ประตู ตัวคูณ 2x2
John Dvorak

คำตอบ:


24

60 55 50 48 ประตู

ตัวคูณ 48 ประตู


เดิม (60 ประตู) เป็นวิธีการที่เป็นระบบ - คูณแต่ละหลักด้วยกันแล้วรวมเข้าด้วยกัน คือเห็นต้นไม้วอลเลซและต้นดาดา

ตัวคูณ 60 ประตู

ครึ่งบนคือเครือข่ายการคูณ - คูณแต่ละหลักด้วยแต่ละตัวและจัดกลุ่มตัวเลขเอาท์พุทที่มีน้ำหนักเท่ากัน มีการปล่อยบิตบางส่วนกลับด้านเพื่อบันทึกประตู

ครึ่งปีหลังเป็นเครือข่าย adder แต่ละกล่องแสดงถึงแอดเดอร์ตัวเดียว - ครึ่งแอดเดอร์ (5 ประตู - 1x XOR และอินเวอร์เตอร์) หรือแอดเดอร์เต็มรูปแบบ (9 เกตส์ - 2x XOR และ NAND บิตนำกลับ) ด้านบนคืออินพุตเอาต์พุตด้านล่างคือผลรวมเอาต์พุตซ้ายคือการดำเนินการ ดูความท้าทายก่อนหน้า

ตัวคูณ 2x2 ได้รับแล้วมือที่ดีที่สุดที่จะกำหนดเองสร้างเครือข่าย 13 ประตูซึ่งเป็นขนาดที่เหมาะสมเท่าที่พบโดย @boothby ขอบคุณ!

การวางลงในมุมต่ำและการเพิ่มต้นไม้ adder อีกครั้งจะช่วยประหยัดห้าประตู (ดูการแก้ไข # 2) วางลงในมุมสูงเช่นกัน แต่สร้างทับซ้อนกัน คณิตศาสตร์นิดหน่อยบอกเราว่าการวางตัวคูณที่ต่ำลงเป็นการแก้การซ้อนทับและสิ่งที่ต้องทำคือการเพิ่มสองบิตที่เหลือและสรุปสิ่งต่างๆ

คนเดียวนี้โชคไม่ดีที่ไม่ได้ให้การออมใด ๆ แต่มันเปิดการเพิ่มประสิทธิภาพสองอย่าง ก่อนอื่นตัวคูณสองตัวมีสองประตูเหมือนกันและสามารถหลอมรวมเข้าด้วยกัน ณ จุดนี้เรากลับมาที่ 55 สองในเครือข่ายเพิ่มเติมเราไม่ต้องการครึ่งบวกเพราะเรารู้ว่ามันจะเป็นศูนย์ เราสามารถแทนที่ด้วย OR OR คือ NAND ที่มีอินพุตอินเวอร์ส สิ่งนี้ทำให้เรามีสองโซ่สองอันของแต่ละสาขาซึ่งสามารถลบออกได้เพื่อการประหยัดทั้งหมดห้าประตู น่าเสียดายที่ครึ่งบวกที่ C16 ยังคงมีอยู่ดังนั้นเราจึงไม่สามารถทำเช่นนั้นได้ ประการที่สาม adder แบบเต็มมีคุณสมบัติที่มีประโยชน์: ถ้าคุณสลับอินพุตและเอาต์พุตมันจะยังคงทำงานเหมือนเดิม เนื่องจากอินพุตทั้งหมดกลับด้านแล้วเราจึงสามารถย้ายอินเวอร์เตอร์ด้านหลังได้ สองครั้ง เราสามารถทำสิ่งเดียวกันในแบบดั้งเดิม แต่ ... โอ้ดี เรายังมีตัวบวกครึ่งที่มีอินพุทกลับสองตัว ฉันต้องการเพิ่มประสิทธิภาพส่วนนี้มากขึ้น แต่ฉันสงสัยว่าฉันสามารถทำได้

เนื่องจากเราดึง NOT ออกจากภายในองค์ประกอบเราจึงต้องมีความหมายอย่างใด เราได้รับแอดเดอร์ครึ่งตัวที่มีการกลับหัวกลับหาง (AKA tapped XOR) ที่ราคาสี่ประตู

ในระหว่างนี้เราได้วาดแผนภาพใหม่อีกครั้งอย่างมีนัยสำคัญ


ส่วนเดียวที่ดูเหมาะสมที่สุดคือบล็อกกลางของ Adders ข้อกำหนดเชิงตรรกะสำหรับ superfull-adder (รับบิตอินพุต 4 บิตมีบิตส่งออกสองบิต) และตัวปรับเต็มรูปแบบ การติดตั้งใช้งานของคุณพร้อมกับตัวเสริมเต็มสองตัวและตัวเสริมครึ่งตัวดูเหมือนจะปรับปรุงได้ยาก
Peter Taylor

ฉันพยายามทำให้เครือข่ายตรงนี้เมื่อคืนนี้ แต่ฉันไม่เก่งพอในเครือข่ายแบบลอจิคัลดูเหมือนว่า
Joe Z.

ยอดเยี่ยมที่สุด!
บูธโดย

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

คิมØyhus


2
คุณมีหลักฐานว่าคำตอบของคุณถูกต้องหรือไม่?
Jonathan Frech

3
ฉันอยากจะแนะนำไดอะแกรมนี้ในLogisim (ฟรี) เพื่อให้สามารถมองเห็นและทดสอบได้ง่าย
mbomb007

มันใหญ่เกินไปที่จะได้รับการพิสูจน์ว่ามีน้อยที่สุดยกเว้นคอมพิวเตอร์ควอนตัมในอนาคต ดังนั้นฉันใช้วิธีการทางสถิติเพื่อตรวจสอบการเพิ่มประสิทธิภาพ มันยังคงต้องใช้เวลาในการคำนวณมากเกินไป
KimOyhus

2
Jonathon ขอการพิสูจน์ความถูกต้องมากกว่าการพิสูจน์การมองโลกในแง่ดี ฉันไม่คิดว่าคุณจะต้องพิสูจน์ให้ถูกต้อง แต่มันจะดีถ้าเราทดสอบได้ง่ายขึ้นว่ามันถูกต้องหรือไม่แทนที่จะพูดตามนั้น
H.PWiz

4
วิธีนี้ใช้งานได้: ลองออนไลน์!
Anders Kaseorg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.