تبدیل یک عدد باینری خالص به فرم BCD (Binary Coded Decimal) یک عملیات رایج در مدارهای دیجیتال است، به ویژه زمانی که نیاز به نمایش اعداد بر روی نمایشگرهای هفت قسمتی یا ارتباط با سیستم‌هایی که با فرمت BCD کار می‌کنند، وجود دارد. در حالی که اعداد باینری برای محاسبات داخلی در FPGA بسیار کارآمد هستند، اما تفسیر آن‌ها توسط انسان در فرم دهدهی می‌تواند دشوار باشد. BCD این مشکل را حل می‌کند؛ هر چهار بیت از یک عدد BCD یک رقم دهدهی (0 تا 9) را کدگذاری می‌کند.

1. چرا تبدیل باینری به BCD نیاز است؟

FPGAها ذاتاً با اعداد باینری کار می‌کنند. اما نمایش این اعداد به کاربر معمولاً به صورت دهدهی است. به عنوان مثال، یک شمارنده که تعداد پالس‌ها را می‌شمارد، خروجی باینری دارد. اگر بخواهیم این تعداد را روی یک نمایشگر هفت قسمتی (Seven-Segment Display) نشان دهیم، هر رقم دهدهی روی نمایشگر باید به صورت BCD برای درایور نمایشگر ارسال شود. تبدیل مستقیم باینری به دهدهی با استفاده از تقسیم و باقیمانده، در سخت‌افزار دیجیتال پیچیده است. از این رو، روش‌های جایگزینی برای انجام این تبدیل به صورت کارآمد در FPGA توسعه یافته‌اند.

2. چالش اصلی: تفاوت ساختار باینری و BCD

نکته کلیدی در تبدیل باینری به BCD این است که یک عدد باینری صرفاً یک وزن توانی از 2 برای هر بیت دارد (1, 2, 4, 8, 16, …) در حالی که در BCD، هر چهار بیت یک گروه مستقل را تشکیل می‌دهند که یک رقم دهدهی را نشان می‌دهد. جمع ساده بیت‌های باینری به فرم BCD منجر نمی‌شود. به عنوان مثال، عدد باینری 1010 (معادل 10 دهدهی) اگر به صورت مستقیم به BCD تفسیر شود، 0010 0010 (معادل 22 دهدهی) نخواهد شد، بلکه باید 0001 0000 باشد. بنابراین، یک الگوریتم خاص برای این تبدیل لازم است.

3. الگوریتم Shift-and-Add-3 (یا Double-Dabble)

یکی از پرکاربردترین و مؤثرترین الگوریتم‌ها برای تبدیل باینری به BCD در FPGA، الگوریتم “Shift-and-Add-3” یا “Double-Dabble” است. این الگوریتم به صورت سریالی (بیت به بیت) کار می‌کند و نیاز به چندین سیکل کلاک دارد، اما از نظر مصرف منابع سخت‌افزاری بسیار بهینه است.

مراحل مفهومی این الگوریتم به شرح زیر است:

الف. مقادیر اولیه:

  • فرض کنید یک عدد باینری N بیتی برای تبدیل داریم.
  • چندین “ثبات BCD” (BCD Registers) را در نظر می‌گیریم که هر کدام چهار بیت دارند و یک رقم دهدهی را نشان می‌دهند. تعداد این ثبات‌ها به بزرگی عدد باینری بستگی دارد (مثلاً برای یک عدد 8 بیتی باینری که می‌تواند تا 255 باشد، به سه ثبات BCD نیاز داریم: صدگان، دهگان، یکان).
  • در ابتدا، تمام ثبات‌های BCD را با صفر مقداردهی می‌کنیم.
  • عدد باینری ورودی را در یک “ثبات باینری” (Binary Register) قرار می‌دهیم.

ب. عملیات شیفت و اصلاح:

  • این فرآیند برای N سیکل کلاک تکرار می‌شود (برای هر بیت از عدد باینری یک بار).
  • مرحله 1: اصلاح BCD (Addition Correction): قبل از هر بار شیفت، محتوای هر یک از ثبات‌های BCD را بررسی می‌کنیم. اگر مقدار یک ثبات BCD (که یک رقم دهدهی را نشان می‌دهد) بزرگتر از 4 باشد (یعنی 5، 6، 7، 8، یا 9)، آنگاه باید عدد 3 را به آن اضافه کنیم. این “3+” یک تصحیح است تا اطمینان حاصل شود که هنگام شیفت به سمت چپ، وزن‌های دهدهی به درستی حفظ می‌شوند. این افزودن 3 تنها برای هر رقم BCD به صورت مستقل انجام می‌شود.
  • مرحله 2: شیفت به چپ (Shift Left): پس از اعمال اصلاحات لازم، تمامی بیت‌ها در ثبات باینری و تمام ثبات‌های BCD را یک پله به سمت چپ شیفت می‌دهیم. مهمترین بیت (MSB) از ثبات باینری به کم‌ارزش‌ترین بیت (LSB) از کم‌ارزش‌ترین ثبات BCD منتقل می‌شود. سپس، بیت MSB هر ثبات BCD به LSB ثبات BCD بعدی (با ارزش بالاتر) منتقل می‌شود. این شیفت در واقع معادل ضرب در 2 است.

ج. تکرار:

  • مراحل (مرحله 1 و 2) به تعداد بیت‌های عدد باینری اصلی (N بار) تکرار می‌شود.
  • پس از N سیکل، ثبات باینری خالی خواهد شد و تمام ارقام BCD صحیح در ثبات‌های BCD مربوطه قرار خواهند گرفت.

4. پیاده‌سازی در FPGA

پیاده‌سازی الگوریتم Shift-and-Add-3 در FPGA شامل استفاده از عناصر زیر است:

  • ثبات‌ها (Registers/D-Flip-Flops): برای نگهداری عدد باینری ورودی و همچنین برای هر رقم BCD (هر کدام 4 بیت)، از D-Flip-Flopها استفاده می‌شود. این ثبات‌ها وضعیت را در طول سیکل‌های کلاک حفظ می‌کنند.
  • منطق ترکیبی (Combinational Logic/LUTs):
  • مدارهای مقایسه‌کننده (Comparators): برای هر ثبات BCD، یک مدار مقایسه‌کننده نیاز است تا تشخیص دهد آیا محتوای آن بزرگتر از 4 است یا خیر. این مدارها با استفاده از LUTها پیاده‌سازی می‌شوند.
  • مدارهای جمع‌کننده (Adders): برای هر ثبات BCD که نیاز به اصلاح دارد، یک مدار جمع‌کننده (مثلاً یک 4 بیتی Adder) برای افزودن عدد 3 به کار می‌رود. این نیز با استفاده از LUTها و منطق متناظر پیاده‌سازی می‌شود.
  • مالتی‌پلکسرها (Multiplexers): برای انتخاب بین مقدار اصلی BCD و مقدار BCD اصلاح شده (+3) در هر ثبات BCD استفاده می‌شود، که خروجی مقایسه‌کننده به عنوان سیگنال انتخاب‌گر آن عمل می‌کند.
  • شمارنده (Counter): برای پیگیری تعداد شیفت‌هایی که انجام شده و کنترل تکرار N باره الگوریتم، یک شمارنده N بیتی نیاز است.
  • ماشین حالت محدود (Finite State Machine - FSM): برای کنترل کل فرآیند، از یک ماشین حالت محدود ساده استفاده می‌شود. این FSM وضعیت‌های “مقداردهی اولیه”، “اجرای شیفت و اصلاح” و “پایان” را مدیریت می‌کند و سیگنال‌های کنترلی لازم را برای ثبات‌ها و منطق ترکیبی تولید می‌کند.

مراحل کلی طراحی در FPGA:

  1. تعریف ثبات‌های لازم برای عدد باینری و هر یک از ارقام BCD.
  2. پیاده‌سازی منطق تشخیص “بزرگتر از 4” برای هر رقم BCD.
  3. پیاده‌سازی مدارهای جمع‌کننده +3 برای هر رقم BCD.
  4. طراحی منطق شیفت‌کننده که بیت‌ها را بین ثبات باینری و ثبات‌های BCD جابجا می‌کند.
  5. ساخت یک شمارنده برای ردیابی تعداد شیفت‌ها.
  6. طراحی یک ماشین حالت برای هماهنگ‌سازی و کنترل توالی عملیات (مقداردهی اولیه، شیفت، اصلاح، و پایان).

این رویکرد، تبدیل باینری به BCD را به صورت گام به گام و در طول چندین سیکل کلاک انجام می‌دهد، که آن را به یک راه حل متعادل بین سرعت و مصرف منابع در FPGA تبدیل می‌کند.

کلیدواژه ها : تبدیل باینری به BCD-FPGA-Shift-and-Add-3-Double-Dabble-منطق ترکیبی-D-Flip-Flop-ثبات‌ها-LUTs-شمارنده-ماشین حالت محدود-پردازش سریال-BCD Encoder