পাঠ ০৮ · ৫৭-এর মধ্যে · মডিউল ২
Home / Courses / Computer Architecture & Digital Logic / অ্যাডার

হাফ অ্যাডার ও ফুল অ্যাডার

Half adder and full adder
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • হাফ অ্যাডার কেন "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 গেট দিয়ে ফুল অ্যাডার

একটি চমৎকার কম্পোজিশন কৌশল — সম্পূর্ণ নতুন সার্কিট না বানিয়ে, আগের হাফ অ্যাডারকেই দুইবার পুনর্ব্যবহার করে ফুল অ্যাডার বানানো যায় —

  1. হাফ অ্যাডার ১: A ও B যোগ করে একটি মধ্যবর্তী (intermediate) sum₁ ও carry₁ দেয়
  2. হাফ অ্যাডার ২: sum₁ ও Cin যোগ করে চূড়ান্ত Sum ও carry₂ দেয়
  3. চূড়ান্ত Cout = carry₁ OR carry₂ — দুটি হাফ অ্যাডারের carry-আউটপুট একসাথে OR করে
হাফ অ্যাডার ১ A, B → sum₁, carry₁ হাফ অ্যাডার ২ sum₁, Cin → Sum, carry₂ OR(carry₁, carry₂) = চূড়ান্ত Cout হাফ অ্যাডার ২-এর Sum আউটপুটই ফুল অ্যাডারের চূড়ান্ত Sum
দুটি হাফ অ্যাডার চেইন করে, তাদের দুই carry আউটপুট OR করলেই একটি সম্পূর্ণ ফুল অ্যাডার তৈরি হয়।

নিচের কোড সেলে full_adder-এর দুটি স্বতন্ত্র বাস্তবায়ন থাকবে — একটি সরাসরি উপরের সূত্র (majority ফর্মুলা) দিয়ে, আরেকটি দুটি হাফ অ্যাডার কম্পোজ করে — এবং সব ৮টি ইনপুট কম্বিনেশনে দুটোর ফলাফল হুবহু মিলে কিনা যাচাই করা হবে।

Python
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)

    
A=1, B=1, Cin=1 হলে — তিনটি ইনপুটই ১, তাই Cout=1 (মেজরিটি সূত্র অনুযায়ী তিনের মধ্যে তিনটিই ১) আর Sum=1 (কারণ 1⊕1⊕1=1, বিজোড় সংখ্যক ১-এর XOR সবসময় ১)। এই একক কেসেই সরাসরি সূত্র ও কম্পোজিশন — দুটো পদ্ধতিই একই ফলাফল (Sum=1, Cout=1) দেয়, যা বাইনারিতে "11" — দশমিকে 3, ঠিক 1+1+1=3-এর সাথে মেলে।
মূল কথা · Key takeaway

হাফ অ্যাডার একক-বিট যোগফলের ভিত্তি, ফুল অ্যাডার সেই ভিত্তিকে বাস্তবে ব্যবহারযোগ্য করে তোলে — কারণ শুধু ফুল অ্যাডারই একাধিক বিট-পজিশন জুড়ে 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-এ দেখানো হবে।

অনুশীলন

  1. হাতে বসিয়ে দেখুন: 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-এর সাথে মেলে।

  2. চিন্তা করুন: ফুল অ্যাডারকে যদি শুধুমাত্র NAND গেট (L07) দিয়ে বানাতে হতো, তাহলে কি সম্ভব হতো? কেন বা কেন নয়?

    হ্যাঁ, সম্ভব — এবং এটাই L07-এর ইউনিভার্সালিটির প্রকৃত পরিণতি। যেহেতু ফুল অ্যাডার শুধুমাত্র XOR, AND, OR গেট দিয়ে গঠিত, আর L07-এ প্রমাণ হয়েছে NAND দিয়েই NOT, AND, OR (এবং একইভাবে XOR) বানানো যায়, তাই পুরো ফুল অ্যাডার সার্কিটটিও শেষ পর্যন্ত শুধুমাত্র NAND গেট দিয়ে বাস্তবায়ন করা সম্ভব — বাস্তব চিপে প্রায়ই ঠিক এভাবেই করা হয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M2-এর বাকি পাঠগুলোতে মাল্টিপ্লেক্সার, এনকোডার/ডিকোডার ও কম্প্যারেটরের মতো আরও কম্বিনেশনাল সার্কিট আসছে।
  • আগের পাঠ L07 ইউনিভার্সাল গেট — NAND ও NOR — এই পাঠের অ্যাডারও শেষ পর্যন্ত এই মৌলিক গেট দিয়েই বাস্তবায়িত হয়।
  • পরের পাঠ L09 রিপল ক্যারি অ্যাডার ও সাবট্রাক্টর — এই পাঠের ফুল অ্যাডারকে চেইন করে বহু-বিট সংখ্যা যোগ ও বিয়োগ করা।
আগের পাঠ
ইউনিভার্সাল গেট — NAND ও NOR