حافظه دسترسی تصادفی تک پورتی (Single Port Random Access Memory یا SPRAM) یک نوع حافظه داخلی پرسرعت است که به طور گسترده در معماری تراشه‌های FPGA به کار می‌رود. ویژگی بارز این حافظه، داشتن تنها یک مجموعه از پورت‌های ورودی/خروجی است (شامل یک پورت آدرس‌دهی، یک پورت ورودی داده و یک پورت خروجی داده). این محدودیت به این معنی است که در هر سیکل ساعت، SPRAM می‌تواند فقط یک عملیات (یا خواندن یا نوشتن) را در یک آدرس مشخص انجام دهد.

در تراشه‌های FPGA، این نوع حافظه به دو صورت اصلی پیاده‌سازی می‌شود:

  1. حافظه بلوکی (Block RAM یا BRAM): این‌ها بلوک‌های سخت‌افزاری اختصاصی و از پیش تعریف‌شده‌ای هستند که در ساختار FPGA تعبیه شده‌اند. BRAMها ظرفیت ذخیره‌سازی بالایی دارند و برای بافرها، جداول lookup و کش‌های بزرگ ایده‌آل هستند. آن‌ها قابلیت پیکربندی انعطاف‌پذیری از جمله در حالت Single Port را ارائه می‌دهند.
  2. حافظه توزیع‌شده (Distributed RAM): این نوع حافظه با استفاده از عناصر منطقی عمومی FPGA، به ویژه جداول جستجو (Look-Up Tables یا LUTs)، پیاده‌سازی می‌شود. Distributed RAM ظرفیت کمتری دارد اما انعطاف‌پذیری بیشتری در قرارگیری فیزیکی ارائه می‌دهد و برای ذخیره‌سازی‌های کوچک و محلی مناسب است.

اهمیت SPRAM در طراحی FPGA

SPRAM به دلیل سرعت بالا، همگام بودن کامل با کلاک سیستم (Synchronous Operation) و توانایی ادغام یکپارچه با سایر ماژول‌های منطقی، جزئی حیاتی در طراحی‌های FPGA محسوب می‌شود. از کاربردهای رایج آن می‌توان به موارد زیر اشاره کرد:

  • بافرهای FIFO (First-In, First-Out): برای همگام‌سازی جریان داده بین ماژول‌هایی با نرخ‌های داده متفاوت.
  • کش‌ها (Caches): برای ذخیره‌سازی موقت داده‌های پرکاربرد جهت دسترسی سریع‌تر.
  • جداول Lookup (LUTs): برای پیاده‌سازی توابع پیچیده یا نگاشت‌های داده.
  • ذخیره‌سازی پارامترها و پیکربندی‌ها: نگهداری تنظیمات یا حالت‌های سیستم.

معماری و سیگنال‌های کنترلی SPRAM

تمامی عملیات خواندن و نوشتن در SPRAM در FPGA به صورت همگام (Synchronous) با لبه فعال سیگنال ساعت انجام می‌شوند. سیگنال‌های کنترلی اصلی برای مدیریت این حافظه عبارتند از:

  • CLK (ساعت): سیگنال اصلی که تمام عملیات‌ها را همگام‌سازی می‌کند (معمولاً با لبه بالارونده).
  • ADDR (آدرس): یک سیگنال چند بیتی که مکان خاصی در حافظه را برای دسترسی (خواندن یا نوشتن) مشخص می‌کند.
  • WE (Write Enable): سیگنال فعال‌سازی نوشتن. وقتی فعال باشد (معمولاً ‘1’)، عملیات نوشتن انجام می‌شود؛ وقتی غیرفعال باشد (معمولاً ‘0’)، عملیات خواندن انجام می‌گردد.
  • DIN (Data In): پورت ورودی داده که داده‌ای را که قرار است در حافظه نوشته شود، دریافت می‌کند.
  • DOUT (Data Out): پورت خروجی داده که داده‌های خوانده شده از حافظه را فراهم می‌کند.

عملیات نوشتن (Write Operation) در SPRAM

عملیات نوشتن در SPRAM نسبتاً ساده و مستقیم است. برای ذخیره یک داده جدید در یک آدرس مشخص، مراحل زیر باید پیش از رسیدن لبه فعال ساعت روی ورودی‌های SPRAM تنظیم شوند:

  1. تنظیم آدرس (ADDR): آدرس مکانی که داده باید در آن ذخیره شود، روی خطوط ADDR اعمال می‌شود.
  2. تنظیم داده ورودی (DIN): داده‌ای که قرار است نوشته شود، روی خطوط DIN اعمال می‌گردد.
  3. فعال‌سازی نوشتن (WE): سیگنال WE باید فعال شود (مثلاً منطق ‘1’) تا ماژول حافظه بداند که باید عملیات نوشتن را انجام دهد.

رفتار در لبه ساعت:

در لحظه رسیدن لبه فعال ساعت (مانند لبه بالارونده)، داده اعمال شده روی DIN به صورت همگام در آدرس مشخص شده توسط ADDR در داخل حافظه ذخیره می‌شود.

نکته: در طول عملیات نوشتن، خروجی DOUT معمولاً منعکس‌کننده داده نوشته شده در همان سیکل نیست. DOUT ممکن است داده‌ای که در سیکل قبلی خوانده شده را حفظ کند یا به حالت نامشخصی (مانند صفر) برود، زیرا عملیات نوشتن و خواندن به طور همزمان از یک پورت در یک SPRAM امکان‌پذیر نیست.

عملیات خواندن (Read Operation) در SPRAM

عملیات خواندن در SPRAM، به ویژه در حافظه‌های بلوکی (BRAM) FPGA، یک ویژگی مهم دارد: تأخیر یک سیکل ساعت (One-Cycle Latency). این تأخیر ذاتی است و به دلیل استفاده از رجیسترهای خروجی برای اطمینان از عملکرد با فرکانس بالا و رعایت محدودیت‌های زمان‌بندی در FPGA است.

برای خواندن داده از یک آدرس مشخص، مراحل زیر اجرا می‌شوند:

  1. غیرفعال‌سازی نوشتن (WE): سیگنال WE باید غیرفعال باشد (مثلاً منطق ‘0’) تا عملیات خواندن فعال شود.
  2. اعمال آدرس (ADDR): آدرس مکانی که قرار است از آن خوانده شود، روی خطوط ADDR اعمال می‌گردد.

رفتار در لبه‌های ساعت:

  • لبه ساعت اول: در این لبه، آدرس اعمال شده (ADDR) به صورت همگام وارد ماژول حافظه شده و فرآیند بازیابی داده از آن آدرس آغاز می‌شود. در این لحظه، خروجی DOUT همچنان داده‌ای را که در سیکل ساعت قبلی خوانده شده بود، نمایش می‌دهد.
  • لبه ساعت دوم: داده‌ای که در سیکل ساعت قبلی از آدرس درخواست شده بازیابی شده بود، از طریق رجیستر خروجی عبور کرده و روی خطوط DOUT در دسترس قرار می‌گیرد.

توضیح مفهومی تأخیر:

این تأخیر یک سیکلی به این معناست که برنامه‌نویس یا طراح سخت‌افزار باید در نظر داشته باشد که داده‌ای که از DOUT خوانده می‌شود، همیشه مربوط به آدرسی است که در سیکل ساعت قبلی درخواست شده بود. این یک نکته حیاتی در طراحی منطق کنترلی (مانند ماشین‌های حالت) برای استفاده صحیح از داده‌های خوانده شده از SPRAM است.

کلیدواژه ها : Single Port RAM-SPRAM-FPGA Memory-Block RAM-BRAM-Distributed RAM-Register Read-Write Enable-Read Operation-Write Operation-Clocked Memory-Synchronous Memory-حافظه FPGA-حافظه تک پورتی-عملیات خواندن-عملیات نوشتن-حافظه همگام-BRAM در FPGA-تأخیر خواندن-One-Cycle Latency-CLK-ADDR-WE-DIN-DOUT-HDL-VHDL-Verilog-FPGA Design