در سیستم‌های دیجیتال مدرن، استفاده از ورودی‌های فیزیکی مانند کلیدها (Push Button)، سوئیچ‌ها و رله‌ها بسیار رایج است. با این حال، ماهیت مکانیکی این قطعات، یک چالش اساسی را برای مدارهای الکترونیکی ایجاد می‌کند: ارتعاشات کنتاکت یا همان Bounce.

هنگامی که یک کلید مکانیکی فشرده یا رها می‌شود، کنتاکت‌های فلزی آن به دلیل اینرسی و الاستیسیته، برای مدت کوتاهی (معمولاً بین 1 تا 20 میلی‌ثانیه) چندین بار به یکدیگر برخورد کرده و از هم جدا می‌شوند. این پدیده، به جای تولید یک تغییر وضعیت تمیز و تک، منجر به تولید یک رشته پالس‌های ناخواسته (نویز) روی خط سیگنال می‌شود.

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

  • شمارش‌های غلط: اگر کلید برای افزایش یک شمارنده استفاده شود، ممکن است شمارنده به جای یک واحد، چندین واحد افزایش یابد.
  • فعال‌سازی‌های ناخواسته: یک مدار ممکن است به اشتباه چندین بار فعال یا غیرفعال شود.
  • رفتار غیرقابل پیش‌بینی: سیستم به دلیل دریافت سیگنال‌های نویزدار، رفتاری نامنظم و غیرقابل اعتماد از خود نشان دهد.

مدار Debouncing راه حلی برای این مشکل است. هدف آن حذف این ارتعاشات ناخواسته و تبدیل ورودی نویزدار مکانیکی به یک سیگنال دیجیتال تمیز و پایدار است که نمایانگر تنها یک تغییر وضعیت واقعی باشد.

Debouncing دیجیتال در FPGA: مفهوم و اهداف

Debouncing دیجیتال فرآیندی است که در آن، با استفاده از منطق‌های دیجیتال (به جای قطعات آنالوگ مانند خازن و مقاومت)، اثرات ارتعاشات کلید را حذف می‌کنیم. در یک FPGA، این کار با طراحی یک مدار خاص درون تراشه انجام می‌شود که ورودی خام و نویزدار کلید را دریافت کرده و یک خروجی تمیز و یکپارچه را تولید می‌کند.

هدف اصلی یک مدار Debouncing دیجیتال در FPGA:

  1. شناسایی تغییر واقعی وضعیت: تشخیص اینکه یک تغییر در ورودی کلید، یک تغییر پایدار و واقعی است، نه صرفاً یک ارتعاش لحظه‌ای.
  2. نادیده گرفتن نویز: حذف تمام پالس‌های ناخواسته و لحظه‌ای ناشی از ارتعاش.
  3. تولید یک پالس تک-سیکلی: پس از تأیید تغییر وضعیت واقعی، تولید یک پالس خروجی واحد که فقط به اندازه یک سیکل کلاک سیستم طول داشته باشد. این پالس “تمیز” و “یکتا” می‌تواند سپس برای فعال‌سازی منطق‌های بعدی در FPGA (مانند فعال‌سازی شمارنده، تغییر حالت FSM و غیره) استفاده شود.

به طور خلاصه، مدار Debouncing یک “فیلتر زمانی” دیجیتال است که سیگنال ورودی را برای یک دوره زمانی مشخص (که معمولاً به آن debounce_time می‌گویند) مانیتور می‌کند و تنها زمانی تغییر وضعیت را تأیید می‌کند که سیگنال ورودی برای تمام آن دوره زمانی، پایدار و بدون نوسان باقی بماند.

روش‌های پیاده‌سازی Debouncing در FPGA

در FPGA، Debouncing معمولاً با استفاده از یکی از دو رویکرد زیر انجام می‌شود:

1. Debouncer مبتنی بر شمارنده (Counter-Based Debouncer)

این روش یکی از ساده‌ترین و پرکاربردترین تکنیک‌ها است. ایده اصلی این است که برای یک ورودی مشخص، یک شمارنده داخلی (Timer) راه‌اندازی می‌شود.

  • نحوه عملکرد:
  • هنگامی که وضعیت ورودی کلید تغییر می‌کند (مثلاً از 0 به 1 یا برعکس)، شمارنده شروع به شمارش سیکل‌های کلاک سیستم می‌کند.
  • اگر ورودی برای مدت زمان کافی (که توسط تعداد سیکل‌های کلاک شمارنده تعیین می‌شود و از قبل مشخص شده است، مثلاً N سیکل کلاک) در وضعیت جدید خود باقی بماند، این تغییر به عنوان یک تغییر معتبر پذیرفته می‌شود.
  • اگر ورودی قبل از اینکه شمارنده به مقدار N برسد، دوباره تغییر کند (یعنی ارتعاش دیگری رخ دهد)، شمارنده ریست شده و دوباره از ابتدا شروع به مانیتورینگ می‌کند.
  • پس از تأیید پایداری، یک پالس خروجی Debounced تولید می‌شود.

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

2. Debouncer مبتنی بر ماشین حالت محدود (FSM-Based Debouncer)

این رویکرد، انعطاف‌پذیری بیشتری را ارائه می‌دهد و به خصوص برای سناریوهایی که نیاز به کنترل دقیق‌تری بر رفتار Debouncing دارند، مناسب است. یک ماشین حالت محدود (FSM) با چندین حالت تعریف می‌شود که هر حالت، مرحله خاصی از فرآیند Debouncing را نشان می‌دهد.

  • حالت‌های اصلی:
  • Idle (بیکار): در این حالت، FSM منتظر یک تغییر در ورودی کلید است.
  • Wait (انتظار): پس از تشخیص تغییر در ورودی، FSM به حالت انتظار می‌رود و یک شمارنده داخلی را فعال می‌کند. در این حالت، FSM منتظر می‌ماند تا ورودی برای مدت زمان debounce_time پایدار بماند.
  • Confirm (تأیید): اگر ورودی در طول مدت انتظار پایدار بماند، FSM به حالت تأیید رفته و یک پالس خروجی Debounced را تولید می‌کند. سپس به حالت Idle باز می‌گردد.
  • Reset (ریست): اگر در طول مدت انتظار، ورودی نوسان کند، FSM به حالت Reset برمی‌گردد تا دوباره منتظر یک تغییر پایدار بماند.

مزیت FSM: با طراحی مناسب حالات و گذارها، می‌توان Debouncerهای پیچیده‌تر با منطق‌های خاص را پیاده‌سازی کرد که مثلاً فقط فشردن کلید را Debounce کنند اما رها کردن آن را نه، یا پالس‌های خاصی را برای رویدادهای مختلف تولید کنند.

نکات مهم در طراحی یک Debouncer

  • همگام‌سازی ورودی (Input Synchronization): قبل از اینکه سیگنال کلید وارد مدار Debouncing شود، باید حتماً آن را با کلاک سیستم FPGA همگام‌سازی کرد. کلیدها ورودی‌های آسنکرون هستند و عدم همگام‌سازی می‌تواند منجر به مشکلات متاسیتلبیتی (Metastability) شود. این کار معمولاً با عبور سیگنال ورودی از دو یا سه فلیپ‌فلاپ متوالی (synchronizer chain) انجام می‌شود.
  • انتخاب DEBOUNCE_TIME مناسب: مدت زمان Debounce باید به اندازه کافی طولانی باشد تا تمام ارتعاشات مکانیکی کلید را پوشش دهد (معمولاً 10 تا 50 میلی‌ثانیه بسته به نوع کلید)، اما نه آنقدر طولانی که پاسخ‌دهی سیستم را به طور محسوسی کاهش دهد. این زمان بر اساس فرکانس کلاک سیستم و DEBOUNCE_THRESHOLD (حداقل تعداد سیکل‌های کلاک برای تأیید پایداری) محاسبه می‌شود.

با پیاده‌سازی صحیح یک مدار Debouncing، می‌توانیم از عملکرد قابل اعتماد و پایدار سیستم‌های دیجیتال خود که از ورودی‌های مکانیکی استفاده می‌کنند، اطمینان حاصل کنیم.

کلیدواژه ها : Debouncing-مدار Debouncing-FPGA-Verilog-طراحی دیجیتال-ارتعاش کلید-Button Bounce-نویز کلید-Debounce Time-همگام‌سازی-Synchronization-Metastability-متاسیتلبیتی-ماشین حالت محدود-FSM-شمارنده-Counter-Based Debouncer-پالس تک‌سیکلی-Single Clock-Cycle Pulse-طراحی سخت‌افزار-HDL-سوئیچ-Push Button