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

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

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

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

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

  • بافرهای FIFO (صف‌های ورودی/خروجی)
  • ذخیره‌سازی پارامترهای پیکربندی
  • حافظه‌های کش (Cache) برای واحدهای پردازشی
  • تبدیل داده‌های سریال به موازی یا برعکس (در بافرینگ)

استفاده می‌شود.

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

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

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

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

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

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

نتیجه در لبه ساعت:

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

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

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

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

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

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

نتیجه در لبه ساعت:

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

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

این تأخیر یک سیکلی به این معنی است که طراح باید توجه داشته باشد که داده‌ای که از حافظه خوانده می‌شود، همیشه مربوط به آدرسی است که در سیکل ساعت قبل درخواست شده بود. این رفتار یک ملاحظه طراحی حیاتی است و طراح باید در منطق FSM خود، این تأخیر را در نظر بگیرد تا داده‌های خوانده شده را در زمان مناسب استفاده کند.

کلیدواژه ها : 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