এই পর্বে যা শিখবেন
- Logic level আর noise margin — datasheet-এর চারটি ভোল্টেজ থেকে হাতে হিসাব
- আটটি মৌলিক gate-এর প্রতীক, truth table আর Boolean রাশি, আর বেশি ইনপুটের gate
- nMOS আর pMOS দিয়ে CMOS inverter, NAND আর NOR কীভাবে বানানো হয় — কোন ইনপুটে কোন transistor চালু, আর কেন কখনো short বা float হয় না
- শুধু NAND বা শুধু NOR দিয়ে যেকোনো circuit, আর AND–OR থেকে NAND–NAND রূপান্তর
- Fan-in, fan-out, propagation delay, tri-state buffer, open-drain, logic family আর ল্যাবের 74xx chip থেকে FPGA
এই পর্বে চিহ্নের নিয়ম: লেখায় NOT বোঝাতে প্রাইম (A′), AND বোঝাতে বিন্দু (A·B) বা পাশাপাশি লেখা (AB), OR বোঝাতে +, আর XOR বোঝাতে ⊕. কোডে প্রাইমের বদলে ASCII ' (যেমন C'D) আর হিসাবে 1 - a, &, ^ ব্যবহার করা হয়েছে। Boolean algebra-র সূত্র, De Morgan-এর প্রমাণ আর SOP-POS-এর পুরো আলোচনা পর্ব ০৭-এ; এখানে আমরা দেখব সেই সূত্রগুলো silicon-এ কীভাবে দাঁড়ায়।
১ · ভোল্টেজ থেকে 0 আর 1 — logic level আর noise margin
তারের ভেতরে “1” নামে কোনো জিনিস দৌড়ায় না — দৌড়ায় ভোল্টেজ। পর্ব ০৪-এ দেখেছেন, কেন কম্পিউটার দুটি মাত্র অবস্থা বেছে নেয়: মাঝখানে বড় একটি নিরাপদ ফাঁক রাখা যায়, তাই সামান্য কাঁপুনিতে মান বদলায় না। এবার সেই ফাঁকটি সংখ্যা দিয়ে মাপব।
প্রতিটি logic family-র datasheet-এ চারটি ভোল্টেজ থাকে। দুটি পাঠানো gate-এর (output) প্রতিশ্রুতি, দুটি গ্রহণকারী gate-এর (input) শর্ত:
| নাম | কার কথা | অর্থ |
|---|---|---|
| VOH (min) | পাঠানো gate | “1” পাঠালে output অন্তত এত উঁচু থাকবে |
| VOL (max) | পাঠানো gate | “0” পাঠালে output এর বেশি উঠবে না |
| VIH (min) | গ্রহণকারী gate | এর ওপরের যেকোনো ভোল্টেজকে নিশ্চিতভাবে 1 ধরবে |
| VIL (max) | গ্রহণকারী gate | এর নিচের যেকোনো ভোল্টেজকে নিশ্চিতভাবে 0 ধরবে |
VIL আর VIH-এর মাঝের অঞ্চলটি “নিষিদ্ধ এলাকা” — সেখানে gate 0 না 1 পড়বে, তার কোনো নিশ্চয়তা নেই। একটি ভালো নকশায় output কখনো ওই এলাকায় স্থির হয়ে থাকে না, শুধু 0 থেকে 1-এ যাওয়ার পথে দ্রুত পার হয়। এখান থেকে দুটি noise margin:
যুক্তি: পাঠানো gate “1”-এ অন্তত VOH দেয়। পথে noise যদি ভোল্টেজকে v পরিমাণ নামিয়ে দেয়, গ্রহণকারী পায় VOH − v. এটি VIH-এর ওপরে থাকার শর্ত v < VOH − VIH. “0”-এর দিকে noise ভোল্টেজ বাড়ায়: VOL + v < VIL, অর্থাৎ v < VIL − VOL. পুরো লাইনের নিরাপত্তা তাই দুটির মধ্যে যেটি ছোট, সেটি — শিকলের সবচেয়ে দুর্বল কড়ার মতো।
ঢাকার ফ্লাইওভারে উচ্চতার সীমা ভাবুন। ট্রাক কোম্পানি বলে, “আমাদের ট্রাক কখনো ৩.৮ মিটারের বেশি উঁচু নয়।” ফ্লাইওভার কর্তৃপক্ষ বলে, “৪.০ মিটার পর্যন্ত নিশ্চিন্তে যাবে।” মাঝের ০.২ মিটার হলো ছাড় — রাস্তায় একটু উঁচু-নিচু থাকলেও ধাক্কা লাগবে না। Noise margin ঠিক এই ছাড়: পাঠানোর প্রতিশ্রুতি আর গ্রহণের শর্তের মাঝের ব্যবধান।
হাতে হিসাব — একটি ৩.৩ V CMOS family
৩.৩ V-এ চলা CMOS chip-এর datasheet-এ সাধারণত এমন মান দেখা যায় (সঠিক মান chip, তাপমাত্রা আর output-এ কত current টানা হচ্ছে তার ওপর নির্ভর করে — তাই এগুলোকে “typical” উদাহরণ ধরুন): হালকা load-এ VOH ≈ ৩.১ V, VOL ≈ ০.২ V; input-এ VIH = ২.০ V, VIL = ০.৮ V.
- NMH = ৩.১ − ২.০ = ১.১ V
- NML = ০.৮ − ০.২ = ০.৬ V
- নিশ্চিত নিরাপত্তা = min(১.১, ০.৬) = ০.৬ V. অর্থাৎ ০.৫ V-এর কাঁপুনিতে কিছু হবে না, কিন্তু ০.৭ V-এর কাঁপুনি “0”-কে নিষিদ্ধ এলাকায় ঠেলে দিতে পারে।
Output বেশি current দিলে (যেমন LED বা লম্বা তার চালালে) VOH নেমে যায়, VOL উঠে যায়। ভারী load-এ একই chip হয়তো শুধু VOH ≥ ২.৪ V আর VOL ≤ ০.৪ V নিশ্চিত করে — তখন দুটি margin-ই মাত্র ০.৪ V. এই শিক্ষা ল্যাবে খুব কাজে লাগে: margin কোনো স্থির সংখ্যা নয়, load-এর সাথে বদলায়।
নিচের ছোট C প্রোগ্রামটি কয়েকটি পরিচিত family-র typical মান থেকে দুটি margin হিসাব করে। সাথে একটি output pin-এর dynamic power-ও দেখায় — P = α·C·V²·f সূত্রটি পর্ব ০২-এর power wall অংশে বিস্তারিত আছে; এখানে শুধু দেখুন ভোল্টেজ কমালে খরচ কত দ্রুত কমে। Run চাপুন:
#include <stdio.h>
/* Typical datasheet-style limits (volts); real values depend on load and temperature */
struct family { const char *name; double voh, vih, vil, vol; };
int main(void) {
const struct family f[] = {
{"5V TTL (7400)", 2.4, 2.0, 0.8, 0.4},
{"5V CMOS (74HC, 4.5V)", 4.4, 3.15, 1.35, 0.1},
{"3.3V LVCMOS light", 3.1, 2.0, 0.8, 0.2},
{"3.3V heavy load", 2.4, 2.0, 0.8, 0.4},
};
printf("%-22s %6s %6s\n", "family", "NMH", "NML");
for (unsigned i = 0; i < sizeof f / sizeof f[0]; i++) {
double nmh = f[i].voh - f[i].vih; /* safety gap for a 1 */
double nml = f[i].vil - f[i].vol; /* safety gap for a 0 */
printf("%-22s %5.2fV %5.2fV\n", f[i].name, nmh, nml);
}
/* Dynamic power P = alpha * C * V^2 * f for one output pin */
const double C = 15e-12, freq = 10e6, alpha = 1.0;
const double volts[] = {5.0, 3.3, 1.8};
printf("\npin load 15 pF, 10 MHz, alpha = 1\n");
for (unsigned i = 0; i < 3; i++) {
double v = volts[i];
double e = C * v * v; /* energy per charge+discharge */
printf("V = %.1f energy/cycle = %6.1f pJ power = %5.2f mW\n",
v, e * 1e12, alpha * e * freq * 1e3);
}
return 0;
}আউটপুট:
family NMH NML
5V TTL (7400) 0.40V 0.40V
5V CMOS (74HC, 4.5V) 1.25V 1.25V
3.3V LVCMOS light 1.10V 0.60V
3.3V heavy load 0.40V 0.40V
pin load 15 pF, 10 MHz, alpha = 1
V = 5.0 energy/cycle = 375.0 pJ power = 3.75 mW
V = 3.3 energy/cycle = 163.3 pJ power = 1.63 mW
V = 1.8 energy/cycle = 48.6 pJ power = 0.49 mW
পুরোনো 5 V TTL-এ দুটি margin-ই ০.৪ V — পর্ব ০৪-এর সংখ্যার সাথে মেলে। 74HC-এর মতো 5 V CMOS-এ margin তিন গুণের বেশি (১.২৫ V), কারণ CMOS output প্রায় পুরো rail পর্যন্ত ওঠে-নামে আর input-এর সীমা সরবরাহ ভোল্টেজের অনুপাতে বসানো। ৩.৩ V LVCMOS-এ হালকা load-এ ১.১ V আর ০.৬ V, কিন্তু ভারী load-এ নেমে ০.৪ V. দ্বিতীয় অংশে একই ১৫ pF pin, একই ১০ MHz — শুধু ভোল্টেজ ৫ থেকে ১.৮ V করায় power ৩.৭৫ mW থেকে ০.৪৯ mW, প্রায় ৭.৭ গুণ কম, কারণ খরচ V-এর বর্গের অনুপাতে ((৫/১.৮)² ≈ ৭.৭)। এজন্যই chip-এর ভোল্টেজ যুগে যুগে ৫ V থেকে ১ V-এর আশেপাশে নেমেছে — আর ভোল্টেজ কমলে margin-ও ছোট হয়, যা নকশাকে কঠিন করে।
২ · আটটি মৌলিক gate — প্রতীক, truth table আর রাশি
একটি logic gate এক বা একাধিক বিট নেয় আর একটি বিট ফল দেয়। কোন ইনপুটে কী ফল, তা পুরোপুরি লেখা যায় একটি truth table-এ — n ইনপুট হলে ২nটি সারি। নিচের ছবিতে আটটি gate-এর ANSI/IEEE “distinctive shape” প্রতীক, যা বই আর পরীক্ষায় সবচেয়ে বেশি দেখা যায়। খেয়াল করুন, ছোট বৃত্ত বা bubble মানেই NOT — যে gate-এর output-এ bubble আছে, সে পাশের bubble-ছাড়া gate-এর ঠিক উল্টো ফল দেয়।
আটটি মৌলিক gate-এর প্রতীক
ANSI/IEEE distinctive-shape symbols · inputs A, B → output Y
সবগুলোর truth table এক টেবিলে (দুই ইনপুটের gate-গুলোর জন্য; NOT আর buffer-এর ইনপুট শুধু A):
| A | B | A′ (NOT) | A·B (AND) | A+B (OR) | (A·B)′ (NAND) | (A+B)′ (NOR) | A⊕B (XOR) | (A⊕B)′ (XNOR) |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
| 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
প্রতিটি gate এক বাক্যে মনে রাখার উপায়:
- AND — সব ইনপুট 1 হলে তবেই 1. ব্যাংকের লকার খুলতে ম্যানেজার আর গ্রাহক দুজনের চাবিই লাগে।
- OR — অন্তত একটি 1 হলেই 1. বাসার দুটি সুইচের যেকোনোটি চাপলেই কলিং বেল বাজে।
- NOT (inverter) — উল্টে দেয়। NAND আর NOR হলো AND আর OR-এর উল্টো ফল।
- XOR (exclusive OR) — ইনপুট দুটি আলাদা হলে 1. সিঁড়ির নিচে আর ওপরে দুটি সুইচ দিয়ে একই বাতি জ্বালানো-নেভানো — যেকোনো একটি সুইচ উল্টালেই বাতির অবস্থা বদলায়, এটি আসলে XOR. বেশি ইনপুটে XOR = “1-এর সংখ্যা বিজোড় কি না” — parity-র মূল কথা (Hamming আর CRC আছে Computer Networks কোর্সের error detection পর্বে)।
- XNOR — দুটি ইনপুট সমান হলে 1; তাই একে “equality gate”-ও বলা হয়। দুটি ৩২-বিট সংখ্যা সমান কি না দেখতে ৩২টি XNOR-এর ফল AND করলেই হয়।
- Buffer (logic buffer) — লজিকের দিক থেকে কিছুই করে না (Y = A), কিন্তু দুর্বল সংকেতকে নতুন করে “পূর্ণ শক্তির” 0 বা 1 বানিয়ে অনেক ইনপুট বা লম্বা তার চালাতে সাহায্য করে।
বেশি ইনপুটের gate
AND, OR, NAND, NOR আর XOR-এর ইনপুট দুটির বেশিও হতে পারে, কারণ AND, OR আর XOR associative — (A·B)·C = A·(B·C), তাই কোনটি আগে, তাতে কিছু যায় আসে না। তিন ইনপুটের AND = A·B·C, ৮টি সারির মধ্যে শুধু 111-এ 1. NAND-এর বেলায় সাবধান: NAND নিজে associative নয় — ((A·B)′·C)′ আর (A·B·C)′ আলাদা জিনিস। তাই ৩ ইনপুটের NAND বানাতে দুটি NAND2 সরাসরি জোড়া দিলে চলবে না; মাঝে AND (অর্থাৎ NAND + NOT) লাগবে: (A·B·C)′ = NAND(AND(A,B), C).
৩ · MOSFET — ভোল্টেজ দিয়ে চালানো সুইচ
পর্ব ০১-এ দেখেছেন, সবকিছুর নিচের স্তরে আছে transistor. আজকের প্রায় সব digital chip-এ ব্যবহৃত হয় এক বিশেষ ধরনের transistor: MOSFET (Metal-Oxide-Semiconductor Field-Effect Transistor). এর তিনটি মূল প্রান্ত — gate (নিয়ন্ত্রণ), আর source ও drain (যাদের মাঝে current যায়)। Gate-এর ভোল্টেজ ঠিক করে দেয় source আর drain-এর মাঝে পথ খোলা না বন্ধ। Gate নিজে পাতলা অন্তরক (oxide) দিয়ে আলাদা, তাই স্থির অবস্থায় gate দিয়ে প্রায় কোনো current ঢোকে না।
Digital নকশার জন্য device physics লাগে না — একটি সরল switch model যথেষ্ট:
nMOS
Gate-এ 1 (উঁচু ভোল্টেজ) → সুইচ চালু (পথ খোলা)। Gate-এ 0 → সুইচ বন্ধ। nMOS ভালোভাবে 0 পৌঁছায়, তাই একে বসানো হয় output আর GND-এর মাঝে।
“উঁচুতে চালু”pMOS
Gate-এ 0 → সুইচ চালু। Gate-এ 1 → বন্ধ। প্রতীকে gate-এ ছোট একটি bubble থাকে — সেই চেনা “NOT” চিহ্ন। pMOS ভালোভাবে 1 পৌঁছায়, তাই একে বসানো হয় VDD আর output-এর মাঝে।
“নিচুতে চালু”পুরোনো রেলস্টেশনের লেভেল-ক্রসিং গেট ভাবুন, যেখানে একটি হাতল দুটি গেট একসাথে নিয়ন্ত্রণ করে: হাতল নামালে রাস্তার গেট বন্ধ হয় আর রেললাইনের পথ খোলে, হাতল তুললে উল্টো। একই সংকেতে একটি খোলে আর অন্যটি বন্ধ হয় — nMOS আর pMOS জোড়াও ঠিক এভাবে একই ইনপুট পেয়ে বিপরীত আচরণ করে। এই “একটি খুললে অন্যটি বন্ধ” ধারণাটিই CMOS-এর প্রাণ।
কেন nMOS ভালো 0 আর pMOS ভালো 1 দেয়? সংক্ষেপে: nMOS চালু থাকতে হলে gate-কে source-এর চেয়ে অন্তত একটি threshold voltage (Vt) বেশি থাকতে হয়। nMOS দিয়ে 1 পাঠাতে গেলে output উঠতে উঠতে VDD − Vt-এ পৌঁছলেই transistor প্রায় বন্ধ হয়ে যায় — ফলে “দুর্বল 1”. pMOS-এর বেলায় ঠিক উল্টো, সে দেয় “দুর্বল 0”. তাই CMOS-এ প্রতিটি কাজ যে transistor ভালো পারে, তাকেই দেওয়া হয়।
১৯৫৯ সালে Bell Labs-এ Mohamed Atalla আর Dawon Kahng প্রথম কার্যকর MOSFET তৈরি করেন। ১৯৬৩ সালে Fairchild-এর Frank Wanlass দেখান, nMOS আর pMOS-কে জোড়ায় বসালে স্থির অবস্থায় gate প্রায় কোনো বিদ্যুৎ খরচ করে না — এর নাম হয় CMOS (Complementary MOS). শুরুতে CMOS ধীর আর বানানো কঠিন ছিল, তাই প্রথম দিকের microprocessor (যেমন Intel 4004) pMOS আর পরের অনেকগুলো nMOS প্রযুক্তিতে বানানো হয়েছিল। ১৯৮০-এর দশকে power আর তাপের চাপে শিল্প ধীরে ধীরে CMOS-এ সরে আসে, আর আজ প্রায় সব digital chip CMOS.
৪ · CMOS gate — pull-up আর pull-down নেটওয়ার্ক
প্রতিটি static CMOS gate-এর গঠন একই ছাঁচে: output Y-কে VDD-এর সাথে জুড়তে পারে এমন pMOS-এর একটি নেটওয়ার্ক — pull-up network (PUN) — আর Y-কে GND-এর সাথে জুড়তে পারে এমন nMOS-এর একটি নেটওয়ার্ক — pull-down network (PDN). নিয়ম একটাই: যে ইনপুটে Y = 0 হওয়ার কথা, সেখানে PDN-এ পথ খোলা থাকবে; যে ইনপুটে Y = 1, সেখানে PUN-এ।
Transistor-এর জোড়ার নিয়মটি সরাসরি Boolean algebra: দুটি সুইচ series-এ থাকলে পথ খোলে দুটিই চালু হলে (AND); parallel-এ থাকলে যেকোনো একটি চালু হলেই (OR). ঘরের সুইচবোর্ডে দুটি সুইচ পরপর জুড়লে দুটিই অন করতে হয়, পাশাপাশি জুড়লে যেকোনোটি অন করলেই বাতি জ্বলে।
CMOS inverter — ২টি transistor
একটি pMOS (VDD থেকে Y), একটি nMOS (Y থেকে GND), দুটির gate-এ একই ইনপুট A. A = 0 হলে pMOS চালু, nMOS বন্ধ — Y টেনে তোলা হয় VDD-তে, অর্থাৎ 1. A = 1 হলে উল্টো — Y নামে GND-তে, অর্থাৎ 0. Y = A′.
NAND2 আর NOR2 — ৪টি করে transistor
NAND2: Y = 0 হওয়ার কথা শুধু A·B = 1 হলে, তাই PDN = দুটি nMOS series-এ। PUN-কে ঠিক উল্টো সময়ে চালু হতে হবে: (A·B)′ = A′ + B′ (De Morgan), আর pMOS নিজেই “উল্টো ইনপুটে চালু” — তাই PUN = দুটি pMOS parallel-এ। NOR2 এর দ্বৈত (dual): Y = 0 যখন A + B = 1, তাই PDN = দুটি nMOS parallel-এ, আর PUN = দুটি pMOS series-এ।
নিচের stepper-এ NAND2-এর চারটি ইনপুট জোড়া একে একে দিন, আর দেখুন কোন transistor চালু হয়, কোন পথ খোলে:
| VDD → Y পথ (pMOS parallel) | |
| Y → GND পথ (nMOS series) | |
| Output Y |
- গঠন। ওপরে দুটি pMOS পাশাপাশি (parallel) — VDD থেকে Y পর্যন্ত। নিচে দুটি nMOS একটির নিচে আরেকটি (series) — Y থেকে GND পর্যন্ত। প্রতিটি ইনপুট একটি pMOS আর একটি nMOS — দুজনকেই নিয়ন্ত্রণ করে। মোট ৪টি transistor.
- A = 0, B = 0. দুটি pMOS-ই চালু (gate-এ 0), দুটি nMOS-ই বন্ধ। Y-এর ওপরের দিকে দুটি খোলা পথ, নিচে কোনো পথ নেই — Y টেনে তোলা হলো VDD-তে: Y = 1.
- A = 0, B = 1. বাঁ pMOS (A) চালু, ডান pMOS (B) বন্ধ। নিচে B-এর nMOS চালু হলেও A-এর nMOS বন্ধ — series-এ একটি বন্ধ মানেই পুরো পথ বন্ধ। একটি pMOS-ই যথেষ্ট: Y = 1.
- A = 1, B = 0. এবার ডান pMOS (B) চালু, বাঁটি বন্ধ। নিচে A-এর nMOS চালু, কিন্তু B-এর nMOS বন্ধ — GND-এর পথ আবারও বন্ধ। Y = 1.
- A = 1, B = 1. দুটি pMOS-ই বন্ধ, তাই VDD-এর সাথে কোনো যোগ নেই। দুটি nMOS-ই চালু — series পথ পুরো খোলা, Y নেমে যায় GND-তে: Y = 0. চারটি সারি মিলিয়ে ঠিক NAND-এর truth table.
- কেন কখনো short বা float নয়। PUN খোলা থাকে যখন A′ + B′ = 1, আর PDN খোলা থাকে যখন A·B = 1. De Morgan বলে A′ + B′ = (A·B)′ — অর্থাৎ দুটি শর্ত একে অপরের হুবহু উল্টো। তাই প্রতিটি ইনপুটে ঠিক একটি নেটওয়ার্ক খোলা: দুটি একসাথে খুললে VDD থেকে GND সরাসরি short হতো, কোনোটিই না খুললে Y “ভাসত” (float). Complementary নকশা দুটিকেই অসম্ভব করে দেয়।
শেষ ধাপের যুক্তিটি যেকোনো static CMOS gate-এর জন্য সাধারণ প্রমাণ: PDN-কে f-এর জন্য বানান (series = AND, parallel = OR, nMOS ইনপুট সরাসরি)। তারপর PUN বানান তার dual হিসেবে — series-কে parallel আর parallel-কে series করে, pMOS দিয়ে। De Morgan অনুযায়ী dual নেটওয়ার্কটি ইনপুটগুলোর উল্টো মানে চালু হলে ঠিক f′-এ খোলে; pMOS নিজেই উল্টো মানে চালু হয়, তাই PUN খোলে ঠিক তখনই, যখন PDN বন্ধ। প্রতিটি ইনপুটে একটি, আর কেবল একটি, পথ খোলা থাকে।
এবার একই কথা যন্ত্রে মিলিয়ে নিন। নিচের switch-level simulator প্রতিটি transistor-কে একটি সুইচ ধরে series/parallel নেটওয়ার্ক মূল্যায়ন করে, আর প্রতিটি ইনপুটে কোন transistor চালু, output কোথায় টানা হলো, short বা float হলো কি না — ছাপে। শেষে ইচ্ছা করে একটি ভুল gate (BAD) রাখা হয়েছে: PDN NAND-এর, কিন্তু PUN NOR-এর। Run চাপুন:
// CMOS switch-level simulator: nMOS ON when gate=1, pMOS ON when gate=0
const P = g => ({ k: "p", g }), N = g => ({ k: "n", g });
const ser = (...x) => ({ k: "ser", x }), par = (...x) => ({ k: "par", x });
function on(t, s, list) { // does this network conduct?
if (t.k === "p" || t.k === "n") {
const c = t.k === "n" ? s[t.g] === 1 : s[t.g] === 0;
if (c) list.push(t.k + t.g);
return c;
}
const r = t.x.map(y => on(y, s, list)); // evaluate every transistor
return t.k === "ser" ? r.every(Boolean) : r.some(Boolean);
}
const count = t => t.x ? t.x.reduce((a, y) => a + count(y), 0) : 1;
const gates = {
INV: { up: P("A"), down: N("A") },
NAND2: { up: par(P("A"), P("B")), down: ser(N("A"), N("B")) },
NOR2: { up: ser(P("A"), P("B")), down: par(N("A"), N("B")) },
BAD: { up: ser(P("A"), P("B")), down: ser(N("A"), N("B")) },
};
for (const [name, g] of Object.entries(gates)) {
const ins = name === "INV" ? ["A"] : ["A", "B"];
console.log(`== ${name}: ${count(g.up) + count(g.down)} transistors`);
for (let m = 0; m < (1 << ins.length); m++) {
const s = {}, list = [];
ins.forEach((n, i) => s[n] = (m >> (ins.length - 1 - i)) & 1);
const u = on(g.up, s, list), d = on(g.down, s, list);
const out = u && d ? "SHORT VDD-GND!" : u ? "pulled to VDD -> 1"
: d ? "pulled to GND -> 0" : "FLOATING (no path)!";
console.log(` ${ins.map(n => n + "=" + s[n]).join(" ")} ON: ${list.join(",").padEnd(9)} ${out}`);
}
}আউটপুট:
== INV: 2 transistors
A=0 ON: pA pulled to VDD -> 1
A=1 ON: nA pulled to GND -> 0
== NAND2: 4 transistors
A=0 B=0 ON: pA,pB pulled to VDD -> 1
A=0 B=1 ON: pA,nB pulled to VDD -> 1
A=1 B=0 ON: pB,nA pulled to VDD -> 1
A=1 B=1 ON: nA,nB pulled to GND -> 0
== NOR2: 4 transistors
A=0 B=0 ON: pA,pB pulled to VDD -> 1
A=0 B=1 ON: pA,nB pulled to GND -> 0
A=1 B=0 ON: pB,nA pulled to GND -> 0
A=1 B=1 ON: nA,nB pulled to GND -> 0
== BAD: 4 transistors
A=0 B=0 ON: pA,pB pulled to VDD -> 1
A=0 B=1 ON: pA,nB FLOATING (no path)!
A=1 B=0 ON: pB,nA FLOATING (no path)!
A=1 B=1 ON: nA,nB pulled to GND -> 0
pA মানে gate-এ A বসানো pMOS, nB মানে gate-এ B বসানো nMOS. INV, NAND2 আর NOR2-এর প্রতিটি সারিতে ঠিক একটি দিকে টানা হয়েছে — একটিও short বা float নেই; ফলগুলো ঠিক NOT, NAND আর NOR-এর truth table. NAND2-এর A=0 B=1 সারিতে pA,nB চালু — nB চালু থাকলেও তার সাথে series-এ থাকা nA বন্ধ, তাই GND-এর পথ নেই, stepper-এর ধাপ ৩-এর মতো। কিন্তু BAD gate-এ A=0 B=1 আর A=1 B=0-তে FLOATING: series pMOS-এর একটি বন্ধ, series nMOS-এরও একটি বন্ধ — Y কারও সাথে যুক্ত নয়, তার ভোল্টেজ আগের charge বা noise-এর ওপর নির্ভর করবে। PUN আর PDN dual না হলে ঠিক এই বিপদ। (উল্টো ভুল — দুটি নেটওয়ার্ক একসাথে খোলা — হলে SHORT দেখাত, যা বাস্তবে বিপুল current টেনে chip গরম করে।)
Transistor-এর হিসাব আর “স্বভাবতই inverting”
| Gate | গঠন | Transistor |
|---|---|---|
| NOT | ১ pMOS + ১ nMOS | ২ |
| NAND2 / NOR2 | ২ + ২ | ৪ |
| NAND3 / NOR3 | ৩ + ৩ | ৬ (k ইনপুটে ২k) |
| AND2 / OR2 | NAND2 / NOR2 + NOT | ৬ |
| XOR2 (static CMOS) | complement ইনপুটের জন্য ২টি NOT + ৮টির একটি জটিল gate | প্রায় ১২ (নকশাভেদে কমবেশি) |
| XOR2 (transmission gate দিয়ে) | pMOS-nMOS জোড়া সুইচ | প্রায় ৬–৮ |
কেন একটি transistor-স্তরের CMOS gate সবসময় inverting (NOT, NAND, NOR, AOI…)? কারণ nMOS চালু হয় ইনপুট 1 হলে, আর চালু হলে output-কে 0-এর দিকে টানে; pMOS চালু হয় ইনপুট 0 হলে, আর output-কে 1-এর দিকে টানে। অর্থাৎ যেকোনো একটি ইনপুট 0 থেকে 1 হলে output শুধু 1 থেকে 0-এর দিকেই যেতে পারে — কখনো উল্টো নয়। AND চাইলে তাই NAND-এর পরে একটি NOT লাগবেই: AND2 = ৬টি transistor, যা NAND2-এর চেয়ে বেশি আর ধীর। এ কারণেই প্রকৌশলীরা NAND আর NOR-এ ভাবতে পছন্দ করেন।
NAND কেন NOR-এর চেয়ে বেশি পছন্দের? NAND2-এ series-এ থাকে nMOS, NOR2-এ series-এ থাকে pMOS. Silicon-এ electron (nMOS-এর বাহক) hole-এর (pMOS-এর বাহক) চেয়ে দ্রুত চলে — mobility সাধারণত মোটামুটি ২–৩ গুণ (প্রযুক্তিভেদে বদলায়)। তাই একই মাপের pMOS দুর্বল, আর দুটি pMOS series-এ থাকলে সমস্যা দ্বিগুণ। NOR-কে NAND-এর সমান দ্রুত করতে pMOS-গুলো অনেক চওড়া করতে হয় — জায়গা আর capacitance দুটোই বাড়ে। বেশি ইনপুটের NOR-এ (৩–৪টি series pMOS) এটি আরও খারাপ। এজন্য বহু standard cell library-তে NAND তুলনামূলক দ্রুত আর ছোট; তবে বাস্তব নকশায় দুটিই ব্যবহার হয়।
XOR-এর আলাদা কৌশল: static CMOS-এ XOR = A·B′ + A′·B — এর জন্য A′ আর B′ লাগে (দুটি inverter, ৪টি transistor), তারপর একটি জটিল gate (৮টি)। আরেকটি উপায় transmission gate: একটি pMOS আর একটি nMOS পাশাপাশি জুড়ে বানানো দুই-দিকের সুইচ, যা 0 আর 1 দুটোই পূর্ণ শক্তিতে পার করে; এ দিয়ে XOR প্রায় ৬–৮টি transistor-এ হয়। কোন রূপটি ভালো, তা গতি, জায়গা আর পরের gate চালানোর ক্ষমতার ওপর নির্ভর করে — একটি নির্দিষ্ট “সঠিক সংখ্যা” নেই।
CMOS-এর বিদ্যুৎ খরচ — static বনাম dynamic
CMOS-এর সবচেয়ে বড় গুণ: স্থির অবস্থায় VDD থেকে GND পর্যন্ত কোনো খোলা পথ নেই (ঠিক ওপরের প্রমাণ)। তাই কোনো ইনপুট না বদলালে আদর্শ CMOS gate প্রায় শূন্য current টানে। খরচ হয় মূলত তিন জায়গায়:
- Dynamic (switching) power: প্রতিটি output-এর পেছনে কিছু capacitance থাকে (পরের gate-এর ইনপুট আর তার)। 0 → 1 হলে সেটি VDD থেকে charge হয়, 1 → 0 হলে GND-তে খালি হয় — প্রতি পূর্ণ চক্রে C·V² শক্তি খরচ। সব মিলিয়ে P ≈ α·C·V²·f, যেখানে α হলো কত ভাগ সময় output উল্টায়। বিস্তারিত পর্ব ০২-এ।
- Short-circuit power: ইনপুট যখন 0 থেকে 1-এ যাচ্ছে, মাঝের খুব অল্প সময় pMOS আর nMOS দুটোই আংশিক চালু থাকে — এক ঝলক current সরাসরি VDD থেকে GND-তে যায়। ইনপুট দ্রুত বদলালে এটি ছোট থাকে।
- Static power (leakage): “বন্ধ” transistor-ও পুরোপুরি বন্ধ নয় — সামান্য current চুইয়ে যায়। পুরোনো বড় transistor-এ এটি নগণ্য ছিল; nanometer-মাপের transistor আর কম threshold voltage-এ এটি মোট power-এর উল্লেখযোগ্য অংশ হয়ে উঠেছে। এজন্যই আধুনিক chip অব্যবহৃত অংশের power পুরো কেটে দেয় (power gating).
পানির ট্যাংক আর বালতির কথা ভাবুন। বালতি (capacitance) ভরাতে ট্যাংক থেকে পানি লাগে, খালি করলে সেই পানি ড্রেনে যায় — প্রতিবার ভরা-খালি মানেই এক বালতি পানি খরচ (dynamic). কল বন্ধ থাকলে খরচ নেই, শুধু পুরোনো কলের মুখ দিয়ে ফোঁটা ফোঁটা চুইয়ে পড়ে (leakage). আর কল ঘোরানোর মুহূর্তে একঝলক পানি সরাসরি ড্রেনে চলে যায় (short-circuit).
৫ · Universal gate — শুধু NAND বা শুধু NOR দিয়ে সবকিছু
পর্ব ০৭-এ দেখেছেন, {AND, OR, NOT} একটি functionally complete সেট — যেকোনো Boolean ফাংশন SOP আকারে এদের দিয়ে লেখা যায়। তাহলে NAND দিয়ে যদি NOT, AND আর OR — তিনটিই বানানো যায়, NAND একাই সব পারবে। এ কারণে NAND আর NOR-কে বলা হয় universal gate.
| বানাতে চাই | শুধু NAND দিয়ে | NAND সংখ্যা | শুধু NOR দিয়ে | NOR সংখ্যা |
|---|---|---|---|---|
| NOT A | (A·A)′ = A′ | ১ | (A+A)′ = A′ | ১ |
| A·B | NAND-এর পরে NAND-inverter | ২ | (A′ + B′)′ — দুটি ইনপুট উল্টে NOR | ৩ |
| A + B | (A′·B′)′ — দুটি ইনপুট উল্টে NAND | ৩ | NOR-এর পরে NOR-inverter | ২ |
| A ⊕ B | চারটি NAND-এর বিশেষ নকশা (নিচে) | ৪ | ৪টি NOR-এ XNOR, তারপর NOT | ৫ |
| (A ⊕ B)′ | XOR-এর পরে NOT | ৫ | চারটি NOR-এর একই নকশা | ৪ |
OR-এর NAND রূপটি সরাসরি De Morgan: (A′·B′)′ = A″ + B″ = A + B. AND-এর NOR রূপও তাই: (A′ + B′)′ = A·B. টেবিলে একটি সুন্দর প্রতিসাম্য দেখুন — NAND আর NOR-এর ভূমিকা অদলবদল করলে AND আর OR-এর ভূমিকাও অদলবদল হয়। এটি Boolean algebra-র duality-র সরাসরি ফল।
চারটি NAND-এ XOR — চালাক নকশা
সরল পথে XOR = A·B′ + A′·B বানালে লাগে ২টি inverter + ২টি NAND + ১টি NAND = ৫টি NAND. কিন্তু একটি কৌশলে ৪টিতেই হয়: প্রথম NAND-এর ফল N1 = (A·B)′ দুই দিকেই ভাগ করে ব্যবহার করা। নিচে A = 1, B = 0 দিয়ে প্রতিটি তারের মান একে একে দেখুন:
| হিসাব | |
| কত gate পার হলো |
- ইনপুট। A = 1, B = 0. XOR-এর উত্তর হওয়া উচিত 1, কারণ ইনপুট দুটি আলাদা। A আর B দুজনেই দুটি করে gate-এ যায়: A যায় N1 আর N2-তে, B যায় N1 আর N3-তে।
- N1 = NAND(A, B). (1·0)′ = 1. N1 আসলে প্রশ্ন করছে “দুটিই কি 1?” — উত্তর না, তাই 1. এই তারটি দুই ভাগ হয়ে N2 আর N3 দুজনের কাছেই যায়; এটিই চালাকি।
- N2 = NAND(A, N1). (1·1)′ = 0. N2 = 0 মানে “A = 1, কিন্তু দুটিই 1 নয়” — অর্থাৎ A·B′ সত্য। (N2 আসলে (A·B′)′.)
- N3 = NAND(B, N1). (0·1)′ = 1. N3 = (A′·B)′; এখানে B = 0, তাই A′·B মিথ্যা, N3 = 1.
- Y = NAND(N2, N3). (0·1)′ = 1 — ঠিক A ⊕ B = 1 ⊕ 0 = 1. সংকেত সবচেয়ে বেশি পার হয়েছে ৩টি gate (N1 → N2 → N4), তাই এই XOR-এর delay ৩ gate delay.
- অন্য একটি সারি: A = B = 1. N1 = (1·1)′ = 0. তখন N2 = (1·0)′ = 1, N3 = (1·0)′ = 1, আর Y = (1·1)′ = 0 — সমান ইনপুটে XOR = 0, মিলে গেছে। বাকি সারিগুলো (00, 01) নিচের simulator একসাথে যাচাই করবে।
- প্রমাণ। Y = (N2·N3)′ = N2′ + N3′ = A·(AB)′ + B·(AB)′ (De Morgan). এখন (AB)′ = A′ + B′ বসালে A·(A′ + B′) = AA′ + AB′ = AB′, আর B·(A′ + B′) = A′B. তাই Y = AB′ + A′B = A ⊕ B. সব সারির জন্য একসাথে প্রমাণ হলো।
নিচের gate-level simulator একটি netlist নেয় — প্রতিটি লাইনে “কোন তার, কোন gate, কোন কোন ইনপুট” — আর সব ইনপুটে মান হিসাব করে truth table ছাপে, পাশে লক্ষ্য ফাংশনের মান রেখে মিলিয়ে দেখে। প্রথম netlist ওপরের চার-NAND XOR; দ্বিতীয়টি অংশ ৬-এর বিষয় — F = A·B + C′·D-এর NAND–NAND রূপ। Run চাপুন:
// Gate-level simulator: a netlist is a list of [output, gate, inputs...]
const G = {
NOT: a => 1 - a, AND: (a, b) => a & b, OR: (a, b) => a | b,
NAND: (a, b) => 1 - (a & b), NOR: (a, b) => 1 - (a | b), XOR: (a, b) => a ^ b,
};
function simulate(netlist, inputs) { // gates listed in signal order
const v = { ...inputs };
for (const [out, g, ...ins] of netlist) v[out] = G[g](...ins.map(x => v[x]));
return v;
}
function check(title, names, netlist, target) {
console.log(`== ${title} (${netlist.length} gates)`);
console.log(names.join(" ") + " | out target");
let ok = true;
for (let m = 0; m < (1 << names.length); m++) {
const inp = {};
names.forEach((n, i) => inp[n] = (m >> (names.length - 1 - i)) & 1);
const out = simulate(netlist, inp).Y, t = target(inp);
if (out !== t) ok = false;
console.log(names.map(n => inp[n]).join(" ") + " | " + out + " " + t);
}
console.log(ok ? "MATCH: circuit == target\n" : "MISMATCH!\n");
}
const xor4 = [["N1", "NAND", "A", "B"], ["N2", "NAND", "A", "N1"],
["N3", "NAND", "B", "N1"], ["Y", "NAND", "N2", "N3"]];
check("XOR from 4 NANDs", ["A", "B"], xor4, s => s.A ^ s.B);
// F = A.B + C'.D as a two-level NAND-NAND circuit (C' made by a NAND)
const sop = [["Cn", "NAND", "C", "C"], ["T1", "NAND", "A", "B"],
["T2", "NAND", "Cn", "D"], ["Y", "NAND", "T1", "T2"]];
check("NAND-NAND for F = A.B + C'.D", ["A", "B", "C", "D"], sop,
s => (s.A & s.B) | ((1 - s.C) & s.D));আউটপুট:
== XOR from 4 NANDs (4 gates)
A B | out target
0 0 | 0 0
0 1 | 1 1
1 0 | 1 1
1 1 | 0 0
MATCH: circuit == target
== NAND-NAND for F = A.B + C'.D (4 gates)
A B C D | out target
0 0 0 0 | 0 0
0 0 0 1 | 1 1
0 0 1 0 | 0 0
0 0 1 1 | 0 0
0 1 0 0 | 0 0
0 1 0 1 | 1 1
0 1 1 0 | 0 0
0 1 1 1 | 0 0
1 0 0 0 | 0 0
1 0 0 1 | 1 1
1 0 1 0 | 0 0
1 0 1 1 | 0 0
1 1 0 0 | 1 1
1 1 0 1 | 1 1
1 1 1 0 | 1 1
1 1 1 1 | 1 1
MATCH: circuit == target
XOR-এর চারটি সারিতেই circuit-এর ফল (out) আর লক্ষ্য (target) সমান — stepper-এর দুটি সারি (10 আর 11) এখানেও 1 আর 0. দ্বিতীয় circuit-এ ১৬টি সারির সবকটিতে মিল: F = 1 হয় যখন A = B = 1 (শেষ চার সারি), অথবা C = 0 আর D = 1 (যেমন 0 0 0 1, 0 1 0 1, 1 0 0 1). Netlist-এ gate-গুলো সংকেতের ক্রমে লেখা — আগে যার ফল লাগবে, সে আগে; তাই একবার ওপর থেকে নিচে চললেই সব মান পাওয়া যায়। বড় simulator (যেমন Verilog-এর, পর্ব ১৪) এই ক্রম নিজেই বের করে, আর সময়ের হিসাবও রাখে। এখানে যাচাই “exhaustive” — সব ২n ইনপুট চেষ্টা করা হয়েছে, তাই মিল মানে দুটি ফাংশন সত্যিই এক; ছোট n-এ এটিই সবচেয়ে নির্ভরযোগ্য প্রমাণ।
৬ · SOP থেকে NAND–NAND, POS থেকে NOR–NOR — bubble pushing
যেকোনো ফাংশন SOP (sum of products) আকারে লেখা গেলে তাকে একটি AND স্তর আর একটি OR স্তর দিয়ে বানানো যায় — two-level AND–OR circuit. কিন্তু CMOS-এ AND আর OR দুটোই “NAND/NOR + NOT” — ধীর আর বড়। সমাধান bubble pushing: তারের ওপর জোড়ায় জোড়ায় bubble বসানো (দুটি NOT মিলে কিছুই না) আর De Morgan দিয়ে gate-এর আকার বদলানো। De Morgan-কে gate-এর ভাষায় বললে:
NOR = ইনপুটে bubble-ওয়ালা AND · (A + B)′ = A′·B′
নিচে F = A·B + C′·D-কে ধাপে ধাপে NAND–NAND করা দেখুন; প্রতি ধাপে একটি ইনপুট (A = 0, B = 0, C = 0, D = 1) দিয়ে মিলিয়ে নেওয়া হয়েছে যে মান বদলায়নি:
| Circuit-এর রূপ | |
| রাশি | |
| যাচাই (A=0, B=0, C=0, D=1) |
- শুরু: AND–OR. F = A·B + C′·D সরাসরি বানালে লাগে একটি NOT (C′), দুটি AND আর একটি OR. A = 0, B = 0, C = 0, D = 1-এ প্রথম গুণফল 0, দ্বিতীয়টি 1, তাই F = 1.
- প্রতিটি মাঝের তারে দুটি bubble. AND-এর output আর OR-এর input-এর মাঝের প্রতিটি তারে পরপর দুটি NOT বসানো হলো। (x′)′ = x, তাই circuit-এর ফল একটুও বদলায়নি — শুধু লেখার ধরন বদলেছে।
- প্রথম bubble AND-এর সাথে মিশল. AND-এর পরে NOT মানেই NAND. তাই প্রথম স্তর এখন দুটি NAND: T1 = (A·B)′, T2 = (C′·D)′. যাচাইয়ে T1 = 1, T2 = 0, আর OR-এর bubble দুটি এগুলোকে উল্টে 0 আর 1 করে, F = 1.
- দ্বিতীয় bubble OR-এর ইনপুটে. ইনপুটে bubble-ওয়ালা OR = T1′ + T2′. De Morgan বলে T1′ + T2′ = (T1·T2)′ — অর্থাৎ এটি আসলে একটি NAND! যাচাই: (1·0)′ = 1.
- ফল: দুই স্তরের NAND–NAND. F = ((A·B)′ · (C′·D)′)′. C′ বানানো যায় NAND(C, C) দিয়ে — তাহলে পুরো circuit শুধু NAND, ল্যাবে একটি 7400 chip-এর চারটি gate-এই হয়ে যায়।
- লাভের হিসাব. AND–OR: দুটি AND2 (৬ + ৬) + OR2 (৬) + NOT (২) = ২০ transistor. NAND–NAND: তিনটি NAND2 (৪ × ৩ = ১২) + একটি inverter (২) = ১৪ transistor. দুটিতেই gate-এর স্তর ২টি (+ C′-এর inverter), কিন্তু NAND–NAND-এ প্রতিটি স্তর একটি মাত্র transistor-স্তর, AND–OR-এ দুটি — তাই NAND–NAND ছোট আর দ্রুত।
SOP → NAND–NAND: প্রতিটি গুণফলের AND-কে NAND, শেষের OR-কে NAND. একটি মাত্র চলকের গুণফল (যেমন F = AB + C′-এর C′) সরাসরি শেষ NAND-এ যায়, কিন্তু উল্টো করে — অর্থাৎ C′-এর বদলে C. POS → NOR–NOR: ঠিক dual: প্রতিটি যোগফলের OR-কে NOR, শেষের AND-কে NOR. যেমন G = (A + B)·(C′ + D) = ((A + B)′ + (C′ + D)′)′ = NOR(NOR(A, B), NOR(C′, D)).
এই নিয়মটি যান্ত্রিক, তাই প্রোগ্রাম দিয়েও করা যায়। নিচের converter একটি SOP রাশি (যেমন "AB + C'D") নিয়ে NAND–NAND netlist বানায় — দরকারি complement-এর জন্য NAND-inverter বসায়, এক-চলকের গুণফল উল্টে শেষ NAND-এ পাঠায় — তারপর সব ইনপুটে চালিয়ে মূল রাশির সাথে মেলায় আর gate ও transistor গোনে। Run চাপুন:
// SOP -> NAND-NAND converter with exhaustive equivalence check
function toNand(expr) { // expr like "AB + C'D"
const terms = expr.split("+").map(t => t.trim().match(/[A-Z]'?/g));
const net = [], made = {};
const lit = (x, want) => { // signal name for x or x'
const base = x[0], neg = x.length > 1 !== !want;
if (!neg) return base;
if (!made[base]) { made[base] = base + "n"; net.push([base + "n", [base, base]]); }
return made[base];
};
const top = terms.map((t, i) => {
if (t.length === 1) return lit(t[0], false); // single literal: feed x'
net.push(["T" + (i + 1), t.map(x => lit(x, true))]);
return "T" + (i + 1);
});
net.push(["Y", top]);
return { terms, net };
}
const sopVal = (terms, s) => terms.some(t => t.every(x => x.length > 1 ? !s[x[0]] : s[x]));
function run(expr) {
const { terms, net } = toNand(expr);
const vars = [...new Set(expr.match(/[A-Z]/g))].sort(); let bad = 0;
for (let m = 0; m < (1 << vars.length); m++) {
const s = {};
vars.forEach((v, i) => s[v] = (m >> (vars.length - 1 - i)) & 1);
for (const [o, ins] of net) s[o] = ins.every(x => s[x]) ? 0 : 1; // NAND
if (s.Y !== (sopVal(terms, s) ? 1 : 0)) bad++;
}
const tr = net.reduce((a, [, ins]) => a + 2 * ins.length, 0);
console.log(`F = ${expr}`);
net.forEach(([o, ins]) => console.log(` ${o.padEnd(2)} = NAND(${ins.join(", ")})`));
console.log(` NAND gates: ${net.length}, CMOS transistors: ${tr}, ` +
`checked ${1 << vars.length} rows, mismatches: ${bad}`);
}
["AB + C'D", "A'B + AB'", "ABC + A'D + B'"].forEach(run);আউটপুট:
F = AB + C'D
T1 = NAND(A, B)
Cn = NAND(C, C)
T2 = NAND(Cn, D)
Y = NAND(T1, T2)
NAND gates: 4, CMOS transistors: 16, checked 16 rows, mismatches: 0
F = A'B + AB'
An = NAND(A, A)
T1 = NAND(An, B)
Bn = NAND(B, B)
T2 = NAND(A, Bn)
Y = NAND(T1, T2)
NAND gates: 5, CMOS transistors: 20, checked 4 rows, mismatches: 0
F = ABC + A'D + B'
T1 = NAND(A, B, C)
An = NAND(A, A)
T2 = NAND(An, D)
Y = NAND(T1, T2, B)
NAND gates: 4, CMOS transistors: 20, checked 16 rows, mismatches: 0
প্রথম রাশিটি stepper-এর F — ৪টি NAND, আর ১৬টি সারিতে একটিও অমিল নেই। Transistor ১৬টি, কারণ এখানে C′-ও একটি NAND2 (inputs জোড়া, ৪টি transistor); সত্যিকারের inverter বসালে ২টি কমে ১৪ হতো, stepper-এর হিসাবের মতো। দ্বিতীয় রাশি A′B + AB′ আসলে XOR — যান্ত্রিক নিয়মে লাগল ৫টি NAND, অথচ অংশ ৫-এর চালাক নকশায় ৪টি। শিক্ষা: two-level রূপ সবসময় সবচেয়ে ছোট নয়; multi-level নকশায় একটি ফল ভাগ করে ব্যবহার করে gate বাঁচানো যায় (পর্ব ১০-এ multi-level logic). তৃতীয় রাশিতে B′ এক-চলকের গুণফল — তাই শেষ NAND-এ সরাসরি B গেছে, কোনো inverter ছাড়াই; আর ৩ ইনপুটের গুণফল ABC-র জন্য NAND3 (৬টি transistor). K-map দিয়ে SOP আগে সরল করে নিলে (পর্ব ০৯) gate আরও কমে।
৭ · Fan-in, fan-out আর propagation delay
Fan-in হলো একটি gate-এর ইনপুট সংখ্যা। Fan-out হলো একটি gate-এর output কতগুলো gate-এর ইনপুট চালাচ্ছে। দুটিরই দাম আছে:
- বেশি fan-in: k ইনপুটের NAND-এ k-টি nMOS series-এ — প্রতিটি যোগ করলে পথের রোধ বাড়ে, আর parallel pMOS-গুলোর capacitance-ও output-এ জমে। তাই বাস্তবে সাধারণত ৩–৪ ইনপুটের বেশি NAND/NOR এক gate-এ না বানিয়ে ছোট gate-এর গাছ (tree) বানানো হয়। যেমন ৮ ইনপুটের AND = দুটি NAND4 → একটি NOR2 (De Morgan: (X′ + Y′)′ = X·Y).
- বেশি fan-out: প্রতিটি বাড়তি ইনপুট output-এ আরও capacitance যোগ করে, তাই charge হতে বেশি সময় লাগে — delay মোটামুটি load-এর সাথে বাড়ে। পুরোনো TTL-এ সীমাটি ছিল current-এর: একটি standard TTL output সাধারণত ১০টি standard TTL input চালাতে পারত (“fan-out ১০”)। CMOS ইনপুট প্রায় কোনো স্থির current টানে না, তাই সেখানে সীমাটা মূলত গতির — বেশি fan-out মানে ধীর সংকেত। সমাধান: মাঝে buffer বসিয়ে load ভাগ করা।
Propagation delay আর contamination delay
ইনপুট বদলালে output সঙ্গে সঙ্গে বদলায় না — capacitance charge বা discharge হতে সময় লাগে। দুটি সংখ্যা দিয়ে একে ধরা হয়:
- Propagation delay (tPD) — ইনপুট বদলানোর পর output সবচেয়ে বেশি যত সময় পরে নতুন মানে স্থির হবে, তার নিশ্চয়তা। “এর পরে আর চিন্তা নেই।”
- Contamination delay (tCD) — ইনপুট বদলানোর পর output সবচেয়ে কম যত সময় পরে বদলাতে শুরু করতে পারে। “এর আগে পুরোনো মান নিরাপদ।”
একটি circuit-এর tPD = ইনপুট থেকে output-এর সবচেয়ে ধীর পথের gate-গুলোর tPD-এর যোগফল (এই পথটিই critical path). আর circuit-এর tCD = সবচেয়ে দ্রুত পথের gate-গুলোর tCD-এর যোগফল।
উদাহরণ (পরীক্ষার ধরনে): ধরুন প্রতিটি NAND2-এর tPD = ৩০ ps আর tCD = ২০ ps (সংখ্যাগুলো হিসাবের সুবিধার জন্য ধরা)। চার-NAND XOR-এ পথগুলো: A → N1 → N2 → N4 (৩ gate), B → N1 → N3 → N4 (৩ gate), A → N2 → N4 (২ gate), B → N3 → N4 (২ gate). তাই tPD = ৩ × ৩০ = ৯০ ps, আর tCD = ২ × ২০ = ৪০ ps. NAND–NAND-এর F = AB + C′D-তে দীর্ঘতম পথ C → NAND(C,C) → T2 → Y (৩ gate) আর ক্ষুদ্রতম A → T1 → Y (২ gate).
Gate delay তাই circuit তুলনার একটি সহজ “একক”: “এই adder-এ ৮ gate delay, ওটায় ৪” (পর্ব ১১-এ ripple-carry বনাম carry-lookahead এভাবেই তুলনা হবে)। তবে এটি একটি সরলীকরণ — বাস্তবে প্রতিটি gate-এর delay নির্ভর করে তার ধরন, fan-out, তারের দৈর্ঘ্য আর ইনপুট কোনটি বদলাল তার ওপর। Clock-এর গতি কীভাবে critical path দিয়ে ঠিক হয়, setup আর hold time, আর glitch — সব বিস্তারিত পর্ব ১৮-এ (Timing আর clock).
সাধারণ ভুল: tCD-কে “গড় delay” ভাবা। tCD সবচেয়ে ছোট সময়ের নিশ্চয়তা — দ্রুততম পথ দিয়ে হিসাব হয়। আর tPD সবচেয়ে বড় সময়ের — ধীরতম পথ দিয়ে। পরীক্ষায় দুটি একই circuit-এ আলাদা পথ ধরে হিসাব করতে হয়।
৮ · Tri-state buffer আর open-drain — একই তারে অনেকে
সাধারণ gate-এর output সবসময় হয় 0 নয় 1 — কোনো না কোনো দিকে জোর করে টানে। এখন ভাবুন একটি তার (bus) যেখানে মেমরি, keyboard controller আর display — তিনজনই ডেটা পাঠাতে চায়। দুজন একসাথে output দিলে একজন 1-এর দিকে, আরেকজন 0-এর দিকে টানবে: VDD থেকে GND সরাসরি পথ, প্রচুর current, ভুল মান — একে বলে bus contention.
সমাধান ১ — tri-state buffer: একটি buffer, যার সাথে একটি enable (EN) ইনপুট। EN = 1 হলে Y = A; EN = 0 হলে output-এর pMOS আর nMOS দুটোই বন্ধ — output কোনো দিকে টানে না, যেন তার থেকে বিচ্ছিন্ন। এই তৃতীয় অবস্থার নাম high impedance, লেখা হয় Z. নিয়ম: যেকোনো মুহূর্তে একটি তারের সাথে যুক্ত tri-state buffer-গুলোর মধ্যে বড়জোর একটির EN = 1.
| EN | A | Y |
|---|---|---|
| 0 | 0 বা 1 | Z (বিচ্ছিন্ন) |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
সমাধান ২ — open-drain (TTL-এ “open-collector”): output-এ শুধু nMOS থাকে, কোনো pMOS নেই। ফলে output হয় 0-তে টানে, নয়তো ছেড়ে দেয় (Z). তারটিকে একটি pull-up resistor দিয়ে VDD-এর সাথে জোড়া হয়: কেউ না টানলে তার 1, যেকোনো একজন টানলেই 0. অনেকে একসাথে টানলেও short হয় না — শুধু 0. এর ফলে তারটি নিজেই একটি AND gate-এর মতো আচরণ করে (সবাই ছেড়ে দিলে তবেই 1) — একে বলে wired-AND. I²C-এর মতো জনপ্রিয় দুই-তারের bus ঠিক এভাবে কাজ করে, আর কম্পিউটারের বহু interrupt লাইনও ঐতিহাসিকভাবে এভাবে ভাগ করা হতো।
মহল্লার মসজিদ বা মন্দিরের একটি মাইক ভাবুন। Tri-state মানে ঘোষণার নিয়ম: একসাথে একজনই মাইক ধরবেন, বাকিরা মাইক থেকে হাত সরিয়ে রাখবেন (Z). Open-drain যেন বাসের “থামুন” ঘণ্টার দড়ি: যাত্রীদের কেউ দড়ি টানলেই ঘণ্টা বাজে, অনেকে একসাথে টানলেও কোনো ক্ষতি নেই — কেউ না টানলে দড়ি নিজে থেকেই আগের অবস্থায় ফিরে যায় (pull-up).
Open-drain-এর দাম গতি: 1-এর দিকে ফিরতে হয় resistor দিয়ে, যা transistor-এর চেয়ে ধীর। তাই দ্রুত bus-গুলো এখন point-to-point সংযোগের দিকে গেছে। Bus, memory-mapped I/O, PCIe আর USB-এর পুরো গল্প পর্ব ৫১-এ।
৯ · Logic family, ল্যাবের 74xx chip আর FPGA
এক নজরে logic family-র ইতিহাস
একই gate নানা প্রযুক্তিতে বানানো যায়; প্রতিটি প্রযুক্তির ভোল্টেজ, গতি আর power-এর নিজস্ব নিয়ম মিলিয়ে একটি logic family. মোটা দাগে ক্রমটি এমন (সাল আর বিবরণ আনুমানিক):
- RTL আর DTL (১৯৬০-এর দশকের শুরু) — resistor বা diode আর bipolar transistor দিয়ে বানানো gate; প্রথম দিকের IC-গুলো এমন ছিল। Apollo মহাকাশযানের guidance computer হাজার কয়েক ছোট NOR-gate chip দিয়ে বানানো হয়েছিল বলে জানা যায়।
- TTL (Transistor-Transistor Logic, ১৯৬০-এর দশকের মাঝামাঝি) — Texas Instruments-এর 7400 series দশকের পর দশক ধরে শিল্পের মান হয়ে ওঠে; 5 V সরবরাহ, দ্রুত, কিন্তু স্থির অবস্থাতেও current টানে।
- CMOS 4000 series (১৯৬০-এর দশকের শেষে, RCA) — খুব কম power, বিস্তৃত সরবরাহ ভোল্টেজ, কিন্তু তখনকার TTL-এর চেয়ে ধীর।
- 74HC, 74AC, 74LVC… — CMOS প্রযুক্তিতে বানানো, কিন্তু 7400-এর মতো একই নাম আর pin-বিন্যাস; একদিকে CMOS-এর কম power, অন্যদিকে TTL-এর পরিচিত পরিবার। 74HCT-র মতো কিছু রূপ TTL-এর ভোল্টেজ সীমা মেনে চলে, যাতে দুই family মেশানো যায়।
- আধুনিক CMOS — আজকের CPU-র ভেতরের কোটি কোটি gate প্রায় ১ V-এর আশেপাশে চলে; সেগুলো আর আলাদা chip নয়, একটি die-এর ওপর standard cell হিসেবে বসানো।
IC-র মাপ — SSI থেকে VLSI
একটি IC-তে কত gate আছে, তা দিয়ে পুরোনো একটি শ্রেণিবিভাগ চলে (সীমাগুলো বইভেদে একটু আলাদা): SSI (small-scale, প্রায় ১০টির কম gate — যেমন 7400), MSI (medium, দশ থেকে শ খানেক — যেমন counter, multiplexer, decoder), LSI (large, শত থেকে হাজার কয়েক — প্রথম দিকের microprocessor আর মেমরি), আর VLSI (very large, দশ হাজারের বেশি — আজকের সব CPU, যেখানে transistor-এর সংখ্যা কোটি থেকে শত কোটি)। আজ “VLSI design” কথাটি সাধারণভাবে chip নকশার পুরো ক্ষেত্রকেই বোঝায়।
ল্যাবের পরিচিত chip
বিশ্ববিদ্যালয়ের Digital Logic ল্যাবে breadboard-এর ওপর নিচের chip-গুলো প্রায় সবখানেই দেখা যায় (সাধারণত 74LS বা 74HC রূপে, ১৪-pin DIP প্যাকেজে):
| Chip | ভেতরে কী | কাজে লাগে |
|---|---|---|
| 7400 | ৪টি ২-ইনপুট NAND (quad NAND2) | universal — যেকোনো circuit |
| 7402 | ৪টি ২-ইনপুট NOR | universal — NOR–NOR নকশা |
| 7404 | ৬টি inverter (hex NOT) | complement বানানো |
| 7408 | ৪টি ২-ইনপুট AND | AND–OR নকশা |
| 7432 | ৪টি ২-ইনপুট OR | AND–OR নকশা |
| 7486 | ৪টি ২-ইনপুট XOR | adder, parity, তুলনা |
| 74125 | ৪টি tri-state buffer | bus-এ সংযোগ |
এই chip-গুলোর বেশিরভাগে pin ১৪ হলো VCC আর pin ৭ হলো GND — তবু তার জোড়ার আগে সবসময় নির্মাতার datasheet দেখে নিন, কারণ ব্যতিক্রম আছে আর ভুল pin-এ সরবরাহ দিলে chip নষ্ট হতে পারে। একটি ব্যবহারিক কারণে 7400 জনপ্রিয়: অংশ ৬-এর মতো যেকোনো SOP NAND–NAND করলে পুরো circuit একই ধরনের chip দিয়ে বানানো যায়, কম ধরনের chip কিনতে হয়।
আজকের ল্যাব — programmable logic
বড় নকশা breadboard-এ তার জুড়ে বানানো অবাস্তব। এখন অনেক ল্যাব আর শিল্পে ব্যবহার হয় FPGA (Field-Programmable Gate Array) আর CPLD. FPGA-র ভেতরে হাজার হাজার ছোট lookup table (LUT) — প্রতিটি আসলে একটি ছোট মেমরি, যাতে একটি truth table লিখে রাখা যায়, ফলে যেকোনো ছোট ফাংশন হয়ে যায় — আর সেগুলোর মাঝে প্রোগ্রাম করা যায় এমন তারের জাল। নকশা লেখা হয় Verilog বা VHDL-এর মতো hardware description language-এ, তারপর tool সেটিকে LUT আর সংযোগে বসিয়ে দেয়। CPLD ছোট, সাধারণত SOP-ধরনের ব্লকে গড়া, আর চালু হতেই কাজ শুরু করে। Verilog-এর পরিচয় আর simulation পর্ব ১৪-এ।
আরও গভীরে: আধুনিক chip-এর নকশাকার হাতে transistor আঁকেন না; synthesis tool Verilog থেকে একটি standard cell library-র cell বেছে নেয় — সেখানে NAND2, NOR2, AOI21 (AND-OR-Invert, (AB + C)′ এক transistor-স্তরে) ধরনের শত শত cell, প্রতিটি নানা “শক্তির” (drive strength) রূপে। Gate-এর মাপ বেছে delay কমানোর একটি সুন্দর তত্ত্ব হলো logical effort (Sutherland, Sproull আর Harris-এর বইয়ে বিস্তারিত)। আর ছোট transistor-এ leakage কমাতে planar MOSFET থেকে শিল্প FinFET আর এখন gate-all-around (nanosheet) গঠনের দিকে গেছে — switch model একই আছে, শুধু সুইচটি আরও ভালোভাবে বন্ধ হয়।
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- NAND আর NOR-কে universal gate বলা হয় কেন? — শুধু NAND (বা শুধু NOR) দিয়ে NOT, AND আর OR বানানো যায়, আর এই তিনটি functionally complete.
- CMOS NAND2-এর গঠন আঁকুন। — দুটি pMOS parallel-এ (VDD থেকে Y), দুটি nMOS series-এ (Y থেকে GND); মোট ৪টি transistor.
- শুধু NAND দিয়ে XOR বানাতে কমপক্ষে কয়টি gate? — ৪টি: N1 = (AB)′, N2 = (A·N1)′, N3 = (B·N1)′, Y = (N2·N3)′.
- VOH = ২.৪, VIH = ২.০, VIL = ০.৮, VOL = ০.৪ V হলে noise margin? — NMH = ০.৪ V, NML = ০.৪ V.
- CMOS-এ static power প্রায় শূন্য কেন, আর এখন কেন নয়? — স্থির অবস্থায় VDD-GND পথ নেই; কিন্তু ছোট transistor-এ leakage বেড়ে গেছে।
১০ · AI-এর যুগে — gate আর transistor-এর উত্তর যাচাই
AI এই বিষয়ে আত্মবিশ্বাসী ভুল প্রায়ই করে, কারণ উত্তরগুলো দেখতে খুব “পরিচিত”। সাধারণ ভুলগুলো: CMOS NAND-এ pMOS আর nMOS-এর series-parallel উল্টে ফেলা (তখন সেটি আসলে NOR, বা ওপরের BAD gate-এর মতো float করা circuit); NAND-কে associative ধরে দুটি NAND2 জুড়ে NAND3 বলা; transistor গোনায় AND2-কে ৪টি বলা; tCD-কে দীর্ঘতম পথ দিয়ে হিসাব করা; 74xx chip-এর pin নম্বর বা কোনো family-র ভোল্টেজ সীমা বানিয়ে বলা; আর Verilog-এ এমন কোড দেওয়া যা simulation-এ চলে কিন্তু hardware-এ বানানো যায় না।
AI-কে শুধু উত্তর না চেয়ে এমনভাবে প্রশ্ন করুন, যাতে প্রতিটি দাবি আপনি নিজে যাচাই করতে পারেন:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১TTL দ্রুত ছিল, nMOS বানানো সহজ ছিল — তবু শেষ পর্যন্ত CMOS কেন জিতল? আর সেই জয়ের দামটা এখন কোথায় ফিরে আসছে?
১৯৭০-এর দশকে CMOS ছিল “ঘড়ি আর ক্যালকুলেটরের প্রযুক্তি” — খুব কম power, কিন্তু ধীর, আর একই chip-এ nMOS ও pMOS দুটো বানাতে কারখানার ধাপ বেশি লাগত। দ্রুত কাজের জন্য তখন bipolar TTL বা ECL, আর ঘনত্বের জন্য nMOS. সমস্যা ছিল nMOS logic-এর গঠনে: সেখানে pull-up হিসেবে একটি সবসময়-চালু load transistor থাকত, ফলে output 0 থাকার পুরো সময় VDD থেকে GND-তে current বইত। একটি chip-এ কয়েক হাজার gate থাকলে এটি সহনীয়; কয়েক লাখ হলে chip নিজের তাপেই বিপদে পড়ে।
Transistor সংখ্যা যখন Moore-এর সূত্র ধরে বাড়তে থাকল (পর্ব ০২), এই স্থির current-ই দেয়াল হয়ে দাঁড়াল। CMOS-এর complementary গঠনে স্থির অবস্থায় কোনো পথ খোলা নেই — খরচ শুধু switching-এ। ১৯৮০-এর দশকে কারখানার প্রযুক্তি এগিয়ে CMOS-এর গতির ঘাটতি কমিয়ে আনল, আর বড় microprocessor-গুলো একে একে CMOS-এ চলে এল। Mainframe জগতে bipolar আরও কিছুদিন টিকেছিল, কিন্তু ১৯৯০-এর দশকে সেখানেও CMOS আসে বলে সাধারণভাবে জানা যায়।
দামটি ফিরে আসছে leakage-এর রূপে। Transistor যত ছোট, তার “বন্ধ” অবস্থা তত দুর্বল — পাতলা oxide দিয়ে gate leakage, আর কম threshold voltage-এ source-drain দিয়ে subthreshold leakage. এক সময় এটি মোট power-এর খুব ছোট অংশ ছিল; কয়েক দশক ধরে ছোট হতে হতে এটি উল্লেখযোগ্য অংশে পৌঁছেছে। শিল্পের জবাব: high-k gate oxide, FinFET আর gate-all-around গঠন (সুইচকে চারদিক থেকে ধরে ভালোভাবে বন্ধ করা), power gating (অব্যবহৃত ব্লকের সরবরাহ কেটে দেওয়া), আর multi-threshold cell (ধীর পথে কম-leakage transistor).
এর একটি দার্শনিক দিকও আছে: “স্থির অবস্থায় শূন্য power” একটি আদর্শ, যা switch model থেকে আসে। বাস্তব সুইচ কখনো নিখুঁত নয়, আর প্রতিটি abstraction (পর্ব ০১) কোনো না কোনো মাপে ভেঙে পড়ে। ভালো প্রকৌশলী জানেন কোন মাপ পর্যন্ত মডেলটি বিশ্বাসযোগ্য।
মূল উপলব্ধি: CMOS জিতেছে গতির জন্য নয়, power-এর জন্য — আর যে মডেলটি তাকে জিতিয়েছে (নিখুঁত সুইচ), আজ সেই মডেলের ফাটল সামলানোই chip নকশার বড় একটি কাজ।
প্র ০২NAND একাই সব পারে — তাহলে বাস্তব chip কি শুধু NAND দিয়ে বানানো হয়? “universal” হওয়ার ব্যবহারিক মূল্য কোথায়?
গাণিতিক দিক থেকে NAND-এর universality পুরোনো কথা। ১৯১৩ সালে Henry Sheffer দেখান যে Boolean algebra-র সব কাজ একটি মাত্র ক্রিয়া দিয়ে লেখা যায় — সেই ক্রিয়াকে আজও “Sheffer stroke” বলা হয়, যা আসলে NAND. NOR-এর জন্য একই ধারণা Charles Sanders Peirce-এর অপ্রকাশিত লেখায় এর আগেই ছিল বলে ইতিহাসবিদরা উল্লেখ করেন।
ব্যবহারিক দিকে universality-র দুটি বড় মূল্য ছিল। প্রথমত, এক ধরনের অংশ দিয়ে সব: Apollo guidance computer-এর logic প্রায় পুরোটাই একই ধরনের NOR-gate IC দিয়ে বানানো হয়েছিল বলে বর্ণিত আছে — নতুন, অনিশ্চিত IC প্রযুক্তিতে একটি মাত্র নকশার chip-এর মান যাচাই আর মজুত রাখা অনেক সহজ ছিল। ল্যাবেও একই কারণে 7400 প্রিয়। দ্বিতীয়ত, CMOS-এ NAND/NOR স্বাভাবিক: অংশ ৪-এ দেখেছেন, এক transistor-স্তরের gate সবসময় inverting, আর NAND2 সবচেয়ে সস্তা দুই-ইনপুট gate-গুলোর একটি। তাই NAND–NAND রূপ AND–OR-এর চেয়ে ছোট ও দ্রুত।
কিন্তু আধুনিক chip “শুধু NAND” নয়। Synthesis tool একটি standard cell library থেকে বেছে নেয়: NAND, NOR, inverter, AOI/OAI-এর মতো জটিল inverting gate, XOR, multiplexer, flip-flop — প্রতিটি কয়েকটি drive strength-এ। শুধু NAND দিয়ে সব বানালে অনেক বেশি gate আর স্তর লাগত (অংশ ৬-এর converter-এ দেখেছেন, XOR-এর জন্য যান্ত্রিক নিয়মে ৫টি NAND, অথচ একটি XOR cell অনেক ছোট)। Tool তাই একটি “cost” (জায়গা, delay, power) কমানোর জন্য cell বেছে নেয়।
একটি মজার নামের মিল আছে: NAND flash মেমরি (আপনার ফোনের storage). এর নাম এসেছে মেমরি cell-গুলো NAND gate-এর nMOS-এর মতো series-এ সাজানো বলে — এটি NAND gate দিয়ে বানানো নয়। পর্ব ৪৯-এ ROM আর flash প্রসঙ্গে এটি আবার আসবে।
মূল উপলব্ধি: universality প্রমাণ করে “সম্ভব”; প্রকৌশল জিজ্ঞেস করে “কোনটি সবচেয়ে সস্তা”। দুটি প্রশ্ন আলাদা, আর বাস্তব নকশা দ্বিতীয়টির উত্তর দিয়ে চলে।
প্র ০৩“এই circuit-এ ৩ gate delay” — এই এককটি কতটা বিশ্বাসযোগ্য? কোথায় এটি আমাদের ভুল পথে নিয়ে যেতে পারে?
Gate delay গুনে তুলনা করা শেখার জন্য অসাধারণ: carry-lookahead adder কেন ripple-carry-র চেয়ে দ্রুত (পর্ব ১১), বা দুই স্তরের SOP কেন multi-level-এর চেয়ে দ্রুত হতে পারে — এসব gate delay দিয়েই সহজে বোঝা যায়। কিন্তু এটি ধরে নেয় সব gate-এর delay সমান, যা বাস্তবে সত্য নয়।
প্রথম কারণ load: একটি gate-এর delay মোটামুটি তার output-এ কতটা capacitance আছে তার অনুপাতে। Fan-out ১ আর fan-out ১০-এর একই NAND2-এর delay কয়েক গুণ আলাদা হতে পারে। দ্বিতীয় কারণ gate-এর ধরন: NOR3-এর তিনটি series pMOS, NAND2-এর চেয়ে অনেক ধীর; inverter সবচেয়ে দ্রুত। তৃতীয় কারণ তার: আধুনিক chip-এ লম্বা তারের delay অনেক সময় gate-এর delay-কে ছাড়িয়ে যায় — ১৯৯০-এর দশক থেকেই নকশাকাররা বলে আসছেন যে interconnect-ই প্রধান বাধা হয়ে উঠছে। চতুর্থ কারণ কোন ইনপুট বদলাল: NAND2-এর series nMOS-এর মধ্যে GND-এর কাছেরটি আর output-এর কাছেরটির delay একটু আলাদা।
এই সমস্যার একটি সুন্দর সমাধান Ivan Sutherland, Bob Sproull আর David Harris-এর “logical effort” পদ্ধতি: প্রতিটি gate-এর একটি “logical effort” (সে inverter-এর তুলনায় কতটা কম শক্তিশালী, যেমন NAND2 প্রায় ৪/৩, NOR2 প্রায় ৫/৩ — সাধারণ ধরে নেওয়া mobility অনুপাতে) আর “electrical effort” (load ÷ ইনপুট capacitance) ধরে delay হিসাব করা হয়। এতে দেখা যায়, কোনো পথে gate-গুলোর effort সমানভাবে ভাগ করলে delay সবচেয়ে কম, আর সেজন্য কখনো কখনো একটি বাড়তি inverter যোগ করলে circuit দ্রুত হয় — যা সরল gate-delay গোনায় অসম্ভব মনে হতো।
শিল্পে চূড়ান্ত উত্তর দেয় static timing analysis tool, যা প্রতিটি cell-এর মাপা delay টেবিল আর তারের প্রকৃত দৈর্ঘ্য ব্যবহার করে। পর্ব ১৮-এ critical path আর setup-hold সেই দিকেই নিয়ে যাবে।
মূল উপলব্ধি: gate delay একটি প্রথম আনুমানিক মাপ — দুটি নকশার মোটামুটি তুলনায় দারুণ, কিন্তু চূড়ান্ত গতি ঠিক হয় load, তার আর প্রকৃত cell-এর মাপে।
প্র ০৪Tri-state bus একসময় সবখানে ছিল, এখন দ্রুত সংযোগগুলো point-to-point. কেন এই পরিবর্তন, আর open-drain কেন এখনো টিকে আছে?
পুরোনো কম্পিউটারে CPU, মেমরি আর I/O card একটি ভাগাভাগি করা parallel bus-এ বসত — প্রতিটি যন্ত্রের output tri-state, আর একটি arbiter ঠিক করত কে কখন বলবে। এটি সস্তা আর নমনীয়: নতুন card লাগালেই হলো। ISA, পরে PCI — বহু বছর এমন ভাগাভাগি করা bus-এর যুগ।
সমস্যা দেখা দিল গতি বাড়ার সাথে। একটি ভাগাভাগি করা তারে অনেক যন্ত্র মানে অনেক capacitance আর অনেক “শাখা”, যেখান থেকে সংকেত প্রতিফলিত হয়ে ফিরে আসে। Tri-state চালক বন্ধ হওয়া আর অন্যজনের চালু হওয়ার মাঝে একটু “turnaround” সময় রাখতে হয়, নইলে দুজন একসাথে চালিয়ে bus contention হয়। আর parallel bus-এর অনেক তারে সংকেত ঠিক একসাথে পৌঁছানো (skew কম রাখা) গতি বাড়লে প্রায় অসম্ভব হয়ে ওঠে। তাই PCI-এর উত্তরসূরি PCIe-তে প্রতিটি সংযোগ দুই যন্ত্রের মাঝে, প্রতিটি দিকে আলাদা তারের জোড়া, খুব দ্রুত serial সংকেত — আর মাঝে switch. Bus-এর পুরো গল্প পর্ব ৫১-এ।
Chip-এর ভেতরেও একই প্রবণতা: tri-state bus-এর বদলে multiplexer (পর্ব ১২) দিয়ে বেছে নেওয়া হয়, কারণ tri-state-এর জটিল timing আর test-এর ঝামেলা synthesis tool পছন্দ করে না।
Open-drain টিকে আছে ঠিক সেখানে, যেখানে গতির চেয়ে সরলতা আর নিরাপত্তা জরুরি। Philips-এর I²C bus (১৯৮০-এর দশকে শুরু) দুটি open-drain তার দিয়ে একই বোর্ডের অনেক sensor, EEPROM আর ছোট chip জুড়ে দেয়; দুই যন্ত্র একসাথে বললেও কিছু পোড়ে না, আর wired-AND আচরণ দিয়েই কে আগে বলবে (arbitration) নিজে থেকে ঠিক হয়ে যায় — যে 1 পাঠাতে চেয়ে তারে 0 দেখে, সে বুঝে নেয় অন্য কেউ বলছে আর থেমে যায়। Reset আর interrupt লাইনেও open-drain সাধারণ, কারণ অনেক উৎস একটি লাইনেই “সাহায্য দরকার” বলতে পারে।
মূল উপলব্ধি: ভাগাভাগি করা তারের দাম গতি দিয়ে শোধ করতে হয়। যেখানে গতি মুখ্য, সেখানে point-to-point; যেখানে কম তার আর নিরাপদ ভাগাভাগি মুখ্য, সেখানে open-drain এখনো সেরা।
প্র ০৫Breadboard-এ 74xx chip, না FPGA — digital logic শেখার জন্য কোনটি ভালো? FPGA-র “gate” কি আসলেই gate?
দুটির শিক্ষা আলাদা। Breadboard-এ 7400 আর 7486 দিয়ে একটি half adder বানালে আপনি সত্যিকারের ভোল্টেজ দেখেন: LED জ্বলছে না কেন, কারণ VCC-এর তার ঢিলা; ইনপুট খোলা রাখলে (বিশেষ করে CMOS chip-এ) output এলোমেলো, কারণ ভাসমান ইনপুট noise ধরে; লম্বা তার আর একাধিক chip-এ সংকেত নড়বড়ে, তাই প্রতিটি chip-এর পাশে decoupling capacitor রাখার নিয়ম। Noise margin, fan-out আর float — এই পর্বের ধারণাগুলো হাতে-কলমে ধরা দেয়। কিন্তু ১০০টি gate-এর বেশি হলেই তারের জঙ্গল সামলানো প্রায় অসম্ভব।
FPGA-তে আপনি বড় নকশা লেখেন — একটি পুরো ছোট CPU পর্যন্ত (পর্ব ৫৭-এর simulator-এর মতো জিনিস সত্যিকারের hardware-এ)। প্রথম বাণিজ্যিক FPGA হিসেবে সাধারণত Xilinx-এর ১৯৮৫ সালের XC2064-এর কথা বলা হয়; আজকের FPGA-তে লক্ষাধিক LUT. মজার ব্যাপার: FPGA-র ভেতরে আপনার লেখা AND বা XOR gate আসলে নেই। Synthesis tool আপনার লজিককে টুকরো করে প্রতিটি টুকরোর truth table একটি LUT-এর মেমরিতে লিখে দেয় — একটি ৬-ইনপুটের LUT যেকোনো ৬-চলকের ফাংশন (২৬৪ রকমের যেকোনোটি) একই সময়ে হিসাব করে। অর্থাৎ FPGA-তে “gate” হলো আসলে truth table, যা এই পর্বের শুরুর কথাকেই নতুনভাবে প্রমাণ করে: একটি combinational ফাংশন তার truth table দিয়েই পুরোপুরি সংজ্ঞায়িত।
ASIC (নির্দিষ্ট কাজের জন্য বানানো chip) আর FPGA-র মাঝেও trade-off: একই নকশা ASIC-এ সাধারণত অনেক দ্রুত, ছোট আর কম power-এর, কিন্তু একবার বানাতে বিপুল খরচ আর সময়; FPGA যেকোনো সময় নতুন করে প্রোগ্রাম করা যায়। তাই prototype, কম সংখ্যার পণ্য, আর শেখার জন্য FPGA. বাংলাদেশেও কয়েকটি বিশ্ববিদ্যালয়ের ল্যাবে FPGA board ব্যবহার হয় বলে জানা যায়, আর দেশে chip নকশা ও verification-এর কাজও ধীরে ধীরে বাড়ছে — তবে এর নির্দিষ্ট পরিসংখ্যান যাচাই করে নেওয়া উচিত।
মূল উপলব্ধি: breadboard শেখায় বিদ্যুৎ কীভাবে আচরণ করে, FPGA শেখায় বড় নকশা কীভাবে সাজাতে হয়। দুটোই দরকার — আগে ছোট circuit হাতে, তারপর বড় নকশা HDL-এ।
অনুশীলন
খাতা-কলমে আগে করুন, তারপর উত্তর খুলে মেলান — চাইলে ওপরের simulator-এ নিজের netlist বসিয়ে যাচাই করুন।
-
Noise margin-এর হিসাব: একটি family-র datasheet বলছে VOH = ২.৯ V, VIH = ২.১ V, VIL = ০.৯ V, VOL = ০.৩ V. (ক) NMH আর NML কত? (খ) তারে ০.৭ V-এর noise এলে 1 আর 0 — কোনটি নিরাপদ?
(ক) NMH = ২.৯ − ২.১ = ০.৮ V; NML = ০.৯ − ০.৩ = ০.৬ V. নিশ্চিত নিরাপত্তা min = ০.৬ V.
(খ) 1-এর বেলায় সবচেয়ে খারাপ ক্ষেত্রে গ্রহণকারী পায় ২.৯ − ০.৭ = ২.২ V, যা VIH = ২.১ V-এর ওপরে — নিরাপদ। 0-এর বেলায় পায় ০.৩ + ০.৭ = ১.০ V, যা VIL = ০.৯ V-এর ওপরে — নিষিদ্ধ এলাকা, নিরাপদ নয়। কারণ ০.৭ V > NML = ০.৬ V.
-
Switch-by-switch trace: CMOS NOR2-এর গঠন লিখুন, আর চারটি ইনপুটে (00, 01, 10, 11) কোন transistor চালু, output কোথায় টানা হয় — টেবিল বানান। তারপর বলুন NOR3 আর AND3-এ কয়টি transistor লাগবে।
গঠন: PUN = দুটি pMOS series-এ (VDD → pA → pB → Y), PDN = দুটি nMOS parallel-এ (Y থেকে GND).
- 00: pA, pB চালু → VDD-এর পথ খোলা; nA, nB বন্ধ → Y = 1
- 01: pA, nB চালু → pB বন্ধ বলে ওপরের পথ বন্ধ; nB দিয়ে GND → Y = 0
- 10: pB, nA চালু → nA দিয়ে GND → Y = 0
- 11: nA, nB চালু → Y = 0
এটি ওপরের switch-level simulator-এর NOR2 আউটপুটের সাথে হুবহু মেলে। NOR3 = ৩ + ৩ = ৬টি; AND3 = NAND3 (৬) + NOT (২) = ৮টি.
-
Circuit লিখুন: (ক) F = A′B + BC′ + AC-কে শুধু NAND দিয়ে বানান — netlist লিখুন আর gate গুনুন। (খ) G = (A + B)·(B′ + C)-কে শুধু NOR দিয়ে বানান।
(ক) An = NAND(A, A), Cn = NAND(C, C), T1 = NAND(An, B), T2 = NAND(B, Cn), T3 = NAND(A, C), Y = NAND(T1, T2, T3). মোট ৬টি NAND (দুটি inverter হিসেবে, শেষেরটি ৩-ইনপুটের)। ওপরের converter-এ
"A'B + BC' + AC"দিলে ঠিক এই netlist আসে, ৮টি সারিতে অমিল ০, আর CMOS transistor ২৬টি। তবে আগে সরল করলে লাভ আরও বেশি: A′B + BC′ = B(AC)′, আর X + X′Y = X + Y সূত্রে F = B + AC — তখন মাত্র ৩টি NAND লাগে: Bn = NAND(B, B), T = NAND(A, C), Y = NAND(Bn, T).(খ) Bn = NOR(B, B), S1 = NOR(A, B), S2 = NOR(Bn, C), Y = NOR(S1, S2) — মোট ৪টি NOR. যাচাই: Y = (S1 + S2)′ = S1′·S2′ = (A + B)·(B′ + C). যেমন A = 0, B = 1, C = 0-এ G = 1·0 = 0, আর circuit-এ S1 = 0, S2 = NOR(0, 0) = 1, Y = NOR(0, 1) = 0 — মিলেছে।
-
Output অনুমান করুন: একটি circuit-এ N1 = NOR(A, B), N2 = NOR(A, N1), N3 = NOR(B, N1), Y = NOR(N2, N3). চারটি ইনপুটে Y কত? এটি কোন gate? এর tPD কত, যদি প্রতিটি NOR-এর tPD = ৪০ ps হয়?
হিসাব (A B → N1 N2 N3 → Y): 00 → 1 0 0 → 1; 01 → 0 1 0 → 0; 10 → 0 0 1 → 0; 11 → 0 0 0 → 1. ইনপুট সমান হলে 1 — এটি XNOR. চার-NAND XOR-এর ঠিক dual: NAND-কে NOR করলে AND-OR ভূমিকা অদলবদল হয়, আর XOR হয়ে যায় XNOR. দীর্ঘতম পথ A → N1 → N2 → Y, ৩টি gate, তাই tPD = ৩ × ৪০ = ১২০ ps.
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমSOP রাশিকে NAND–NAND circuit-এ রূপান্তরের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- ফাংশনটি SOP আকারে লেখা (যেমন F = A·B + C′·D)
- সরাসরি AND–OR circuit আঁকা
- AND আর OR-এর মাঝের প্রতিটি তারে দুটি bubble বসানো
- AND-এর মুখের bubble মিলিয়ে AND-কে NAND বানানো
- De Morgan দিয়ে ইনপুটে bubble-ওয়ালা OR-কে NAND বানানো
- সব ইনপুটে simulate করে মূল ফাংশনের সাথে মেলানো
Static CMOS-এ একটি ২-ইনপুট NAND gate-এর pull-down network কেমন?
- দুটি nMOS parallel-এ
- দুটি nMOS series-এ
- দুটি pMOS series-এ
- একটি nMOS, যার gate-এ A আর B দুটোই
একটি logic family-তে VOH = ৩.১ V, VIH = ২.০ V, VIL = ০.৮ V, VOL = ০.২ V. দুটি noise margin কত?
- NMH = ২.৯ V, NML = ১.২ V
- NMH = ০.৬ V, NML = ১.১ V
- NMH = ১.১ V, NML = ০.৬ V
- দুটিই ১.২ V
শুধু ২-ইনপুট NAND gate দিয়ে A + B (OR) বানাতে কমপক্ষে কয়টি gate লাগে?
- ২টি
- ৩টি
- ৪টি
- ৫টি
Static CMOS-এ একটি ২-ইনপুট AND gate-এ সাধারণত কয়টি transistor থাকে?
- ২টি
- ৪টি
- ৫টি
- ৬টি
একই প্রযুক্তিতে NOR2 সাধারণত NAND2-এর চেয়ে ধীর বা বড় কেন?
- NOR2-এর series transistor-গুলো pMOS, আর pMOS-এর বাহক hole ধীর
- NOR2-এ বেশি transistor লাগে
- NOR2 স্থির অবস্থায় সবসময় current টানে
- NOR2-এর output কখনো পুরো 1 পর্যন্ত ওঠে না
একটি tri-state buffer-এর enable ইনপুট নিষ্ক্রিয় (EN = 0) থাকলে তার output কী হয়?
- 0-তে টানা থাকে
- 1-এ টানা থাকে
- High impedance (Z) — কোনো দিকে টানে না
- ইনপুটের উল্টো মান দেয়
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- NMH = VOH − VIH, NML = VIL − VOL; নিশ্চিত নিরাপত্তা দুটির ছোটটি, আর load বাড়লে margin কমে।
- nMOS উঁচুতে চালু, pMOS নিচুতে চালু; CMOS gate-এ PDN আর PUN একে অপরের dual (series ↔ parallel), তাই কখনো short বা float হয় না।
- NOT ২, NAND2/NOR2 ৪, AND2/OR2 ৬ transistor; এক স্তরের CMOS gate সবসময় inverting, আর series pMOS ধীর বলে NAND সাধারণত পছন্দের।
- NAND বা NOR একাই universal: NOT ১, AND ২, OR ৩, XOR ৪টি NAND; SOP → NAND–NAND, POS → NOR–NOR (bubble pushing + De Morgan).
- tPD = ধীরতম পথ, tCD = দ্রুততম পথ; fan-out বাড়লে delay বাড়ে; tri-state-এ Z, open-drain-এ wired-AND; CMOS-এর খরচ মূলত switching-এ, তবে leakage এখন অবহেলার নয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০৯ · K-map দিয়ে সরলীকরণ — ২ থেকে ৪ চলক, don't careপরবর্তী পর্বSOP-কে সবচেয়ে ছোট করা — কম gate, কম transistor.
- পর্ব ০৭ · Boolean algebra — সূত্র, De Morgan, SOP আর POSআগের পর্বএই পর্বের প্রতিটি রূপান্তরের পেছনের সূত্র আর প্রমাণ।
- কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক · কোর্স হোম৬২টি পর্বপুরো কোর্সের রোডম্যাপ — লজিক গেট থেকে multicore.
- কম্পিউটার ফান্ডামেন্টালস · লজিক গেটঝালিয়ে নিনএকেবারে শুরু থেকে, সহজ ভাষায় gate আর truth table.
- C প্রোগ্রামিং · Bitwise operationকোডে প্রয়োগAND, OR, XOR, NOT — একসাথে ৩২ বা ৬৪টি gate-এর কাজ এক instruction-এ।