دکودر (Decoder) یک مدار منطقی ترکیبی است که هدف اصلی آن تبدیل یک کد ورودی NN-بیتی به حداکثر 2N2^N خروجی یکتا (یا MM خروجی که M2NM \le 2^N) است. در هر لحظه، تنها یکی از این خروجی‌ها فعال می‌شود، در حالی که بقیه غیرفعال هستند. این مدار یک بلوک سازنده اساسی در سیستم‌های دیجیتال است و کاربردهای فراوانی دارد، از انتخاب حافظه و ورودی/خروجی گرفته تا فعال‌سازی بخش‌های خاصی از یک مدار.

1. مفهوم و عملکرد اصلی دکودر

به زبان ساده، یک دکودر ورودی‌های آدرس را می‌گیرد و یک خروجی خاص را متناظر با آن آدرس فعال می‌کند.

  • ورودی‌ها (Inputs): NN بیت ورودی (مثلاً A0,A1,,AN1A_0, A_1, \dots, A_{N-1}) که کد یا آدرس را نمایش می‌دهند.
  • خروجی‌ها (Outputs): MM بیت خروجی (مثلاً Y0,Y1,,YM1Y_0, Y_1, \dots, Y_{M-1}). برای یک دکودر باینری کامل، M=2NM=2^N.
  • منطق فعال‌سازی: برای هر ترکیب از ورودی‌های NN-بیتی، تنها یکی از MMM خروجی‌ها (معمولاً با سطح منطقی بالا یا active-high، هرچند active-low نیز رایج است) فعال می‌شود. بقیه خروجی‌ها غیرفعال می‌مانند.
  • مثال: یک دکودر 2 به 4 (2-to-4 Decoder) دو ورودی (A1,A0A_1, A_0) دارد و چهار خروجی (Y0,Y1,Y2,Y3Y_0, Y_1, Y_2, Y_3). اگر ورودی A1A0=00A_1A_0 = 00 باشد، فقط Y0Y_0فعال می‌شود. اگر A1A0=01A_1A_0 = 01 باشد، فقط Y1Y_1 فعال می‌شود و الی آخر.

2. پیاده‌سازی دکودر با گیت‌های منطقی (مفهومی)

در سطح پایه، هر خروجی دکودر با یک گیت AND (NNN-ورودی) پیاده‌سازی می‌شود. ورودی‌های این گیت AND ترکیبی از بیت‌های ورودی (یا مکمل آن‌ها) هستند که آن خروجی خاص را فعال می‌کنند.

  • برای Y0Y_0: اگر ورودی A1A0=00A_1A_0 = 00 باشد، Y0Y_0Y0 باید فعال شود. بنابراین، Y0=A1A0Y_0 = \overline{A_1} \cdot \overline{A_0}.
  • برای Y1Y_1: اگر ورودی A1A0=01A_1A_0 = 01 باشد، Y1Y_1 باید فعال شود. بنابراین، Y1=A1A0Y_1 = \overline{A_1} \cdot A_0.
  • برای Y2Y_2: اگر ورودی A1A0=10A_1A_0 = 10 باشد، Y2Y_2 باید فعال شود. بنابراین، Y2=A1A0Y_2 = A_1 \cdot \overline{A_0}.
  • برای Y3Y_3: اگر ورودی A1A0=11A_1A_0 = 11 باشد، Y3Y_3 باید فعال شود. بنابراین، Y3=A1A0Y_3 = A_1 \cdot A_0.

این ساختار صرفاً از گیت‌های منطقی (AND و NOT) استفاده می‌کند و هیچ عنصر حافظه (مانند فلیپ‌فلاپ) ندارد، بنابراین یک مدار کاملاً ترکیبی (Combinational) است.

3. طراحی و نگاشت دکودر در FPGA

هنگام طراحی یک دکودر برای FPGA، هدف ما بهره‌برداری بهینه از منابع داخلی FPGA است. منابع اصلی برای پیاده‌سازی منطق ترکیبی در FPGA، جدول‌های جستجو (Look-Up Tables - LUTs) هستند.

  • نگاشت به LUTs:

  • هر LUT معمولاً یک تابع بولین با 4 تا 6 ورودی را پیاده‌سازی می‌کند.

  • برای یک دکودر کوچک، مانند 2 به 4، هر خروجی (مانند Y0=A1A0Y_0 = \overline{A_1} \cdot \overline{A_0}) می‌تواند به طور مستقیم در یک LUT پیاده‌سازی شود.

  • بنابراین، یک دکودر 2 به 4، چهار خروجی دارد و هر خروجی می‌تواند در یک LUT مجزا قرار گیرد، که در مجموع 4 LUT مصرف می‌کند.

  • برای یک دکودر 3 به 8، هر خروجی (مانند Y0=A2A1A0Y_0 = \overline{A_2} \cdot \overline{A_1} \cdot \overline{A_0}) نیز می‌تواند در یک LUT (با 3 ورودی) پیاده‌سازی شود. در مجموع، 8 LUT مصرف می‌شود.

  • حتی برای دکودرهای کمی بزرگتر، مثلاً یک دکودر 4 به 16، هر خروجی (مانند Y0=A3A2A1A0Y_0 = \overline{A_3} \cdot \overline{A_2} \cdot \overline{A_1} \cdot \overline{A_0}) به راحتی در یک LUT 4-ورودی قرار می‌گیرد و 16 LUT مصرف خواهد شد.

  • برای دکودرهای بسیار بزرگتر (مانند 8 به 256)، که تعداد خروجی‌ها بسیار زیاد است و تعداد ورودی‌ها از ظرفیت یک LUT فراتر می‌رود، سنتز کننده FPGA به طور خودکار منطق را به چندین LUT و مسیرهای میانی تقسیم می‌کند. این تقسیم‌بندی به گونه‌ای انجام می‌شود که کمترین تأخیر و بهترین استفاده از منابع حاصل شود.

4. انواع دکودرها و ملاحظات در FPGA

  • دکودر باینری (Binary Decoder): همانطور که توضیح داده شد، NNN ورودی را به 2N2^N2N خروجی تبدیل می‌کند. برای آدرس‌دهی حافظه یا انتخاب واحدها در یک سیستم.
  • دکودر با ورودی فعال‌ساز (Enable Input): بسیاری از دکودرها یک ورودی فعال‌ساز (Enable) دارند. اگر این ورودی فعال نباشد، تمامی خروجی‌های دکودر غیرفعال می‌مانند، صرف‌نظر از ورودی‌های آدرس. این ویژگی برای ساخت دکودرهای بزرگتر از دکودرهای کوچکتر (hierarchical decoding) یا کنترل زمان‌بندی فعال‌سازی یک بلوک مفید است. در FPGA، این فعال‌ساز به عنوان یک ورودی اضافی به LUTها اعمال می‌شود.
  • دکودرهای BCD (مانند BCD-to-7-segment Decoder): این نوع دکودر 4 بیت ورودی BCD (که ارقام 0 تا 9 را نشان می‌دهد) را می‌گیرد و آن را به 7 خروجی برای فعال‌سازی سگمنت‌های یک نمایشگر 7-سگمنتی تبدیل می‌کند. این دکودر یک مثال از NNN-به-MMM است که M2NM \neq 2^NM=2N.
  • طراحی در FPGA: منطق تبدیل هر رقم BCD به الگوی 7-سگمنت نیز کاملاً ترکیبی است و در LUTs پیاده‌سازی می‌شود. به عنوان مثال، برای نمایش رقم 0 (ورودی 0000), سگمنت‌های a, b, c, d, e, f باید فعال شوند و g غیرفعال. این منطق برای هر یک از 7 سگمنت در یک LUT جداگانه قابل پیاده‌سازی است.

5. ملاحظات مهم در طراحی دکودر در FPGA

  • مدار ترکیبی خالص: دکودرها ذاتاً مدارهای ترکیبی هستند. به این معنی که خروجی آنها مستقیماً و بلافاصله به تغییرات ورودی‌ها پاسخ می‌دهد. هیچ کلاک (Clock) یا فلیپ‌فلاپ (Flip-Flop) برای عملکرد اصلی دکودر نیاز نیست. کلاک فقط در صورتی وارد می‌شود که بخواهیم ورودی‌ها یا خروجی‌های دکودر را با رجیستر (فلیپ‌فلاپ) همگام‌سازی کنیم، اما این جزئی از خود دکودر نیست.
  • تأخیر انتشار (Propagation Delay): از آنجایی که دکودرها مستقیماً به LUTها نگاشت می‌شوند، تأخیر از ورودی به خروجی معمولاً بسیار کم است. این تأخیر عمدتاً به تعداد سطوح منطقی (LUTs) و تأخیر مسیرهای ارتباطی در FPGA بستگی دارد.
  • مصرف منابع (Resource Utilization): دکودرهای باینری بزرگ (مثلاً 10 به 1024) می‌توانند تعداد زیادی LUT مصرف کنند، زیرا هر خروجی به طور بالقوه یک LUT نیاز دارد. اما سنتز کننده‌های مدرن بسیار هوشمند هستند و می‌توانند منطق مشترک را بهینه‌سازی کنند.
  • فن‌اوت (Fan-out): خروجی‌های دکودر ممکن است بسیاری از بلوک‌های دیگر را فعال کنند. این فن‌اوت بالا می‌تواند بر تأخیر سیگنال تأثیر بگذارد، اما مدیریت آن معمولاً توسط ابزارهای جایابی و مسیریابی FPGA انجام می‌شود.

در نهایت، دکودر یک بلوک سازنده اساسی و کاملاً ترکیبی است که به طور بسیار کارآمد در FPGAها پیاده‌سازی می‌شود، و با توصیف رفتاری مناسب، ابزارهای سنتز بهترین نگاشت را به منابع سخت‌افزاری آن (LUTs) فراهم می‌کنند.

کلیدواژه ها : دکودر-FPGA-طراحی-LUTs-منطق ترکیبی-ورودی فعال‌ساز-دکودر باینری-BCD-to-7-segment-تأخیر انتشار-مصرف منابع-فن‌اوت-سنتز-VHDL-Verilog-مفهوم-معماری