پیاده‌سازی یک گیرنده UART بر روی FPGA، به دلیل ماهیت ناهمگام پروتکل، نیازمند طراحی دقیق و هوشمندانه برای همگام‌سازی و نمونه‌برداری صحیح بیت‌های ورودی است. چالش اصلی، عدم وجود سیگنال ساعت مشترک بین فرستنده و گیرنده است؛ بنابراین، گیرنده باید با استفاده از ساعت داخلی خود و نرخ بیت توافق شده، زمان‌بندی بیت‌های دریافتی را تخمین بزند.

در ادامه به جزئیات طراحی یک گیرنده UART در FPGA می‌پردازیم:

1. مکانیزم نمونه‌برداری چندگانه (Oversampling)

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

  • نرخ نمونه‌برداری: رایج‌ترین نرخ نمونه‌برداری، ۱۶ برابر نرخ بیت (16x Baud Rate) است. به این معنی که اگر نرخ بیت ۹۶۰۰ باشد، گیرنده در هر ثانیه ۹۶۰۰ × ۱۶ = ۱۵۳,۶۰۰ بار خط سریال را نمونه‌برداری می‌کند.
  • تشخیص مرکز بیت: با این نرخ نمونه‌برداری بالا، گیرنده می‌تواند به دقت مرکز هر بیت را تشخیص دهد. برای مثال، اگر از نرخ ۱۶x استفاده شود، بیت شروع (Start Bit) در نمونه‌های ۸ و ۹ (تقریباً در مرکز بازه زمانی بیت شروع) تأیید می‌شود و سپس برای هر بیت داده نیز، در نمونه‌های ۸ و ۹ از هر دوره ۱۶ نمونه‌ای (تقریباً در مرکز بازه زمانی آن بیت) نمونه‌برداری اصلی انجام می‌شود. این کار باعث می‌شود که گیرنده حتی با وجود نوسانات کوچک در زمان‌بندی (Clock Skew) بین فرستنده و گیرنده، داده‌ها را به درستی بخواند.

2. بلوک‌های عملکردی گیرنده UART

یک گیرنده UART در FPGA معمولاً از چندین بلوک عملکردی تشکیل شده است که با همکاری یکدیگر وظیفه دریافت و پردازش داده‌ها را بر عهده دارند:

الف) واحد تولید پالس نمونه‌برداری (Baud Rate Generator / Sample Clock Generator)

این واحد مسئول تولید پالس‌هایی با فرکانس ۱۶ برابر نرخ بیت مورد نظر است. این کار با تقسیم فرکانس ساعت اصلی (System Clock) FPGA توسط یک شمارنده مناسب انجام می‌شود. برای مثال، اگر ساعت سیستم ۱۰۰ مگاهرتز و نرخ بیت ۹۶۰۰ باشد، فرکانس نمونه‌برداری ۱۵۳.۶ کیلوهرتز (۹۶۰۰ × ۱۶) خواهد بود. شمارنده باید طوری تنظیم شود که هر بار به عدد (۱۰۰,۰۰۰,۰۰۰ / ۱۵۳,۶۰۰) = ۶۵۱.۰۴۷ برسد، یک پالس نمونه‌برداری تولید کند. (این عدد باید به نزدیک‌ترین عدد صحیح رند شود.)

ب) واحد تشخیص بیت شروع (Start Bit Detector)

این ماژول وظیفه پایش مداوم خط ورودی Rx را دارد. هنگامی که خط از حالت منطقی ‘1’ (بیکار) به ‘0’ تغییر می‌کند، یک سیگنال فعال‌سازی (Enable) را به سایر بخش‌های گیرنده ارسال می‌کند تا فرآیند دریافت آغاز شود. برای جلوگیری از نویز، این تغییر باید برای چند دوره ساعت (مثلاً ۲ یا ۳ نمونه) تأیید شود.

پ) شیفت رجیستر (Shift Register)

این رجیستر برای جمع‌آوری بیت‌های داده ورودی به صورت سریال و ذخیره آن‌ها استفاده می‌شود. هر بار که یک بیت داده توسط واحد نمونه‌برداری معتبر تشخیص داده می‌شود، به داخل این رجیستر شیفت داده می‌شود تا در نهایت یک بایت کامل داده تشکیل شود.

ت) ماشین حالت محدود (Finite State Machine - FSM)

قلب کنترلی گیرنده UART، یک ماشین حالت است که منطق کلی فرآیند دریافت را مدیریت می‌کند. این FSM معمولاً شامل حالت‌های زیر است:

  • حالت بیکار (IDLE): گیرنده در انتظار تشخیص بیت شروع است.
  • حالت تشخیص بیت شروع (START_BIT_DETECT): پس از تشخیص تغییر از ‘1’ به ‘0’، FSM به این حالت می‌رود و شروع به شمارش نمونه‌ها می‌کند تا به مرکز بیت شروع برسد.
  • حالت دریافت داده (RECEIVING_DATA): پس از همگام‌سازی با مرکز بیت شروع، FSM شروع به نمونه‌برداری بیت‌های داده می‌کند و آن‌ها را به شیفت رجیستر ارسال می‌کند. یک شمارنده بیت (Bit Counter) تعداد بیت‌های دریافتی را کنترل می‌کند.
  • حالت دریافت بیت توقف (STOP_BIT_DETECT): پس از دریافت تمام بیت‌های داده (و بیت توازن، در صورت وجود)، FSM منتظر بیت‌های توقف (‘1’) می‌ماند. اگر بیت توقف به درستی دریافت شود، داده معتبر شناخته شده و به بافر خروجی منتقل می‌شود.
  • حالت خطا (ERROR - اختیاری): در صورت تشخیص خطاهایی مانند Frame Error (عدم دریافت بیت توقف) یا Parity Error (در صورت استفاده از بیت توازن).

ث) بافر خروجی و پرچم آماده بودن داده (Output Buffer & Data Ready Flag)

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

3. پیاده‌سازی با HDL (VHDL/Verilog)

تمام این بلوک‌های عملکردی با استفاده از زبان‌های توصیف سخت‌افزاری مانند VHDL یا Verilog کدنویسی می‌شوند. هر بلوک به عنوان یک ماژول (Module) یا موجودیت (Entity) جداگانه طراحی شده و سپس با یکدیگر یکپارچه می‌شوند تا گیرنده UART کامل را تشکیل دهند.

مثالی از جریان کلی در FSM:

  1. IDLE: در این حالت، گیرنده ورودی Rx را پایش می‌کند. شمارنده نمونه‌برداری در این حالت صفر است.
  2. اگر Rx از ‘1’ به ‘0’ برود:
  • FSM به حالت START_BIT_DETECT تغییر می‌کند.
  • شمارنده نمونه‌برداری آغاز می‌شود.
  1. START_BIT_DETECT:
  • FSM منتظر می‌ماند تا شمارنده نمونه‌برداری به نصف دوره نمونه‌برداری (مثلاً ۸ از ۱۶) برسد.
  • در این نقطه، Rx را دوباره بررسی می‌کند تا مطمئن شود که هنوز ‘0’ است (تأیید بیت شروع).
  • اگر ‘0’ بود، FSM به حالت RECEIVING_DATA می‌رود و شمارنده بیت را آغاز می‌کند.
  • اگر ‘1’ بود (مثلاً نویز)، FSM به حالت IDLE برمی‌گردد.
  1. RECEIVING_DATA:
  • برای هر بیت داده (مثلاً ۸ بیت)، FSM منتظر می‌ماند تا شمارنده نمونه‌برداری به مرکز هر دوره (مثلاً ۸ از ۱۶) برسد.
  • در این نقطه، مقدار Rx خوانده شده و به شیفت رجیستر اضافه می‌شود.
  • پس از دریافت تمام بیت‌های داده، FSM به حالت STOP_BIT_DETECT می‌رود.
  1. STOP_BIT_DETECT:
  • FSM منتظر می‌ماند تا Rx در مرکز دوره بیت توقف ‘1’ باشد.
  • اگر ‘1’ بود:
  • داده در بافر خروجی قرار می‌گیرد و پرچم data_ready فعال می‌شود.
  • FSM به حالت IDLE بازمی‌گردد.
  • اگر ‘0’ بود (Frame Error):
  • می‌تواند پرچم خطایی را فعال کند.
  • FSM به حالت IDLE بازمی‌گردد.

با این معماری و منطق کنترلی، یک گیرنده UART پایدار و کارآمد بر روی FPGA قابل پیاده‌سازی است که می‌تواند به درستی داده‌های سریال را دریافت و به داده‌های موازی تبدیل کند.

کلیدواژه ها : طراحی FPGA-گیرنده UART-UART Receiver-FPGA Design-Oversampling-نمونه‌برداری چندگانه-ماشین حالت-Finite State Machine-FSM-Baud Rate Generator-Start Bit Detector-Shift Register-بافر خروجی-Data Ready Flag-VHDL-Verilog-HDL-Asynchronous Communication-Serial Data Reception-Clock Synchronization-Digital Logic-System-on-Chip-سخت افزار دیجیتال-طراحی منطقی-همگام سازی-بیت کلاک-RX Pin