ন্যানড লজিক গেটগুলি ব্যবহার করে একটি গুণক যন্ত্র তৈরি করুন Build


20

একই ধরণের আমার আগের প্রশ্নের উপর ভিত্তি করে, ন্যানড লজিক গেটস ব্যবহার করে একটি অ্যাডিং মেশিন তৈরি করুন , এবার আপনাকে অ্যাডের পরিবর্তে গুণ করতে বলা হচ্ছে।

(দুই ওয়্যার) NAND লজিক গেটের একটি ডায়াগ্রাম যে ইনপুট তারের নিতে হবে বিল্ড A1, A2, A4, B1, B2, B4, দুই বাইনারি সংখ্যার প্রতিনিধিত্বমূলক Aথেকে Bআউটপুট তারের 0 থেকে 7 নিয়ে ফিরে আসার মান C1, C2, C4, C8, C16, এবং C32, প্রতিনিধিত্বমূলক C, যার পণ্য Aএবং B

আপনার স্কোরটি আপনি যে NAND গেটগুলি ব্যবহার করেন তার সংখ্যা দ্বারা নির্ধারিত হয় (প্রতি গেটে 1 পয়েন্ট)। জিনিসগুলি সরল করার জন্য, আপনি নিম্নলিখিত চিত্রের সাথে আপনার ডায়াগ্রামে AND, OR, NOT, এবং XOR গেটগুলি ব্যবহার করতে পারেন:

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

এই স্কোরগুলির প্রতিটি ন্যাং গেটের সংখ্যার সাথে সম্পর্কিত যা এটি সংশ্লিষ্ট গেটটি নির্মাণ করতে লাগে।

সর্বনিম্ন স্কোর জয়।


আমি লগিসিমের সর্বশেষ স্থানের উদাহরণ দেওয়ার চেষ্টা করছি। এই জিনিস শক্ত হয়।
জো জেড।

আমি আমার স্কুলে এই জিনিস যথেষ্ট পেয়েছি, কোন ধন্যবাদ।
জোহানেস কুহান

7
এই জাতীয় কাজের জন্য আমার কাছে সার্বজনীন অপ্টিমাইজার রয়েছে। এটি কে-আউটপুট বুলিয়ান ফাংশন গণনা করার জন্য সংক্ষিপ্ততম প্রোগ্রামটি আবিষ্কার করে। যদি আমি এটি এক সপ্তাহ দিয়ে থাকি তবে এটি আমাকে বলতে পারে যে এটির 13 টি গেট 2x2 গুণকটি সর্বোত্তম কিনা। 3x3? এটি শেষ হওয়ার আগেই আমি মরে যাব।
বুথবি

1
13 টি গেট 2x2 গুণকটি সর্বোত্তম (এবং জানার উত্তরে রয়েছে)। এটির সাথে এবং আরও কয়েকটি টুকরোগুলি যা আমি অনুকূল করতে পারি, আমি 60 টির পক্ষে এই সমস্যার জন্য অনুকূল হওয়ার জন্য দৃ suspect়ভাবে সন্দেহ করি। আমি সত্যিই আশা করি কেউ আমাকে ভুল প্রমাণ করেছে।
বুথবি

@ বুথবি সত্যই নয় অ্যাডর গাছের নিষ্কলুষ প্রয়োগের ফলে 18 গেটের সমাধান হয় (4 টিআরএস, 2 অর্ধ-সংযোজক), যা আমাকে ধারণার দিকে নিয়ে যায়: আমার 13 গেট ব্যবহার করতে হবে ^ কে ^ কে ^ কে ^ কে ^ কে চুরি করতে 2x2 গুণক।
জন ডিভোরাক

উত্তর:


24

55 55 50 48 গেট

48-গেটের গুণক


মূল (60 গেট) ছিল নিয়মতান্ত্রিক পদ্ধতির - প্রতিটি সংখ্যার সাথে প্রতিটি সংখ্যাকে গুণিত করুন এবং তারপরে তাদের একত্রে যোগ করুন। যথা, ওয়ালেস গাছ এবং দাদা গাছ দেখুন see

60 গেটের গুণক

উপরের অর্ধেকটি হ'ল গুণক নেটওয়ার্ক - প্রতিটি দিয়ে প্রতিটি অঙ্ক এবং একই ওজন সহ গ্রুপ আউটপুট অঙ্কগুলি গুণান। গেটগুলি বাঁচাতে কিছু বিট উল্টে গেছে।

দ্বিতীয়ার্ধটি অ্যাডারের নেটওয়ার্ক। প্রতিটি বাক্স একটি একক সংযোজনকে উপস্থাপন করে - হয় অর্ধ-সংযোজক (5 গেটস - 1 এক্স এক্সওআর এবং একটি বৈদ্যুতিন সংকেতের মেরু বদল), বা একটি পূর্ণ সংযোজক (9 গেটস - 2 এক্স এক্সওআর এবং ন্যাণ্ড ইনভার্টেড ক্যারি বিট)। শীর্ষগুলি ইনপুটগুলি হয়, নীচের আউটপুটটি যোগফল হয়, বাম আউটপুটটি বহন করে। আগের চ্যালেঞ্জ দেখুন

এরপরে 2x2 গুণকটি কাস্টম-বিল্ট 13-গেট নেটওয়ার্কে হ্যান্ড-অপ্টিমাইজ করা হয়েছে যা @ বুথবাইয়ের সন্ধান অনুসারে অনুকূল আকার । ধন্যবাদ!

এটিকে নিম্ন-বিট কোণে আটকানো এবং অ্যাডার গাছটি পুনরায় খোলার ফলে পাঁচটি গেট সাশ্রয় হয় (পুনর্বিবেশন # 2 দেখুন)। এটিকে উচ্চ-বিট কোণায় আটকানো ওভারল্যাপ তৈরি করে। অল্প কিছু গণিত আমাদের বলছে, উচ্চ গুণকটির নিম্ন-বিট ছাড়াই ওভারল্যাপটি সলভ করে এবং যা করার বাকি রয়েছে তা হল বাকী দুটি বিট যুক্ত করা এবং যোগফলগুলি যোগ করা।

এটি একা, দুর্ভাগ্যক্রমে, কোনও সঞ্চয় সরবরাহ করে না, তবে এটি দুটি অপটিমাইজেশন প্রকাশ করে। প্রথমত, দুইটি গুণকটির দুটি গেট একসাথে রয়েছে এবং একসাথে মিশে যেতে পারে। এই মুহুর্তে, আমরা 55 এ ফিরে এসেছি Second দ্বিতীয়ত, অতিরিক্ত নেটওয়ার্কে, আমাদের অর্ধ-অ্যাডারের প্রয়োজন নেই কারণ আমরা জানি যে এটির বহন শূন্য হবে। আমরা এটি একটি OR দিয়ে প্রতিস্থাপন করতে পারি। একটি OR হ'ল একটি ন্যানড যার ইনপুটগুলি উল্টে যায়। এটি আমাদের প্রতিটি শাখায় নোটের দুটি 2-চেইন সহ উত্পাদন করে, যা পরে সরানো যায়, পাঁচটি গেটের মোট সাশ্রয়ের জন্য। দুর্ভাগ্যক্রমে, সি 16 এ অর্ধ-সংযোজক এখনও বহন করে, তাই আমরা সেখানে সেখানে একই কাজ করতে পারি না। তৃতীয়ত, একটি পূর্ণ অ্যাডারের একটি দরকারী সম্পত্তি রয়েছে: আপনি যদি এর ইনপুট এবং এর ফলাফলগুলি উল্টান, এটি এখনও একই আচরণ করে। যেহেতু এর সমস্ত ইনপুটগুলি ইতিমধ্যে উল্টানো হয়েছে, আমরা ঠিক পাশাপাশি এর পিছনে ইনভার্টারগুলি সরাতে পারি। দুবার। আমরা আসল ক্ষেত্রেও এটি করতে পারতাম, কিন্তু ... আচ্ছা ভালো. আমাদের এখনও দুটি উল্টানো ইনপুট সহ একটি অর্ধ-অ্যাডারের রয়েছে। আমি এই অংশটি আরও অনুকূলিত করতে চাই, তবে আমার সন্দেহ হয় আমি পারব।

যেহেতু আমরা কোনও উপাদানগুলির অভ্যন্তর থেকে একটি নং বের করছি, আমাদের তা কোনওভাবেই বোঝাতে হবে। চারটি গেটের ব্যয়ে আমরা ইনভার্টেড ক্যারি (একেএ টেপড এক্সওআর) দিয়ে অর্ধ-সংযোজকটি পেয়েছি।

এর মধ্যে, আমরা চিত্রটিও উল্লেখযোগ্যভাবে পুনরায় তৈরি করেছি।


একমাত্র অংশ যা সম্ভাব্যরূপে অপটিমাইজড দেখায় তা হ'ল সংযোজনকারীদের মাঝের ব্লক। যৌক্তিক প্রয়োজনীয়তা হ'ল সুপারফুল-অ্যাডারের জন্য (4 টি ইনপুট বিট নেয়, দুটি বহনকারী আউটপুট বিট থাকে) এবং একটি পূর্ণ সংযোজক; দুটি পূর্ণ সংযোজনকারী এবং দুটি অর্ধ-সংযোজকগুলির সাথে আপনার বাস্তবায়নটি উন্নত করা শক্ত দেখায়।
পিটার টেলর

আমি গতরাতে এই সঠিক নেটওয়ার্কটি তৈরি করার চেষ্টা করেছি, তবে আমি লজিক্যাল নেটওয়ার্কগুলিতে যথেষ্ট পারদর্শী নই, দেখে মনে হচ্ছে।
জো জেড।

দুর্দান্ত!
বুথবি

9

39 গেট

আমি নিশ্চিত যে আমার চেয়ে এখানে আরও সহজ ডিজাইন নেই। এটা করা খুব কঠিন ছিল। আমি অন্যান্য ন্যূনতম সার্কিটও করি।

ট্রান্সমিশন বিলম্ব শীটতে প্রতিটি ন্যানড গেটের নিম্নমুখী অবস্থান দ্বারা নির্দেশিত হয়।

সর্বনিম্ন 3 বিট গুণক

ভেরিলোগ কোড এবং পরীক্ষা:

// 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
আমি এটি লজিসিমে ডায়াগ্রামিংয়ের প্রস্তাব করব (এটি নিখরচায়), যাতে এটি সহজেই দেখা এবং পরীক্ষা করা যায়।
mbomb007

এটি কোনও ন্যূনতম হিসাবে প্রমাণিত হওয়া খুব বড়, ভবিষ্যতের কোয়ান্টাম কম্পিউটার ব্যতীত। সুতরাং আমি এর অনুকূলতা যাচাই করতে পরিসংখ্যানগত পদ্ধতিগুলি ব্যবহার করি। এটি এখনও অতিরিক্ত পরিমাণে কম্পিউটিং সময় নেয়।
কিমওহুস

2
জোনাথন অনুকূলতার প্রমাণের চেয়ে বৈধতার প্রমাণ চেয়েছিলেন। আমি মনে করি না এটির বৈধতা প্রমাণ করার দরকার নেই । তবে এটি যদি আপনার পক্ষে কথা না বলে বরং এটি বৈধ কিনা তা পরীক্ষা করা আমাদের পক্ষে সহজ হত
H.PWiz

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.