হাফ অ্যাডার ও ফুল অ্যাডার
এই পাঠে যা শিখবেন
- হাফ অ্যাডার কেন "half" — কী সীমাবদ্ধতা আছে
- ফুল অ্যাডারের Sum ও Cout-এর নির্ভুল বুলিয়ান সূত্র
- কীভাবে দুটি হাফ অ্যাডার মিলিয়ে একটি ফুল অ্যাডার বানানো যায়
- Python কোডে দুই পদ্ধতির (সরাসরি সূত্র বনাম কম্পোজিশন) ফলাফল সব ৮টি ইনপুট কম্বিনেশনে মিলিয়ে যাচাই করা
১ · হাফ অ্যাডার — L01-এর প্রিভিউ থেকে ফর্মালাইজেশন
L01-এ একটি সংক্ষিপ্ত প্রিভিউ হিসেবে হাফ অ্যাডারHalf Adderদুটি একক বিট যোগ করে Sum ও Carry দেয়, কিন্তু আগের বিট-পজিশন থেকে carry-in নিতে পারে না। দেখানো হয়েছিল। এখন এটি ফর্মালি সংজ্ঞায়িত করা যাক — হাফ অ্যাডার দুটি একক বিট A ও B যোগ করে দুটি আউটপুট দেয়ঃ
- Sum = A XOR B — যোগফলের একক-বিট অংশ
- Carry = A AND B — পরের পজিশনে বহন করে নিয়ে যাওয়ার অংশ
একে "half" (অর্ধেক) বলা হয় কারণ এটি আগের কোনো বিট-পজিশন থেকে আসা carry-in গ্রহণ করতে পারে না — শুধুমাত্র দুটি ইনপুট নেয়, তিনটি নয়। একক বিট-পজিশনের জন্য এটি ঠিকঠাক কাজ করে, কিন্তু বহু-বিট সংখ্যা যোগ করতে গেলে প্রতিটি পজিশনে আগের পজিশনের carry যোগ করাও দরকার — এই সীমাবদ্ধতাই পরের ধাপের প্রেরণা।
২ · ফুল অ্যাডার — তিন-ইনপুট যোগফল
ফুল অ্যাডারFull Adderতিনটি বিট (A, B, Carry-in) যোগ করে Sum ও Carry-out দেয় — বহু-বিট অ্যাডিশনের মৌলিক বিল্ডিং ব্লক। তিনটি ইনপুট নেয়ঃ A, B, এবং আগের পজিশন থেকে আসা Carry-in (Cin)। আউটপুট দুটি — Sum ও Carry-out (Cout)। নির্ভুল সূত্র —
$$Sum = A \oplus B \oplus C_{in}$$ $$C_{out} = (A \cdot B) + (C_{in} \cdot (A \oplus B))$$
Cout-এর সূত্রটি একটি সহজ অন্তর্দৃষ্টির সমতুল্য — এটি আসলে একটি "মেজরিটি (majority) ফাংশন":
তিনটি ইনপুটের (A, B, Cin) মধ্যে অন্তত দুটি যদি ১ হয়, তবেই Cout = 1। উদাহরণস্বরূপ A=1, B=1,
Cin=0 হলে — দুটি ইনপুট ১, তাই Cout=1, যদিও Cin নিজে ০।
৩ · দুটি হাফ অ্যাডার + একটি OR গেট দিয়ে ফুল অ্যাডার
একটি চমৎকার কম্পোজিশন কৌশল — সম্পূর্ণ নতুন সার্কিট না বানিয়ে, আগের হাফ অ্যাডারকেই দুইবার পুনর্ব্যবহার করে ফুল অ্যাডার বানানো যায় —
- হাফ অ্যাডার ১: A ও B যোগ করে একটি মধ্যবর্তী (intermediate) sum₁ ও carry₁ দেয়
- হাফ অ্যাডার ২: sum₁ ও Cin যোগ করে চূড়ান্ত Sum ও carry₂ দেয়
- চূড়ান্ত Cout = carry₁ OR carry₂ — দুটি হাফ অ্যাডারের carry-আউটপুট একসাথে OR করে
নিচের কোড সেলে full_adder-এর দুটি স্বতন্ত্র বাস্তবায়ন থাকবে — একটি সরাসরি উপরের সূত্র (majority
ফর্মুলা) দিয়ে, আরেকটি দুটি হাফ অ্যাডার কম্পোজ করে — এবং সব ৮টি ইনপুট কম্বিনেশনে দুটোর ফলাফল হুবহু মিলে কিনা
যাচাই করা হবে।
def XOR(a, b):
return a ^ b
def AND(a, b):
return a & b
def OR(a, b):
return a | b
def half_adder(a, b):
"""L01-এ প্রিভিউ করা হয়েছিল -- (sum, carry) রিটার্ন করে"""
s = XOR(a, b)
c = AND(a, b)
return s, c
def full_adder_direct(a, b, cin):
"""সরাসরি সূত্র -- মেজরিটি-ফাংশন স্টাইল Cout"""
s = XOR(XOR(a, b), cin)
cout = OR(AND(a, b), AND(cin, XOR(a, b)))
return s, cout
def full_adder_composed(a, b, cin):
"""কম্পোজিশন -- দুটি হাফ অ্যাডার + একটি OR গেট"""
s1, c1 = half_adder(a, b)
s2, c2 = half_adder(s1, cin)
cout = OR(c1, c2)
return s2, cout
print("a b cin | direct(Sum,Cout) | composed(Sum,Cout) | মিলেছে?")
print("-" * 55)
all_match = True
for a in (0, 1):
for b in (0, 1):
for cin in (0, 1):
direct = full_adder_direct(a, b, cin)
composed = full_adder_composed(a, b, cin)
match = direct == composed
all_match = all_match and match
print(f"{a} {b} {cin} | {direct} | {composed} | {match}")
print()
print("সব ৮টি ইনপুট কম্বিনেশনে দুই পদ্ধতির ফলাফল অভিন্ন:", all_match)
হাফ অ্যাডার একক-বিট যোগফলের ভিত্তি, ফুল অ্যাডার সেই ভিত্তিকে বাস্তবে ব্যবহারযোগ্য করে তোলে — কারণ শুধু
ফুল অ্যাডারই একাধিক বিট-পজিশন জুড়ে carry ঠিকভাবে বহন করতে পারে। L09-এ এই একই full_adder
ফাংশনকে চেইন করে সম্পূর্ণ বহু-বিট সংখ্যা যোগ করা হবে — একটি "রিপল ক্যারি অ্যাডার।"
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ ফুল অ্যাডারের Cout সূত্রকে "মেজরিটি ফাংশন" বলা হয় কেন — এটা কি সত্যিই "ভোটাভুটির" মতো?
হ্যাঁ, ধারণাটা প্রায় ঠিক তাই। তিনটি ইনপুট A, B, Cin-কে যদি তিনজন "ভোটার" ধরা হয় যারা "carry পাঠানো উচিত কিনা" তাতে ভোট দিচ্ছে, তাহলে যদি অন্তত দুজন (majority) ১ ভোট দেয়, ফলাফল Cout=1 হয়। এই কারণেই A=1,B=1,Cin=0 (দুই ভোট) বা A=1,B=0,Cin=1 (দুই ভোট) — দুই ক্ষেত্রেই Cout=1, কিন্তু A=1,B=0,Cin=0 (এক ভোট, সংখ্যালঘু) হলে Cout=0।
প্র ০২ কম্পোজিশন পদ্ধতিতে ঠিক কোন হাফ অ্যাডারের carry আউটপুট, কোনটার সাথে OR হচ্ছে — এবং কেন AND নয়, OR কেন?
হাফ অ্যাডার ১-এর carry₁ (A·B থেকে) আর হাফ অ্যাডার ২-এর carry₂ (sum₁·Cin থেকে) — এই দুটোই OR হয়। OR ব্যবহার করা হয় কারণ carry-out তখনই ১ হওয়া উচিত যখন যেকোনো একটি হাফ অ্যাডার থেকে carry আসে — বাস্তবে A,B,Cin-এর মধ্যে কখনোই দুটো হাফ অ্যাডারই একইসাথে carry=1 দেয় না (গাণিতিকভাবে প্রমাণযোগ্য), তাই AND ব্যবহার করলে সবসময় ভুল ফলাফল (সবসময় 0) আসত।
প্র ০৩ যদি শুধু হাফ অ্যাডার ব্যবহার করে (কোনো Cin ছাড়াই) দুই-বিট সংখ্যা 01 + 01 যোগ করার চেষ্টা করা হয়, তাহলে কী ভুল হবে?
প্রথম (নিম্ন) বিট-পজিশনে হাফ অ্যাডার ঠিকঠাক 1+1=carry 1, sum 0 দেবে। কিন্তু দ্বিতীয় (উচ্চতর) বিট-পজিশনে সেই carry-কে যোগ করার কোনো উপায় থাকবে না, কারণ হাফ অ্যাডার তৃতীয় ইনপুট নিতেই পারে না — carry হারিয়ে যাবে এবং চূড়ান্ত ফলাফল ভুল হবে। ঠিক এই কারণেই বহু-বিট যোগফলের জন্য প্রতিটি উচ্চতর বিট-পজিশনে অবশ্যই ফুল অ্যাডার লাগে, যা L09-এ দেখানো হবে।
অনুশীলন
-
হাতে বসিয়ে দেখুন: A=0, B=1, Cin=1 হলে সরাসরি সূত্র দিয়ে হাতে-কলমে Sum ও Cout গণনা করুন, তারপর যাচাই করুন এটি 0+1+1=2-এর সাথে মেলে কিনা।
Sum = 0⊕1⊕1 = 0 (দুটো ১ থাকায় XOR বাতিল হয়ে যায়)। Cout = (0·1) + (1·(0⊕1)) = 0 + (1·1) = 1। ফলাফল বাইনারি "10" (Cout, Sum) = দশমিকে 2 — ঠিক 0+1+1=2-এর সাথে মেলে।
-
চিন্তা করুন: ফুল অ্যাডারকে যদি শুধুমাত্র NAND গেট (L07) দিয়ে বানাতে হতো, তাহলে কি সম্ভব হতো? কেন বা কেন নয়?
হ্যাঁ, সম্ভব — এবং এটাই L07-এর ইউনিভার্সালিটির প্রকৃত পরিণতি। যেহেতু ফুল অ্যাডার শুধুমাত্র XOR, AND, OR গেট দিয়ে গঠিত, আর L07-এ প্রমাণ হয়েছে NAND দিয়েই NOT, AND, OR (এবং একইভাবে XOR) বানানো যায়, তাই পুরো ফুল অ্যাডার সার্কিটটিও শেষ পর্যন্ত শুধুমাত্র NAND গেট দিয়ে বাস্তবায়ন করা সম্ভব — বাস্তব চিপে প্রায়ই ঠিক এভাবেই করা হয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M2-এর বাকি পাঠগুলোতে মাল্টিপ্লেক্সার, এনকোডার/ডিকোডার ও কম্প্যারেটরের মতো আরও কম্বিনেশনাল সার্কিট আসছে।
- আগের পাঠ L07 ইউনিভার্সাল গেট — NAND ও NOR — এই পাঠের অ্যাডারও শেষ পর্যন্ত এই মৌলিক গেট দিয়েই বাস্তবায়িত হয়।
- পরের পাঠ L09 রিপল ক্যারি অ্যাডার ও সাবট্রাক্টর — এই পাঠের ফুল অ্যাডারকে চেইন করে বহু-বিট সংখ্যা যোগ ও বিয়োগ করা।