کلیدهای مکانیکی، میکروسوئیچ‌ها، یا هرگونه سوئیچ فیزیکی دیگر، هنگام فشرده شدن یا رها شدن، یک پالس تمیز و واحد تولید نمی‌کنند. در عوض، به دلیل ماهیت مکانیکی و ارتعاشات فیزیکی کنتاکت‌ها، برای مدت کوتاهی (معمولاً در حدود چند میلی‌ثانیه)، چندین بار باز و بسته می‌شوند و یک “نویز” الکتریکی ایجاد می‌کنند که به آن Bounce یا ارتعاش کنتاکت گفته می‌شود.

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

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

مفهوم و هدف Debouncing دیجیتال

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

نتیجه نهایی یک Debouncer دیجیتال در FPGA معمولاً یک پالس تک-سیکلی کلاک (Single Clock-Cycle Pulse) برای هر فشردن (یا رها کردن) کلید است. این پالس می‌تواند سپس برای فعال کردن منطق‌های ترتیبی (مانند فلیپ‌فلاپ‌ها یا شمارنده‌ها) به کار رود.

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

دو رویکرد رایج برای پیاده‌سازی Debouncing در FPGA وجود دارد:

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

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

مراحل کلی:

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

مثال مفهومی (ساختار کلی):

یک شمارنده NNN-بیتی داریم که تا 2N12^N-12N1 می‌شمارد. اگر ساعت سیستم CLKCLKCLK و ورودی کلید btn_in باشد:

  1. یک فلیپ‌فلاپ لبه به لبه (btn_in_d0, btn_in_d1) برای همگام‌سازی ورودی btn_in و تشخیص تغییرات لبه استفاده می‌شود.
  2. اگر btn_in_d1 با btn_in_d0 متفاوت باشد (یعنی تغییر لبه‌ای تشخیص داده شده)، شمارنده debounce_cnt شروع به شمارش می‌کند.
  3. اگر debounce_cnt به یک مقدار آستانه (مثلاً 2162^{16}216) برسد و btn_in_d1 همچنان ثابت باشد، آنگاه وضعیت جدید کلید تأیید می‌شود و btn_out (خروجی Debounced) تغییر می‌کند.
  4. برای تولید پالس تک‌سیکلی، می‌توانیم از تشخیص لبه روی btn_out استفاده کنیم.

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

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

حالت‌های رایج یک FSM Debouncer:

  • Idle (حالت بی‌کاری): منتظر تغییر در ورودی کلید.
  • Wait_High (انتظار برای High): پس از تشخیص لبه بالا رونده (فشردن کلید)، شمارنده شروع به کار می‌کند و FSM منتظر می‌ماند تا ورودی برای مدت زمان DEBOUNCE_TIME در حالت 1 پایدار بماند.
  • Wait_Low (انتظار برای Low): پس از تشخیص لبه پایین رونده (رها کردن کلید)، شمارنده شروع به کار می‌کند و FSM منتظر می‌ماند تا ورودی برای مدت زمان DEBOUNCE_TIME در حالت 0 پایدار بماند.
  • Output_Pulse (تولید پالس): پس از تأیید پایداری، یک پالس تک-سیکلی تولید می‌شود و FSM به حالت Idle بازمی‌گردد.

توضیحات:

  • clk: ساعت سیستم
  • rst: سیگنال ریست آسنکرون
  • button_sync: ورودی کلید که قبلاً از طریق دو یا سه فلیپ‌فلاپ همگام‌سازی شده است (برای جلوگیری از مشکلات متاسیتلبیتی).
  • debounced_out: خروجی Debounced (پالس تک-سیکلی).
  • count: شمارنده‌ای که برای زمان Debounce استفاده می‌شود.
  • DEBOUNCE_THRESHOLD: مقدار آستانه شمارنده برای تعیین زمان Debounce.

نکات مهم در طراحی و پیاده‌سازی

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

  2. تعیین زمان تأخیر (Delay/Threshold) مناسب:

  • زمان ارتعاش کلیدهای مکانیکی معمولاً بین 1 تا 20 میلی‌ثانیه است.
  • محاسبه DEBOUNCE_THRESHOLD.
  • تغییرات در توان 2: اغلب برای سادگی در پیاده‌سازی شمارنده، از مقادیری استفاده می‌شود که توان 2 باشند (مثلاً 2102^{10}210 تا 2202^{20}220 سیکل کلاک).
  1. تولید پالس تک‌سیکلی: اکثر کاربردها به یک پالس کوتاه (فقط به اندازه یک سیکل کلاک) در لحظه تشخیص وضعیت پایدار نیاز دارند. این پالس می‌تواند برای فعال‌سازی منطق‌های دیگر استفاده شود.

  2. تست و شبیه‌سازی: شبیه‌سازی دقیق مدار Debouncing با اعمال پالس‌های ورودی با نویز (مانند آنچه از یک کلید مکانیکی انتظار می‌رود) بسیار مهم است تا از عملکرد صحیح آن اطمینان حاصل شود.

کلیدواژه ها : Debouncing-FPGA-Verilog-VHDL-طراحی دیجیتال-مدار Debounce-ارتعاش کلید-Button Bounce-ماشین حالت محدود-FSM-شمارنده-Counter-Based Debouncer-پالس تک‌سیکلی-Single Clock-Cycle Pulse-همگام‌سازی-Synchronization-Metastability-متاسیتلبیتی-منطق ترتیبی-Sequential Logic-طراحی سخت‌افزار-ASIC-Delay-تاخیر