UART یا Universal Asynchronous Receiver/Transmitter (فرستنده/گیرنده ناهمگام جهانی)، یک پروتکل ارتباط سریال بسیار رایج است که در سیستم‌های تعبیه‌شده (Embedded Systems) و بسیاری از کاربردهای دیگر برای تبادل داده بین دستگاه‌ها مورد استفاده قرار می‌گیرد. با توجه به انعطاف‌پذیری و قابلیت برنامه‌ریزی مجدد تراشه‌های FPGA (Field-Programmable Gate Array)، پیاده‌سازی یک گیرنده UART بر روی این بستر، راه‌حلی قدرتمند و سفارشی برای نیازهای ارتباط سریال فراهم می‌کند.

H2: UART چیست و چرا در FPGA استفاده می‌شود؟

UART وظیفه تبدیل داده‌های موازی به سریال برای ارسال و همچنین تبدیل داده‌های سریال دریافتی به موازی را بر عهده دارد. مزیت اصلی UART در سادگی آن است؛ تنها به دو خط ارتباطی (یکی برای ارسال، یکی برای دریافت) نیاز دارد و نیازی به ارسال سیگنال ساعت (کلاک) همراه با داده‌ها نیست. همین ویژگی “ناهمگام” بودن، در عین سادگی، چالش‌هایی را نیز برای همگام‌سازی گیرنده و فرستنده ایجاد می‌کند.

استفاده از FPGA برای پیاده‌سازی UART چندین مزیت کلیدی دارد:

  • انعطاف‌پذیری (Flexibility): می‌توانید پروتکل UART را دقیقاً مطابق با نیازهای خود سفارشی‌سازی کنید؛ از تغییر نرخ بیت (Baud Rate) گرفته تا تعداد بیت‌های داده، بیت‌های توقف و وجود بیت توازن (Parity Bit).
  • عملکرد موازی (Parallel Processing): FPGAها به دلیل معماری موازی خود، می‌توانند عملیات دریافت و پردازش داده‌ها را با سرعت بالا و به صورت همزمان انجام دهند.
  • یکپارچگی (Integration): می‌توانید گیرنده UART را به عنوان بخشی از یک سیستم پیچیده‌تر در FPGA خود طراحی کنید و از ارتباط مستقیم و بهینه با سایر ماژول‌های منطقی بهره‌مند شوید.
  • سفارشی‌سازی سخت‌افزاری (Hardware Customization): بر خلاف میکروکنترلرها که دارای UART سخت‌افزاری ثابت هستند، در FPGA می‌توانید پیاده‌سازی‌های بسیار بهینه و خاص منظوره برای شرایط خاص ایجاد کنید.

اصول کاری گیرنده UART

وظیفه اصلی گیرنده UART این است که جریان بیت‌های سریال را دریافت کرده، آن‌ها را با دقت در زمان صحیح نمونه‌برداری کند و در نهایت به یک بایت داده موازی تبدیل نماید. فرآیند دریافت داده در UART شامل مراحل و اجزای کلیدی زیر است:

  1. سیگنال بیکار (Idle State): خط سریال در حالت بیکار معمولاً در وضعیت منطقی ‘1’ قرار دارد.
  2. بیت شروع (Start Bit): ارسال داده با یک بیت ‘0’ (بیت شروع) آغاز می‌شود که نشان‌دهنده شروع یک فریم داده است. این تغییر از ‘1’ به ‘0’ به گیرنده هشدار می‌دهد که داده در حال ارسال است.
  3. بیت‌های داده (Data Bits): پس از بیت شروع، بیت‌های داده (معمولاً 5 تا 9 بیت) ارسال می‌شوند. این بیت‌ها می‌توانند با اولویت بیت کم‌ارزش‌تر (LSB) یا بیت پرارزش‌تر (MSB) ارسال شوند، که این موضوع باید بین فرستنده و گیرنده توافق شده باشد.
  4. بیت توازن (Parity Bit - اختیاری): برخی از پیاده‌سازی‌ها از یک بیت توازن (زوج یا فرد) برای تشخیص خطاهای ساده در انتقال داده استفاده می‌کنند.
  5. بیت‌های توقف (Stop Bits): پس از بیت‌های داده و بیت توازن (در صورت وجود)، یک یا دو بیت ‘1’ (بیت توقف) برای نشان دادن پایان فریم داده ارسال می‌شود. این بیت‌ها به گیرنده زمان می‌دهند تا خود را برای فریم بعدی آماده کند و همچنین به همگام‌سازی کمک می‌کنند.

چالش همگام‌سازی و راه‌حل آن: نمونه‌برداری چندگانه (Oversampling)

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

در این روش، ساعت سیستم (که بسیار سریع‌تر از نرخ بیت UART است) برای نمونه‌برداری از خط سریال چندین بار در طول هر بازه بیت استفاده می‌شود. رایج‌ترین نرخ نمونه‌برداری، 16 برابر نرخ بیت (16x Baud Rate) است. به این ترتیب:

  • هنگام تشخیص بیت شروع، یک شمارنده فعال می‌شود.
  • با شمارش به تعداد مشخصی (مثلاً 7 یا 8 نمونه از 16 نمونه در هر بیت)، گیرنده فرض می‌کند که در میانه بیت شروع قرار دارد و همگام‌سازی اولیه انجام می‌شود.
  • سپس برای هر بیت داده بعدی، گیرنده منتظر می‌ماند تا شمارنده به میانه بازه بیت برسد (مثلاً 15 یا 16 نمونه پس از شروع نمونه‌برداری بیت قبلی) و سپس وضعیت خط را نمونه‌برداری می‌کند.
  • با این روش، حتی اگر کمی اختلاف در سرعت ساعت بین فرستنده و گیرنده وجود داشته باشد، گیرنده می‌تواند بیت‌های داده را با دقت بالایی تشخیص دهد.

مراحل کلی طراحی و پیاده‌سازی گیرنده UART در FPGA

طراحی یک گیرنده UART در FPGA معمولاً شامل مراحل زیر است:

  1. تعریف مشخصات (Specification): تعیین نرخ بیت، تعداد بیت‌های داده، بیت‌های توقف، وجود یا عدم وجود بیت توازن، و منطق ارسال (LSB/MSB).
  2. معماری سخت‌افزار (Hardware Architecture): طراحی بلوک‌های عملکردی گیرنده، شامل:
  • واحد تشخیص بیت شروع (Start Bit Detector): برای تشخیص انتقال از ‘1’ (حالت بیکار) به ‘0’.
  • واحد تولید ساعت نمونه‌برداری (Baud Rate Generator/Sampler): این واحد با استفاده از ساعت اصلی FPGA و تقسیم‌کننده‌های فرکانس، سیگنال‌های نمونه‌برداری با فرکانس 16 برابر نرخ بیت را تولید می‌کند.
  • شیفت رجیستر (Shift Register): برای جمع‌آوری بیت‌های سریال دریافتی.
  • ماشین حالت (State Machine): یک ماشین حالت محدود (FSM) که منطق کنترل فرآیند دریافت (تشخیص بیت شروع، نمونه‌برداری داده، تشخیص بیت توقف) را مدیریت می‌کند.
  • بافر خروجی (Output Buffer): برای نگهداری بایت داده کامل و موازی تا زمانی که توسط سایر بخش‌های FPGA خوانده شود.
  1. کدنویسی HDL (Hardware Description Language): پیاده‌سازی طراحی با استفاده از زبان‌های توصیف سخت‌افزاری مانند VHDL یا Verilog.
  2. شبیه‌سازی (Simulation): استفاده از ابزارهای شبیه‌سازی برای تأیید صحت عملکرد گیرنده در سناریوهای مختلف، از جمله ارسال داده‌های مختلف، تغییر نرخ بیت، و بررسی عملکرد در شرایط خطا.
  3. سنتز و پیاده‌سازی (Synthesis & Implementation): تبدیل کد HDL به یک نت‌لیست (Netlist) و نگاشت آن بر روی منابع منطقی FPGA.
  4. تست روی سخت‌افزار (Hardware Testing): بارگذاری طراحی بر روی FPGA و تست عملکرد آن با استفاده از یک فرستنده UART خارجی (مثلاً پورت سریال یک رایانه).

نتیجه‌گیری

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

کلیدواژه ها : UART-FPGA-گیرنده UART-طراحی FPGA-پروتکل سریال-ارتباط ناهمگام-Baud Rate-بیت شروع-بیت توقف-بیت داده-نمونه‌برداری چندگانه-Oversampling-ماشین حالت-VHDL-Verilog-Embedded Systems-پردازش موازی-Hardware Description Language-Serial Communication-Asynchronous Communication-Digital Design-Field-Programmable Gate Array-Data Reception-Synchronization-Parity Bit-Shift Register-State Machine