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

মাল্টিপ্লেক্সার ও ডিমাল্টিপ্লেক্সার

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

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

  • মাল্টিপ্লেক্সার ও ডিমাল্টিপ্লেক্সার কী এবং কীভাবে বিপরীতমুখী কাজ করে
  • N-to-1 MUX-এর জন্য কয়টি সিলেক্ট লাইন লাগে, এবং কেন
  • CPU ডেটাপাথে MUX-এর বাস্তব ভূমিকা (foreshadowing M6)
  • Python কোডে একটি real 4-to-1 MUX ও 1-to-4 DEMUX বানিয়ে সব সিলেক্ট মান দিয়ে যাচাই করা

১ · মাল্টিপ্লেক্সার (MUX) — অনেকের মধ্যে থেকে একটি বেছে নেওয়া

মাল্টিপ্লেক্সারMultiplexer (MUX)একাধিক ইনপুট সিগন্যাল থেকে সিলেক্ট লাইনের মান অনুযায়ী ঠিক একটি বেছে নিয়ে একক আউটপুটে পাঠানোর সার্কিট। একটি সার্কিট যা একাধিক ইনপুট সিগন্যালের মধ্যে থেকে ঠিক একটি বেছে নিয়ে একক আউটপুটে পাঠায় — কোনটি বেছে নেওয়া হবে তা নির্ধারণ করে সিলেক্ট লাইন-এর মান। একটি N-to-1 MUX-এর (N-টি ইনপুট থেকে ১টি আউটপুট বেছে নেওয়া) জন্য ঠিক ⌈log₂N⌉-টি সিলেক্ট লাইন প্রয়োজন — উদাহরণস্বরূপ, একটি 4-to-1 MUX-এ 4টি ইনপুট থেকে বেছে নিতে ২টি সিলেক্ট লাইন লাগে (কারণ ২-বিট দিয়ে ঠিক ৪টি ভিন্ন মান — 00, 01, 10, 11 — উপস্থাপন করা যায়)।

বাস্তব, সরাসরি ব্যবহার — MUX-ই সেই হার্ডওয়্যার মেকানিজম যা M6-এর CPU ডেটাপাথ ডিজাইনে প্রতিটি ধাপে কোন মান প্রবাহিত হবে তা নির্বাচন করে (যেমন ALU-এর কোন ইনপুট ব্যবহৃত হবে, বা পরবর্তী PC-এর মান কী হবে তা বেছে নেওয়া)।

২ · ডিমাল্টিপ্লেক্সার (DEMUX) — একটির থেকে অনেকে রুট করা

ডিমাল্টিপ্লেক্সারDemultiplexer (DEMUX)একক ইনপুট সিগন্যালকে সিলেক্ট লাইনের মান অনুযায়ী একাধিক সম্ভাব্য আউটপুটের মধ্যে ঠিক একটিতে পাঠানোর সার্কিট — মাল্টিপ্লেক্সারের ঠিক বিপরীত। MUX-এর ঠিক বিপরীত কাজ করে — একক একটি ইনপুট সিগন্যাল, সিলেক্ট লাইনের মান অনুযায়ী, একাধিক সম্ভাব্য আউটপুট লাইনের মধ্যে ঠিক একটিতে রুট করা হয়, বাকি সব আউটপুট নিষ্ক্রিয় (0) থাকে — অনেকটা একটি রেলওয়ে সুইচের মতো, যা একটি একক ট্রেনকে একাধিক ট্র্যাকের মধ্যে ঠিক একটিতে চালিত করে।

মাল্টিপ্লেক্সার (৪→১) I0 I1 I2 I3 MUX সিলেক্ট: ২ লাইন ১টি আউটপুট ডিমাল্টিপ্লেক্সার (১→৪) ইনপুট DEMUX সিলেক্ট: ২ লাইন O0 O1 O2 O3 MUX: অনেক ইনপুট → একটি আউটপুট বেছে নেওয়া। DEMUX: একটি ইনপুট → অনেক আউটপুটের একটিতে রুট করা — সিগন্যালের দিক উল্টো।
MUX ও DEMUX একে অপরের ঠিক বিপরীত দিকে কাজ করে, কিন্তু উভয়েই একই ধরনের সিলেক্ট-লাইন লজিক ব্যবহার করে।

নিচের কোড সেলে একটি বাস্তব mux(inputs, select_bits) ফাংশন বানানো হবে যা L03-এর বাইনারি-থেকে-দশমিক লজিক পুনর্ব্যবহার করে সিলেক্ট বিট থেকে ইনডেক্স বের করে inputs[select_value] রিটার্ন করে, এবং একটি demux(input_value, select_bits, num_outputs) ফাংশন — যা শুধুমাত্র সঠিক পজিশনে input_value বসিয়ে বাকি সব 0 রাখে।

Python
def bits_to_int(bits):
    """MSB-first সিলেক্ট বিট তালিকা -> পূর্ণসংখ্যা (L03-এর বাইনারি-থেকে-দশমিক লজিক পুনর্ব্যবহার)"""
    value = 0
    for b in bits:
        value = value * 2 + b
    return value

def mux(inputs, select_bits):
    """সিলেক্ট বিট অনুযায়ী inputs[select_value] বেছে নেয়"""
    select_value = bits_to_int(select_bits)
    return inputs[select_value]

def demux(input_value, select_bits, num_outputs):
    """input_value-কে সিলেক্ট বিট অনুযায়ী সঠিক আউটপুট পজিশনে রুট করে, বাকি সব 0"""
    select_value = bits_to_int(select_bits)
    outputs = [0] * num_outputs
    outputs[select_value] = input_value
    return outputs

# --- 4-to-1 MUX: সব ৪টি সম্ভাব্য সিলেক্ট মান পরীক্ষা ---
inputs4 = ["I0", "I1", "I2", "I3"]
print("4-to-1 MUX -- সব সিলেক্ট মানের জন্য:")
for s0 in (0, 1):
    for s1 in (0, 1):
        sel_bits = [s0, s1]
        chosen = mux(inputs4, sel_bits)
        print(f"  select={s0}{s1} (মান={bits_to_int(sel_bits)}) -> output = {chosen}")

# --- 1-to-4 DEMUX: input_value=1, সব ৪টি সম্ভাব্য সিলেক্ট মান ---
print()
print("1-to-4 DEMUX -- input_value=1, সব সিলেক্ট মানের জন্য:")
for s0 in (0, 1):
    for s1 in (0, 1):
        sel_bits = [s0, s1]
        outputs = demux(1, sel_bits, 4)
        print(f"  select={s0}{s1} (মান={bits_to_int(sel_bits)}) -> outputs = {outputs}")

    
লক্ষ্য করুন MUX আউটপুটে select=10 (মান=2) দিলে ঠিক I2 বের হয়ে আসে — MUX-এর সিলেক্ট বিট সরাসরি ইনপুট তালিকার ইনডেক্স নির্ধারণ করে। আর DEMUX-এ select=10 দিলে outputs = [0, 0, 1, 0] — শুধু ইনডেক্স ২ পজিশনে input_value বসেছে, বাকি সব 0। দুটোই একই সিলেক্ট-লাইন লজিক ব্যবহার করছে, শুধু ডেটা-প্রবাহের দিক উল্টো।
মূল কথা · Key takeaway

মাল্টিপ্লেক্সার ও ডিমাল্টিপ্লেক্সার — একে অপরের বিপরীত দিকের একই সিলেক্ট-লাইন প্রক্রিয়া। MUX বাস্তবে CPU-এর প্রতিটি ডেটাপাথ ধাপে "কোন সিগন্যাল এগোবে" তা নির্ধারণ করে — এই ধারণা M6-এর ডেটাপাথ ডিজাইনে বারবার ফিরে আসবে। এখন M2-এর পরবর্তী পাঠে (L11) দেখা যাবে এনকোডার ও ডিকোডার — যা মেমরি অ্যাড্রেসিং-এ একই ধরনের সিলেক্ট-লজিক ব্যবহার করে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একটি 8-to-1 MUX-এ ঠিক কয়টি সিলেক্ট লাইন লাগবে, এবং কেন?

৩টি সিলেক্ট লাইন লাগবে, কারণ ⌈log₂8⌉ = 3। ৩-বিট দিয়ে ঠিক ৮টি ভিন্ন মান (000 থেকে 111) উপস্থাপন করা যায় — প্রতিটি মান ৮টি ইনপুটের মধ্যে একটিকে নির্দিষ্টভাবে চিহ্নিত করে। এভাবেই N-to-1 MUX-এর জন্য সর্বনিম্ন সিলেক্ট লাইন সংখ্যা নির্ধারিত হয়।

প্র ০২ DEMUX-এ যদি ভুল করে দুইটি আউটপুট পজিশনে মান বসে যায়, সেটা কি সম্ভব? উপরের কোড এটা কীভাবে রোধ করে?

না, একটি সঠিক DEMUX ডিজাইনে এটা কখনো সম্ভব নয় — একটি নির্দিষ্ট সিলেক্ট মানের জন্য গাণিতিকভাবে ঠিক একটিমাত্র ইনডেক্স তৈরি হয় (bits_to_int সবসময় একটি একক পূর্ণসংখ্যা রিটার্ন করে), আর কোডে outputs = [0] * num_outputs দিয়ে শুরুতে সব 0 করে শুধু সেই একটিমাত্র ইনডেক্সে মান বসানো হয়েছে — গঠনগতভাবেই একাধিক পজিশনে মান বসার কোনো উপায় নেই।

প্র ০৩ CPU ডেটাপাথে MUX ছাড়া কি কাজ চালানো সম্ভব — যেমন সরাসরি তার (wire) দিয়ে সংযোগ করে দিলে?

না বাস্তবসম্মতভাবে নয় — কারণ একটি বাস্তব CPU-তে একই ওয়্যার/বাসে বিভিন্ন সময়ে বিভিন্ন উৎস থেকে ডেটা প্রবাহিত হওয়া দরকার (যেমন ALU-এর দ্বিতীয় ইনপুট কখনো একটি রেজিস্টারের মান, কখনো ইনস্ট্রাকশনের একটি immediate কনস্ট্যান্ট)। যদি সরাসরি সব উৎস একসাথে তারে জোড়া থাকত, সিগন্যাল একে অপরের সাথে সংঘর্ষ করত। MUX-ই নিয়ন্ত্রিতভাবে ঠিক একটি উৎস বেছে নেওয়ার একমাত্র নির্ভরযোগ্য উপায়।

অনুশীলন

  1. হাতে বসিয়ে দেখুন: একটি 4-to-1 MUX-এ inputs = ["A","B","C","D"] দেওয়া হলো — select=01 দিলে কোন ইনপুট আউটপুটে যাবে তা হাতে-কলমে বের করুন।

    select বিট [0,1] বাইনারি "01" = দশমিক 1। তাই inputs[1] বেছে নেওয়া হবে, অর্থাৎ আউটপুট হবে "B" (ইনডেক্স ০ থেকে গোনা হলে ইনডেক্স ১-এর উপাদান)।

  2. চিন্তা করুন: একটি DEMUX-এর সব আউটপুট যদি একসাথে দেখা হয়, তাহলে সেই আউটপুট তালিকাটিকেই কি একটি ডিকোডার-এর (L11) আউটপুটের মতো মনে হয়? সম্পর্কটা কী হতে পারে (এখনো L11 পড়েননি, শুধু অনুমান করুন)?

    হ্যাঁ, খুব কাছাকাছি সম্পর্ক আছে — একটি DEMUX যখন input_value=1 নিয়ে কাজ করে, তখন তার আউটপুট তালিকা ঠিক একটি ডিকোডারের আউটপুটের মতোই দেখাবে (ঠিক একটি পজিশনে 1, বাকি সব 0)। বাস্তবে একটি ডিকোডারকে প্রায়ই "input_value সবসময় 1 ধরে নেওয়া একটি বিশেষ DEMUX" হিসেবে ভাবা যায় — এই সম্পর্কটি L11-এ স্পষ্ট হবে।

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

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M6-এ (L28) এই পাঠের MUX ধারণা সরাসরি CPU ডেটাপাথ ডিজাইনে প্রয়োগ হবে।
  • আগের পাঠ L09 রিপল ক্যারি অ্যাডার ও সাবট্রাক্টর — বহু-বিট যোগ/বিয়োগের সার্কিট, যা পরে MUX-এর মাধ্যমে ডেটাপাথে সংযুক্ত হবে।
  • পরের পাঠ L11 এনকোডার ও ডিকোডার — DEMUX-এর সাথে ঘনিষ্ঠভাবে সম্পর্কিত সার্কিট, মেমরি অ্যাড্রেসিং-এ সরাসরি ব্যবহৃত হয়।
আগের পাঠ
রিপল ক্যারি অ্যাডার ও সাবট্রাক্টর