NAND-এর সর্বজনীনতা — একটা মাত্র gate দিয়ে সবকিছু
Gate Universality and NAND Completeness
NAND দিয়েই NOT, AND, OR — এমনকি XOR — বানানো যায়; যেহেতু {AND, OR, NOT} ইতিমধ্যে functionally complete (Level 0), তাই NAND একাই যেকোনো Boolean function বাস্তবায়নের জন্য যথেষ্ট।
আগে এটা বুঝি
গত লেসনে দেখলাম CMOS-এ NAND আর NOR “স্বাভাবিক” — সরাসরি transistor network থেকে আসে, সবচেয়ে সস্তা। কিন্তু বাস্তব circuit-এ তো শুধু AND/OR/NOT দিয়ে না, XOR, XNOR — অনেক ধরনের function দরকার হয়।
প্রশ্ন: আমরা কি শুধু NAND (আর তার copy) দিয়ে সবকিছু বানাতে পারি? উত্তরটা “হ্যাঁ” — আর এই একটা তথ্যই ব্যাখ্যা করে কেন বাস্তব ASIC ডিজাইন এত গভীরভাবে NAND/NOR-নির্ভর।
মূল ধারণা
NAND দিয়ে NOT, AND, OR
NOT: দুইটা input-কে একই signal দিন।
┌──────┐
A ──┤ │
│ NAND ├──── A'
A ──┤ │
└──────┘AND: NAND-এর পর একটা NOT (যা আমরা এইমাত্র NAND দিয়েই বানালাম)।
OR: এখানে Level 0-এর [[de-morgans-law]] সরাসরি কাজে লাগে।
De Morgan-এর সূত্র অনুযায়ী, A OR B মানে “A-ও না, B-ও না” -এর
বিপরীত। তাই: প্রথমে A আর B-কে আলাদাভাবে invert করুন (NAND(A,A)
আর NAND(B,B)), তারপর সেই invert করা মানদুটোকে NAND করুন:
যাচাই — A=0, B=1:
NAND(A,A) = NAND(0,0) = 1NAND(B,B) = NAND(1,1) = 0NAND(1, 0) = 1- প্রত্যাশিত:
OR(0,1) = 1✓
এই তিনটাই — {NOT, AND, OR} — Level 0-এর boolean-algebra লেসনে
প্রমাণিত হয়েছিল functionally complete: যেকোনো Boolean function
এদের দিয়ে (একটা DNF/[[dnf]] expression হিসেবে) লেখা যায়। যেহেতু
NAND একাই এই তিনটা বানাতে পারে, NAND নিজেই functionally complete।
XOR from NAND — চারটা NAND-এর কৌশল
XOR-কে NAND দিয়ে বানানো সবচেয়ে চতুর অংশ — সরল “NAND + NOT” প্যাটার্নে হয় না, একটু ভিন্ন গঠন লাগে।
চার-NAND গঠন:
n1 = NAND(A, B)
n2 = NAND(A, n1)
n3 = NAND(B, n1)
Y = NAND(n2, n3)A ──┬──────────┐
│ ┌───┴───┐
├──────┤ NAND ├── n1 ──┬──────┐
│ └───────┘ │ │
│ ┌────────────────┐ │ ┌───┴───┐
└───┤ NAND (A, n1) ├──┼──┤ │
└────────────────┘ │ │ NAND ├── Y
B ──┬───┤ NAND (B, n1) ├──┴──┤ │
│ └────────────────┘ └───────┘
└──────────┘ (n1-এর ইনপুট হিসেবেও)সম্পূর্ণ truth table verify করে দেখি:
| A | B | n1=NAND(A,B) | n2=NAND(A,n1) | n3=NAND(B,n1) | Y=NAND(n2,n3) | প্রত্যাশিত XOR |
|---|---|---|---|---|---|---|
| 0 | 0 | 1 | NAND(0,1)=1 | NAND(0,1)=1 | NAND(1,1)=0 | 0 ✓ |
| 0 | 1 | 1 | NAND(0,1)=1 | NAND(1,1)=0 | NAND(1,0)=1 | 1 ✓ |
| 1 | 0 | 1 | NAND(1,1)=0 | NAND(0,1)=1 | NAND(0,1)=1 | 1 ✓ |
| 1 | 1 | 0 | NAND(1,0)=1 | NAND(1,0)=1 | NAND(1,1)=0 | 0 ✓ |
চারটা row-ই মিলে যায়। এই বিশ্লেষণটা নিজে হাতে verify করা মূল্যবান — এটা exactly সেই দক্ষতা যা পরের লেসনগুলোয় (adder, ALU) বারবার লাগবে।
ভেতরে কী ঘটছে
Functional Completeness-এর প্রমাণের কাঠামো
কেন “NAND দিয়ে AND, OR, NOT বানানো যায়” থেকে “NAND দিয়ে যেকোনো Boolean function বানানো যায়” পর্যন্ত লাফ দেওয়া বৈধ?
Level 0-এর boolean-algebra লেসনে দেখানো হয়েছিল যেকোনো truth table
[[dnf]] (sum-of-products) আকারে লেখা যায় — প্রতিটা row যেখানে
output 1, সেই row-এর একটা [[minterm]] (variable-দের AND, কিছু
invert করা) তৈরি করে, আর সব minterm-কে OR করে দেওয়া হয়। এই গঠনে
লাগে শুধু: AND (minterm বানাতে), NOT (variable invert
করতে), আর OR (minterm-গুলো একসাথে করতে)।
যেহেতু আমরা এই তিনটাই NAND দিয়ে বানিয়েছি (উপরের সরল প্রতিস্থাপন), যেকোনো DNF expression — মানে যেকোনো Boolean function — NAND দিয়ে বানানো সম্ভব। এটাই formal proof-এর কাঠামো:
সব Boolean function = কোনো DNF expression (truth table থেকে সবসময় সম্ভব)
DNF = শুধু AND, OR, NOT ব্যবহার করে (definition অনুযায়ী)
AND, OR, NOT = শুধু NAND দিয়ে বানানো যায় (এই লেসনে দেখানো হলো)
─────────────────────────────────────────
∴ সব Boolean function = শুধু NAND দিয়ে বানানো যায়উদাহরণ
একটা truth table থেকে NAND-only circuit
ধরুন আমাদের একটা 3-variable function F(A,B,C) লাগবে যা 1
দেয় শুধু A=1,B=0,C=1 অথবা A=0,B=1,C=0-এ।
DNF: F = A·B'·C + A'·B·C'
NAND রূপান্তর (De Morgan প্রয়োগ করে):
এটা দেখতে জটিল লাগলেও, প্রতিটা অংশ সরাসরি একটা NAND gate:
- ভিতরের দুইটা 3-input AND — প্রতিটা “NAND + NOT” (বা সরাসরি 3-input NAND-এর পর inverter)
- বাইরের OR — De Morgan অনুযায়ী সরাসরি একটা NAND
এই প্যাটার্নটাই (“NAND-of-NANDs”) বাস্তবে standard: যেকোনো 2-level AND-OR (sum-of-products) circuit-কে NAND-only-তে রূপান্তর করতে, প্রতিটা AND আর প্রতিটা OR gate-কেই সরাসরি একটা NAND দিয়ে প্রতিস্থাপন করা যায় (একটা ছোট bubble-pushing কৌশল, যা De Morgan-এর সরাসরি প্রয়োগ) — কোনো বাড়তি inverter স্তর ছাড়াই।
নিজে চালিয়ে দেখুন
Logisim-এ XOR-শুধু-NAND circuit যাচাই করুন
১. চারটা NAND gate primitive রাখুন, উপরের diagram অনুযায়ী জুড়ুন
২. A, B input toggle, Y-তে output probe
৩. চারটা combination চালিয়ে উপরের truth table-এর সাথে মেলান
৪. এবার built-in XOR primitive দিয়ে পাশাপাশি একই input দিয়ে চালান
— দুইটা output সবসময় মেলে কি না নিশ্চিত করুন
৪টা NAND gate সত্যিই একটা সঠিক XOR truth table দেয় — কোনো XOR primitive না ব্যবহার করেই।
নিজে বানান
একটা 3-variable Majority Function শুধু NAND দিয়ে
- একটা majority function সংজ্ঞায়িত করুন: F=1 যদি A,B,C-এর মধ্যে অন্তত দুইটা 1 হয়
- পূর্ণ truth table বানান (৮টা row)
- DNF expression বের করুন
- De Morgan প্রয়োগ করে পুরো expression-কে শুধু NAND-এর টার্মে লিখুন
- Logisim-এ শুধু NAND primitive ব্যবহার করে circuit বানান, সব ৮টা combination-এ verify করুন
Majority function বাস্তবে গুরুত্বপূর্ণ — এটাই ভিত্তি voting circuit, error-correcting memory (triple modular redundancy — তিনটা copy চালিয়ে majority vote নেওয়া, মহাকাশযান আর নিরাপত্তা-জটিল সিস্টেমে ব্যবহৃত), আর carry-lookahead adder-এর কিছু অংশে (পরের লেসনে দেখবেন)।
বাস্তব সিস্টেমে
Universality যেখানে কাজে লাগে
-
ASIC standard-cell library — বাস্তব chip design-এ synthesis tool প্রায়ই একটা high-level বর্ণনাকে NAND/NOR-ভিত্তিক gate network-এ রূপান্তর করে, কারণ এই gate-গুলো CMOS-এ সবচেয়ে সস্তা (গত লেসন) আর তাত্ত্বিকভাবে যথেষ্ট (এই লেসন)।
-
Triple Modular Redundancy (TMR) — মহাকাশযান/বিমান নিয়ন্ত্রণ সিস্টেমে একই সার্কিট তিনবার চালিয়ে একটা majority-vote circuit (যা এইমাত্র NAND দিয়ে বানানো শিখলেন) দিয়ে ফলাফল বাছাই করা হয় — একটা কপি radiation-এ ভুল দিলেও বাকি দুইটা সঠিক থাকলে সিস্টেম সঠিক থাকে।
-
FPGA-র LUT — Field-Programmable Gate Array-তে NAND-based universality-র বদলে একটা ভিন্ন mechanism ব্যবহার হয়: Look-Up Table (LUT) — একটা ছোট memory যা যেকোনো truth table সংরক্ষণ করতে পারে। এটাও “যেকোনো function বানানো”-র একটা ভিন্ন পথ, memory-ভিত্তিক না গেট-ভিত্তিক — একটা আকর্ষণীয় বিকল্প approach যা Level 12-এর কাছাকাছি টপিক।
-
Historical relay computer-এও universality — Zuse-এর Z3-তেও একটা “সার্বজনীন” building block দিয়ে সব logic composed হতো, ধারণাটা transistor-নির্দিষ্ট না, generic switch theory-র অংশ।
যে ভুলগুলো সবাই করে
“যেহেতু NAND দিয়ে সবকিছু বানানো যায়, real chip সবসময় শুধু NAND ব্যবহার করে।”
তাত্ত্বিক ন্যূনতমতা আর ব্যবহারিক সর্বোত্তমতা এক জিনিস না। বাস্তব standard-cell library-তে AND, OR, XOR, MUX — বিভিন্ন আকারের অনেক gate সরাসরি পাওয়া যায় (transistor-দক্ষভাবে ডিজাইন করা), কারণ প্রতিটা জায়গায় সবচেয়ে ভালো fit করা gate ব্যবহার করলে সামগ্রিক circuit ছোট, দ্রুত, কম বিদ্যুৎ-ক্ষুধার্ত হয়। “NAND-only” একটা তাত্ত্বিক সম্ভাব্যতার প্রমাণ, একটা ডিজাইন নির্দেশিকা না। আধুনিক synthesis tool জটিল অপ্টিমাইজেশন (area, timing, power-এর মধ্যে trade-off) করে সিদ্ধান্ত নেয় কোন gate কোথায় ব্যবহার করবে।
“XOR NAND-এর মতোই একটা 'মৌলিক' গেট, তাই একইভাবে সস্তা।”
CMOS-এ XOR সরাসরি একটা simple series/parallel transistor network
দিয়ে তৈরি হয় না (NAND/NOR-এর মতো) — সাধারণত ৮-১২টা transistor লাগে
(এই লেসনের ৪-NAND গঠনে 4 × 4 = 16 transistor, যদিও optimized
XOR-নির্দিষ্ট transistor layout কম, প্রায় ৮-১০টায় করা যায়)। এই
কারণেই XOR-heavy circuit (যেমন পরের লেসনের adder, যেখানে প্রতিটা
bit-এ একটা XOR লাগে) NAND/AND/OR-heavy circuit-এর চেয়ে তুলনামূলক
বেশি এলাকা নেয় — এটা একটা বাস্তব ডিজাইন consideration, শুধু
তাত্ত্বিক curiosity না।
বুঝেছেন কি না দেখুন
1NAND(A, NAND(A,B)) কোন Boolean function গণনা করে? সরল করে দেখান।
প্রয়োগ
NAND(A, NAND(A,B)) কোন Boolean function গণনা করে? সরল করে দেখান।De Morgan প্রয়োগ করে:
Distribution/absorption দিয়ে সরল করি (Level 0-এর boolean-algebra লেসনের identity ব্যবহার করে):
(কারণ \overline{A} + AB = (\overline{A}+A)(\overline{A}+B) = 1 \cdot (\overline{A}+B) = \overline{A}+B, distribution আর
complement law প্রয়োগ করে)
এটাই Level 0-এর propositional-logic লেসনের [[logical-connective]]
IMPLIES (→)। চমৎকার উদাহরণ — মাত্র দুইটা NAND দিয়ে একটা সম্পূর্ণ
ভিন্ন, অ-স্বজ্ঞাত connective (IMPLIES) সরাসরি বানানো যায়।
2প্রমাণ করুন {NOR} (শুধু NOR) একাই functionally complete — সংক্ষিপ্ত
যুক্তি দিন (সম্পূর্ণ derivation দরকার নেই, কাঠামোটা দেখান)।
যুক্তি
{NOR} (শুধু NOR) একাই functionally complete — সংক্ষিপ্ত
যুক্তি দিন (সম্পূর্ণ derivation দরকার নেই, কাঠামোটা দেখান)।একই কাঠামো, dual ভাবে:
যেহেতু NOR দিয়ে {NOT, OR, AND} সবগুলোই বানানো যায়, আর সেই সেট
functionally complete (Level 0), NOR-ও functionally complete।
গঠনগত মিল লক্ষ্য করুন: NAND-এর প্রমাণে যেখানে “দুই input শর্ট করে NOT” আর তারপর “De Morgan দিয়ে বাকিটা” ব্যবহার হয়েছিল, NOR-এর প্রমাণেও একই দুই কৌশল ব্যবহৃত হচ্ছে — শুধু De Morgan-এর কোন রূপ (AND-এর জন্য না OR-এর জন্য) প্রয়োগ হচ্ছে সেটাই পাল্টাচ্ছে।
3{XOR, AND} কি functionally complete? যুক্তি দিন (ইঙ্গিত: NOT
বানানো যায় কি না চিন্তা করুন)।
ডিজাইন
{XOR, AND} কি functionally complete? যুক্তি দিন (ইঙ্গিত: NOT
বানানো যায় কি না চিন্তা করুন)।হ্যাঁ, complete — কিন্তু এটা প্রমাণ করতে একটা constant 1
বা 0 লাগবে, যা প্রায়ই বাস্তব সার্কিটে সহজলভ্য (একটা তার সরাসরি
VDD বা GND-এ জোড়া)।
(A=0 হলে XOR(0,1)=1; A=1 হলে XOR(1,1)=0 — ঠিক NOT)
যেহেতু {XOR, AND} দিয়ে NOT বানানো গেছে (একটা constant ইনপুটের
সাহায্যে), আর AND নিজেই আছে, বাকি লাগে শুধু OR। OR-কে De Morgan
দিয়ে AND+NOT থেকে বানানো যায় — যা আমাদের কাছে ইতিমধ্যে আছে।
সতর্কতা: এই প্রমাণটা constant input-এর উপর নির্ভর করে — যদি
কোনো constant input পাওয়া না যায় (শুধু বিশুদ্ধ {XOR, AND} gate,
কোনো fixed wire ছাড়া), তাহলে সেটা functionally complete না,
কারণ XOR আর AND দুইটাই “linear-ish” property রক্ষা করে যা
একা দিয়ে সব function reach করতে দেয় না। এই সূক্ষ্মতাই দেখায় কেন
functional completeness প্রমাণের সময় শর্তগুলো (constant পাওয়া
যাচ্ছে কি না) সাবধানে বলা জরুরি।
4৪-NAND XOR সার্কিটে যদি n1 = NAND(A,B) গেটটা ভেঙে সবসময় 1
আউটপুট দেয় (stuck-at-1 fault), বাকি সার্কিট কী output দেবে —
এখনও XOR-এর মতো আচরণ করবে, নাকি অন্য কোনো function-এ পরিণত হবে?
প্রয়োগ
n1 = NAND(A,B) গেটটা ভেঙে সবসময় 1
আউটপুট দেয় (stuck-at-1 fault), বাকি সার্কিট কী output দেবে —
এখনও XOR-এর মতো আচরণ করবে, নাকি অন্য কোনো function-এ পরিণত হবে?n1 সবসময় 1 ধরে সার্কিট recompute করি:
n2 = NAND(A, 1) = NOT(A) = A'
n3 = NAND(B, 1) = NOT(B) = B'
Y = NAND(n2, n3) = NAND(A', B') = \overline{A' \cdot B'}
De Morgan দিয়ে: \overline{A' \cdot B'} = A + B
এই ভাঙা সার্কিট আসলে OR gate-এ পরিণত হয়েছে, XOR না। এই ধরনের বিশ্লেষণ — একটা নির্দিষ্ট internal node “stuck-at” fault হলে পুরো circuit-এর আচরণ কী হয় — বাস্তব chip manufacturing testing-এর (post-fabrication test vector generation) একটা মূল কৌশল, “stuck-at fault model” নামে পরিচিত, যা উৎপাদন-পরবর্তী প্রতিটা চিপ পরীক্ষা করতে ব্যবহৃত হয় লক্ষ লক্ষ চিপের মধ্যে ত্রুটিপূর্ণটা বাদ দিতে।
এরপর কী
আমরা এখন জানি: NAND (বা NOR) দিয়ে যেকোনো Boolean function বানানো সম্ভব। কিন্তু “সম্ভব” আর “দক্ষ” এক জিনিস না — সরাসরি DNF থেকে NAND-of-NANDs বানালে প্রায়ই অপ্রয়োজনীয়ভাবে বেশি গেট লাগে।
পরের লেসনে আমরা ফিরে যাব Level 0-এর Boolean algebra-য়, কিন্তু এবার প্রশ্নটা তাত্ত্বিক না — প্রকৌশলগত: একটা নির্দিষ্ট function-কে সর্বনিম্ন সংখ্যক গেট দিয়ে কীভাবে বাস্তবায়ন করা যায়? Karnaugh map সেই minimization-এর হাতিয়ার — আর আমরা দেখব একটা real circuit-এ minimization কতটা গেট বাঁচাতে পারে, একটা concrete before/after তুলনা দিয়ে।
আরও পড়ুন
- Introduction to Boolean Algebras, Ch. 2 — Functional Completeness — Steven Givant, Paul Halmos · Functional completeness-এর প্রামাণ্য গাণিতিক ভিত্তি
- Digital Design and Computer Architecture, §2.6 — Sarah Harris, David Harris · NAND/NOR universality-র প্রকৌশলগত উপস্থাপনা