UART یک پروتکل ارتباطی سریال، ناهمگام (Asynchronous) و نقطه به نقطه (Point-to-Point) است که به طور گسترده برای ارتباط بین میکروکنترلرها، FPGAها و سایر دستگاه‌های جانبی (مانند ماژول‌های GPS، بلوتوث، وای‌فای و حتی ترمینال‌های سریال کامپیوتر) استفاده می‌شود. واژه “ناهمگام” به این معنی است که نیازی به خط کلاک مشترک بین فرستنده و گیرنده نیست؛ در عوض، گیرنده کلاک خود را از لبه‌های سیگنال داده بازسازی می‌کند.

هدف از طراحی فرستنده UART: دریافت یک کلمه داده موازی (مثلاً یک بایت) و ارسال آن به صورت سریال، بیت به بیت، طبق پروتکل UART.

1. فرمت فریم (Frame Format) UART

یک فریم داده UART شامل اجزای زیر است:

  • بیت شروع (Start Bit): همیشه یک بیت ‘0’ (Low) است و نشان‌دهنده آغاز فریم داده است. این بیت به گیرنده کمک می‌کند تا آغاز ارتباط را تشخیص داده و کلاک داخلی خود را با فرستنده همگام‌سازی کند.
  • بیت‌های داده (Data Bits): معمولاً 5 تا 9 بیت داده هستند، اما 8 بیت رایج‌ترین حالت است. این بیت‌ها حاوی اطلاعات واقعی هستند که باید منتقل شوند. (معمولاً ابتدا کم‌ارزش‌ترین بیت (LSB) ارسال می‌شود).
  • بیت توازن (Parity Bit - اختیاری): برای تشخیص خطاهای ساده در انتقال داده استفاده می‌شود. می‌تواند زوجیت (Even Parity) یا فردیت (Odd Parity) داشته باشد.
  • Even Parity: تعداد 1های در بیت‌های داده + بیت توازن باید زوج باشد.
  • Odd Parity: تعداد 1های در بیت‌های داده + بیت توازن باید فرد باشد.
  • بیت توقف (Stop Bit): همیشه یک بیت ‘1’ (High) است و نشان‌دهنده پایان فریم داده است. می‌تواند 1، 1.5 یا 2 بیت توقف باشد، اما 1 بیت توقف رایج‌ترین حالت است.

ساختار کلی یک فریم UART (مثال 8N1: 8 بیت داده، بدون توازن، 1 بیت توقف):

[Start Bit (0)] [Data Bit 0] [Data Bit 1] ... [Data Bit 7] [Stop Bit (1)]

وضعیت Idle (استراحت): هنگامی که هیچ داده‌ای ارسال نمی‌شود، خط سریال در وضعیت High (‘1’) قرار دارد.

2. پارامترهای کلیدی UART

برای طراحی فرستنده UART، باید پارامترهای زیر را مشخص کنیم:

  • نرخ باود (Baud Rate): تعداد بیت‌های ارسالی در ثانیه (مثلاً 9600، 19200، 115200 باود). این نرخ، مدت زمان هر بیت را تعیین می‌کند.
  • تعداد بیت‌های داده: 5، 6، 7، 8 یا 9 بیت. (8 بیت رایج است).
  • نوع توازن (Parity): None (هیچ)، Even (زوج)، Odd (فرد).
  • تعداد بیت‌های توقف: 1، 1.5 یا 2 بیت. (1 بیت رایج است).

3. بلوک‌های سازنده فرستنده UART در FPGA

یک فرستنده UART معمولاً از سه بخش اصلی تشکیل شده است:

الف) ژنراتور نرخ باود (Baud Rate Generator)

  • هدف: تولید یک پالس فعال‌سازی (Enable Pulse) با فرکانسی برابر با نرخ باود مورد نظر. این پالس تعیین می‌کند که هر بیت داده دقیقاً چه زمانی باید بر روی خط سریال قرار گیرد و چه مدت باقی بماند.
  • پیاده‌سازی: با استفاده از یک شمارنده (Counter) که با کلاک سیستم (System Clock) کار می‌کند.
  • شمارنده از صفر شروع به شمارش می‌کند و هر بار که به مقدار مشخصی (که با تقسیم فرکانس کلاک سیستم بر نرخ باود به دست می‌آید) می‌رسد، یک پالس Enable تولید کرده و سپس ریست می‌شود تا شمارش را دوباره آغاز کند.
  • فرمول: Max_Count = (System_Clock_Frequency / Baud_Rate) - 1
  • به عنوان مثال، اگر کلاک سیستم 50MHz و نرخ باود 115200 باشد:

Max_Count = (50,000,000 / 115,200) - 1 ≈ 433 - 1 = 432

بنابراین، شمارنده از 0 تا 432 می‌شمارد و در هر بار رسیدن به 432، یک پالس “baud_tick” تولید می‌کند.

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

  • هدف: نگهداری و سریال‌سازی بیت‌های فریم UART.
  • پیاده‌سازی: یک رجیستر شیفت N بیتی (N = 1 + Data_Bits + Parity_Bit + Stop_Bits).
  • این رجیستر قابلیت بارگذاری موازی داده‌های ورودی (به همراه بیت‌های شروع و توقف و توازن) را دارد.
  • در هر پالس “baud_tick” تولید شده توسط ژنراتور نرخ باود، محتوای رجیستر به اندازه یک بیت به سمت خروجی سریال شیفت داده می‌شود.
  • کم‌ارزش‌ترین بیت (LSB) رجیستر، همان خروجی سریال uart_tx_out خواهد بود.

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

  • هدف: کنترل توالی ارسال بیت‌ها، بارگذاری داده‌ها و مدیریت وضعیت فرستنده. این FSM قلب فرستنده UART است.
  • حالت‌های معمول:
  1. IDLE: (حالت استراحت)
  • خط uart_tx_out در وضعیت ‘1’ (High) قرار دارد.
  • فرستنده منتظر سیگنال tx_start (شروع ارسال) از منطق بالادستی است.
  • هنگامی که tx_start فعال می‌شود، FSM به حالت START_BIT می‌رود.
  1. START_BIT: (ارسال بیت شروع)
  • FSM خط uart_tx_out را به ‘0’ (Low) می‌کشد.
  • منتظر یک پالس baud_tick می‌ماند.
  • پس از دریافت baud_tick، به حالت DATA_BITS می‌رود.
  1. DATA_BITS: (ارسال بیت‌های داده)
  • در این حالت، FSM بیت‌های داده را یکی پس از دیگری از رجیستر شیفت خارج می‌کند.
  • برای هر بیت داده، منتظر یک baud_tick می‌ماند و بیت فعلی را بر روی uart_tx_out قرار می‌دهد.
  • یک شمارنده بیت (مثلاً از 0 تا 7 برای 8 بیت داده) پیگیری می‌کند که چند بیت ارسال شده است.
  • پس از ارسال تمام بیت‌های داده، FSM به حالت PARITY_BIT (اگر توازن فعال باشد) یا STOP_BIT می‌رود.
  1. PARITY_BIT: (اختیاری - ارسال بیت توازن)
  • اگر توازن فعال باشد، FSM بیت توازن را بر اساس داده‌های ارسالی محاسبه و بر روی uart_tx_out قرار می‌دهد.
  • منتظر یک baud_tick می‌ماند.
  • پس از دریافت baud_tick، به حالت STOP_BIT می‌رود.
  1. STOP_BIT: (ارسال بیت توقف)
  • FSM خط uart_tx_out را به ‘1’ (High) می‌کشد.
  • منتظر یک یا چند پالس baud_tick (بسته به تعداد بیت توقف) می‌ماند.
  • پس از اتمام زمان بیت توقف، FSM به حالت IDLE بازمی‌گردد و سیگنال tx_busy (مشغول بودن فرستنده) را غیرفعال می‌کند.

4. سیگنال‌های ورودی/خروجی فرستنده UART (مفهومی)

  • ورودی‌ها:
  • clk: کلاک سیستم (مثلاً 50MHz).
  • reset: سیگنال ریست ناهمگام یا همگام.
  • tx_data_in: داده موازی N بیتی که باید ارسال شود.
  • tx_start: پالس فعال‌سازی (Pulse) برای شروع ارسال یک فریم جدید.
  • baud_rate_setting: (اختیاری) تنظیمات نرخ باود اگر قابل تغییر باشد.
  • خروجی‌ها:
  • uart_tx_out: خط خروجی سریال UART.
  • tx_busy: سیگنالی که نشان می‌دهد فرستنده در حال حاضر مشغول ارسال داده است (معمولاً High در حالت‌های غیر از IDLE).
  • tx_ready: سیگنالی که نشان می‌دهد فرستنده آماده دریافت داده جدید برای ارسال است (معمولاً High در حالت IDLE).

5. ملاحظات مهم

  • پایداری کلاک: دقت کلاک سیستم و ژنراتور نرخ باود برای اطمینان از صحت ارتباط سریال بسیار مهم است. هرگونه نوسان (Jitter) در کلاک می‌تواند باعث خطای ارتباط شود.
  • ریست (Reset): فرستنده باید به درستی ریست شود تا در حالت اولیه (IDLE و خط High) قرار گیرد.
  • فرستنده و گیرنده: طراحی فرستنده و گیرنده باید با پارامترهای یکسان (نرخ باود، بیت‌های داده، توازن، بیت‌های توقف) انجام شود تا ارتباط برقرار شود.
  • Buffer برای ارسال چندین بایت: در کاربردهای واقعی، معمولاً یک بافر FIFO (First-In, First-Out) قبل از فرستنده UART قرار داده می‌شود تا بتواند چندین بایت را به صورت پشت سر هم و بدون توقف ارسال کند.

با پیاده‌سازی این سه بخش (ژنراتور نرخ باود، رجیستر شیفت و FSM کنترل‌کننده)، می‌توان یک فرستنده UART کاملاً کارآمد را در FPGA طراحی کرد. این طرح پایه و اساس بسیاری از ماژول‌های ارتباطی سریال در سیستم‌های تعبیه‌شده (Embedded Systems) است.

کلیدواژه ها : UART، فرستنده UART، Serial Communication، FPGA، Asynchronous، Baud Rate، Start Bit، Data Bits، Parity Bit، Stop Bit، Frame Format، ژنراتور نرخ باود، Baud Rate Generator، شمارنده، Counter، رجیستر شیفت، Shift Register، ماشین حالت محدود، FSM، IDLE، LSB، TX_OUT، TX_START، TX_BUSY، FIFO.