এনকোডার ও ডিকোডার
এই পাঠে যা শিখবেন
- ডিকোডার ও এনকোডার কী, এবং কীভাবে একে অপরের বিপরীত
- মেমরি অ্যাড্রেস ডিকোডিং-এ ডিকোডারের বাস্তব ব্যবহার
- প্রায়োরিটি এনকোডার কেন দরকার — একাধিক ইনপুট একসাথে সক্রিয় হলে কী হয়
- Python কোডে
decoder,encoder, ওpriority_encoderবানিয়ে একাধিক সক্রিয় লাইনসহ পরীক্ষা করা
১ · ডিকোডার — একটি বাইনারি কোড থেকে একটি সক্রিয় লাইন
ডিকোডারDecoderN-বিট বাইনারি ইনপুট থেকে ঠিক 2^N-টি আউটপুট লাইনের মধ্যে একটি সক্রিয় করার সার্কিট — এনকোডারের বিপরীত। N-টি ইনপুট লাইন নেয় এবং ইনপুটের বাইনারি মানের ভিত্তিতে 2N-টি আউটপুট লাইনের মধ্যে ঠিক একটি সক্রিয় করে। উদাহরণস্বরূপ, একটি 2-to-4 ডিকোডার ২-বিট ইনপুট নিয়ে ৪টি আউটপুট লাইনের মধ্যে একটি সক্রিয় করে। L10-এর DEMUX-এর সাথে এর গভীর সম্পর্ক আছে — একটি ডিকোডারকে অনেকটা "সবসময় input_value=1 ধরে নেওয়া একটি বিশেষ DEMUX" হিসেবে ভাবা যায়।
বাস্তব ব্যবহার — মেমরি অ্যাড্রেস ডিকোডিং। একটি মেমরি চিপ একটি ডিকোডার ব্যবহার করে অ্যাড্রেস বিটের বাইনারি মান থেকে বহু মেমরি রো/লোকেশনের মধ্যে ঠিক একটি বেছে নেয় — এটি M9-এর মেমরি অর্গানাইজেশনের সরাসরি ভিত্তি।
২ · এনকোডার — একটি সক্রিয় লাইন থেকে একটি বাইনারি কোড
এনকোডারEncoder2^N-টি ইনপুট লাইনের মধ্যে যেটি সক্রিয়, তার N-বিট বাইনারি কোড বের করার সার্কিট — ডিকোডারের বিপরীত। ডিকোডারের ঠিক বিপরীত — 2N-টি ইনপুট লাইন নেয় (স্বাভাবিক অবস্থায় ঠিক একটিই সক্রিয় থাকে ধরে নেওয়া হয়) এবং কোন ইনপুটটি সক্রিয় ছিল তার N-বিট বাইনারি কোড তৈরি করে।
৩ · প্রায়োরিটি এনকোডার — যখন একাধিক ইনপুট একসাথে সক্রিয়
সাধারণ এনকোডার ধরে নেয় ঠিক একটি ইনপুট সক্রিয় থাকবে — কিন্তু বাস্তবে একাধিক ইনপুট একসাথে সক্রিয় হতে পারে। প্রায়োরিটি এনকোডারPriority Encoderএকাধিক ইনপুট একসাথে সক্রিয় হলে, পূর্বনির্ধারিত প্রায়োরিটি অনুযায়ী সর্বোচ্চ-গুরুত্বপূর্ণ সক্রিয় ইনপুটের কোড দেয়, বাকিগুলো উপেক্ষা করে। একটি পূর্বনির্ধারিত প্রায়োরিটি অনুযায়ী শুধুমাত্র সর্বোচ্চ-প্রায়োরিটি সক্রিয় ইনপুটের কোড বের করে, বাকি নিম্ন-প্রায়োরিটি সক্রিয় ইনপুটগুলো উপেক্ষা করে।
M10/L48-এর ইন্টারাপ্ট হ্যান্ডলিং-এ, একাধিক ডিভাইস (যেমন কীবোর্ড, ডিস্ক, নেটওয়ার্ক কার্ড) একই সাথে CPU-এর দৃষ্টি আকর্ষণের অনুরোধ (ইন্টারাপ্ট) পাঠাতে পারে। CPU-কে জানতে হয় কোনটি আগে সার্ভ করবে — এটাই ঠিক প্রায়োরিটি এনকোডারের কাজ, বাস্তব হার্ডওয়্যারে একটি সত্যিকারের প্রয়োজনীয়তা, নিছক তাত্ত্বিক ব্যায়াম নয়।
নিচের কোড সেলে decoder, encoder, ও priority_encoder — তিনটিই
বাস্তবায়ন করে, শেষে একটি বাস্তব কেস দেখানো হবে যেখানে ২টি লাইন একসাথে সক্রিয় (ইনডেক্স ১ ও ৩) এবং
প্রায়োরিটি এনকোডার সঠিকভাবে সর্বোচ্চ-প্রায়োরিটি (এখানে সর্বোচ্চ-ইনডেক্স) লাইনটি বেছে নেয়।
def decoder(binary_input_bits, n):
"""n-বিট MSB-first বাইনারি ইনপুট -> 2^n আউটপুটের তালিকা, ঠিক একটি=1"""
value = 0
for b in binary_input_bits:
value = value * 2 + b
outputs = [0] * (2 ** n)
outputs[value] = 1
return outputs
def encoder(active_line_index, n):
"""সক্রিয় লাইনের ইনডেক্স -> n-বিট বাইনারি কোড (MSB-first)"""
return [(active_line_index >> i) & 1 for i in range(n - 1, -1, -1)]
def priority_encoder(active_lines_list, n):
"""একাধিক লাইন একসাথে সক্রিয় হলে, সর্বোচ্চ-প্রায়োরিটি (সর্বোচ্চ ইনডেক্স) লাইনের কোড রিটার্ন করে"""
highest_priority_line = max(active_lines_list)
code = encoder(highest_priority_line, n)
return code, highest_priority_line
# --- ডিকোডার: 2-to-4 ---
print("2-to-4 ডিকোডার:")
for a in (0, 1):
for b in (0, 1):
print(f" input={a}{b} -> outputs={decoder([a, b], 2)}")
# --- এনকোডার: 4-to-2 ---
print()
print("4-to-2 এনকোডার:")
for line in range(4):
print(f" active line={line} -> code={encoder(line, 2)}")
# --- প্রায়োরিটি এনকোডার: একাধিক লাইন একসাথে সক্রিয় ---
print()
active_lines = [1, 3]
code, winner = priority_encoder(active_lines, 2)
print(f"একসাথে সক্রিয় লাইন: {active_lines}")
print(f" সর্বোচ্চ-প্রায়োরিটি লাইন = {winner} (নিম্ন-প্রায়োরিটি লাইন {[l for l in active_lines if l != winner]} উপেক্ষিত)")
print(f" চূড়ান্ত কোড = {code}")
print(f" যাচাই: encoder({winner}, 2) = {encoder(winner, 2)} | মিলেছে কি? {code == encoder(winner, 2)}")
[1, 1], যা
encoder(3, 2)-এর ফলাফলের সাথে হুবহু মেলে। এটিই দেখায় কীভাবে একটি বাস্তব ইন্টারাপ্ট কন্ট্রোলার
একাধিক একসাথে আসা অনুরোধ থেকে একটিমাত্র সিদ্ধান্তে পৌঁছায়।
ডিকোডার ও এনকোডার একে অপরের বিপরীত দিকের বাইনারি-কোড-থেকে-সক্রিয়-লাইন সম্পর্ক — মেমরি অ্যাড্রেসিং-এর ভিত্তি। প্রায়োরিটি এনকোডার এই ধারণাকে বাস্তবসম্মত করে তোলে, যেখানে একাধিক ঘটনা একসাথে ঘটতে পারে। M2-এর শেষ পাঠে (L12) এবার কম্প্যারেটর ও প্যারিটি সার্কিট দিয়ে কম্বিনেশনাল সার্কিট মডিউল সম্পূর্ণ হবে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি প্রায়োরিটি এনকোডারে কোনো লাইনই সক্রিয় না থাকে (active_lines_list খালি), তাহলে উপরের কোডে কী ঘটবে?
উপরের কোডে max(active_lines_list) একটি খালি তালিকায় Python-এ ValueError
ছুড়বে — অর্থাৎ কোডটি স্পষ্টভাবে ব্যর্থ হবে, নীরবে ভুল ফলাফল দেবে না। বাস্তব হার্ডওয়্যারেও ঠিক এই কারণেই
একটি অতিরিক্ত "valid" সিগন্যাল রাখা হয় যা নির্দেশ করে অন্তত একটি ইনপুট সক্রিয় আছে কিনা — কোনো ইনপুট
সক্রিয় না থাকলে আউটপুট কোডকে অর্থহীন/অগ্রাহ্য হিসেবে চিহ্নিত করতে হয়।
প্র ০২ এই পাঠের decoder ফাংশন আর L10-এর demux ফাংশনের কোডের মধ্যে ঠিক কী পার্থক্য?
কাঠামোগতভাবে প্রায় অভিন্ন — দুটোই সিলেক্ট/ইনপুট বিট থেকে একটি ইনডেক্স বের করে সেই পজিশনে মান বসায়।
একমাত্র পার্থক্য: demux-এ আপনি ইচ্ছেমতো input_value (যেকোনো মান) নির্দিষ্ট
করতে পারেন, কিন্তু decoder-এ সবসময় ধরে নেওয়া হয় সেই মান 1 — decoder আসলে demux-এর একটি
বিশেষ, সরলীকৃত সংস্করণ।
প্র ০৩ মেমরি অ্যাড্রেস ডিকোডিং-এ যদি একটি ডিকোডার একসাথে দুটি মেমরি রো সক্রিয় করে ফেলত, তাহলে কী সমস্যা হতো?
দুটো ভিন্ন মেমরি রো একসাথে সক্রিয় হলে, উভয় রো-এর ডেটা একই সাথে আউটপুট বাসে প্রবাহিত হওয়ার চেষ্টা করবে — যা সিগন্যাল সংঘর্ষ (bus contention) ঘটাবে এবং কোন ডেটা আসলে পড়া হচ্ছে তা অনির্ধারিত/ভুল হয়ে যাবে। এই কারণেই ডিকোডারের একটি গাণিতিক গ্যারান্টি (গঠনগতভাবে ঠিক একটি আউটপুট সক্রিয় হওয়া) মেমরি সিস্টেমের নির্ভরযোগ্যতার জন্য অপরিহার্য।
অনুশীলন
-
হাতে বসিয়ে দেখুন: একটি 3-to-8 ডিকোডারে ইনপুট বিট [1,0,1] দিলে কোন ইনডেক্সের আউটপুট সক্রিয় হবে তা হাতে-কলমে বের করুন।
বাইনারি "101" = দশমিকে 1×4 + 0×2 + 1×1 = 5। তাই আউটপুট তালিকার ইনডেক্স ৫ (8-টি আউটপুটের মধ্যে, ইনডেক্স ০ থেকে গোনা) সক্রিয় (1) হবে, বাকি সাতটি 0 থাকবে।
-
চিন্তা করুন: যদি প্রায়োরিটি এনকোডারে "সর্বোচ্চ ইনডেক্স = সর্বোচ্চ প্রায়োরিটি"-এর বদলে "সর্বনিম্ন ইনডেক্স = সর্বোচ্চ প্রায়োরিটি" চাওয়া হতো, কোডে ঠিক কোন লাইনটি বদলাতে হতো (এখনো কোড পরিবর্তন করবেন না)?
শুধু
highest_priority_line = max(active_lines_list)লাইনটিmin(active_lines_list)-এ পরিবর্তন করলেই যথেষ্ট — বাকি পুরো ফাংশন (encoder কল, কোড তৈরি) অপরিবর্তিত থাকবে, কারণ "কোন লাইন সর্বোচ্চ-প্রায়োরিটি" এই একটিমাত্র সিদ্ধান্তের উপরই পুরো যুক্তি নির্ভরশীল।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ M9-এ (মেমরি টেকনোলজি) এই পাঠের ডিকোডার ধারণা সরাসরি মেমরি অর্গানাইজেশনে প্রয়োগ হবে।
- আগের পাঠ L10 মাল্টিপ্লেক্সার ও ডিমাল্টিপ্লেক্সার — DEMUX-এর সাথে ডিকোডারের গঠনগত সম্পর্ক এই পাঠে প্রথম দেখা গিয়েছিল।
- পরের পাঠ L12 কম্প্যারেটর ও প্যারিটি সার্কিট — M2-এর শেষ পাঠ, দুই সংখ্যার তুলনা ও এরর-ডিটেকশনের বাস্তব সার্কিট।