سلام!

امروزه حافظه‌های MicoroSD به بخش جدایی ناپذیری از دستگاههای دیجیتال مبدل شده‌اند. این حافظه ها به دلیل ابعاد کوچک و ظرفیتهای بالا به پرطرفدارترین راه‌حل برای ذخیره‌ی دائمی اطلاعات در دستگاههای قابل حمل مبدل شده اند. اما شاید بتوان گفت در این بین FPGA ها به دلیل عدم برخورداری از حافظه‌ی غیرفرار، بیش از دیگران نیازمند این حافظه‌ها باشند. بنابراین در این پست قصد دارم تا شما را با نحوه‌ی ارتباط FPGA با حافظه‌ی MicroSD آشنا کنم.

مقدمه

برای خواندن و نوشتن روی حافظه MicroSD دو پروتکل معروف وجود دارند:

  • SD-SPI
  • SDIO

پروتکل SD-SPI نسبت به SDIO ساده‌تر است، اما در عوض سرعت کمتری دارد. ما نیز در این پروژه از این پروتکل برای ارتباط با حافظه SD استفاده کرده‌ایم. به منظور آشنایی بیشتر با این پروتکل و جزئیات آن توصیه می‌کنم قبل از هر چیز نگاهی به این نوشته‌ی محبوب داشته باشید:

http://elm-chan.org/docs/mmc/mmc_e.html

مطلب فوق بخشی از وبسایت آقای Chang است که کتابخانه‌ی معروفی برای ارتباط با حافظه‌ی SD فراهم کرده و در اختیار عموم قرار داده است.  این کتابخانه که به زبان C نوشته شده است دارای ساختاری ماژولار است که با تغییرات مختصری قابیت port شدن بر روی اکثر پلتفرم های نرم افزاری را داراست.  دقیقا به دلیل ماهیت نرم افزاری این کتابخانه، برای پورت کردن آن روی FPGA نیاز به یک SoftCore مانند میکروبلیز داریم که قابلیت اجرای کدهای C را داشته باشد. ویژگی بارز این کتابخانه پشتیبانی از فایل سیستم FAT است که این امکان را فراهم می‌آورد که شما بتوانید فایل‌ها و دایرکتوری‌های استانداری ایجاد کنید که روی هر دستگاهی که از فرمت فایل سیستم FAT پشتیبانی کند (مانند سیستم عامل ویندوز) قابل خواندن باشد.

گام اول: ایجاد یک Spi Core با پشتیبانی از کلاک Dynamic

در پروتکل SD-SPI الزامی وجود دارد که فرکانس کلاک اولیه برای راه‌اندازی و initilize کردن کارت SD بین ۱۰۰ تا ۴۰۰ کیلوهرتز باشد، اما پس از اینکه فاز initialization به اتمام رسید، فرکانس تا محدوده‌ی ۲۰ تا ۲۵ مگاهرتز نیز میتواند بالا رود. بنابراین برای داشتن حداکثر performance نیاز به یک SPI Core با کلاک داینامیک (قابل تغییر در حین کار) داریم. متاسفانه چنین Core ی در مجموعه‌ی pcore های Microblaze وجود ندارد و ما ناگزیر به نوشتن Core ی مطابق نیاز خود هستیم. این کار توسط دوست عزیزمان آقای چنگانی (که البته هیچ نسبتی هم با آقای Chang ندارند!) انجام شده است. این Core با نام Axi_spi در پنل ipcatalog قسمت USER قابل مشاهده است. (توجه داشته باشید که یک Core دیگر دقیقا با همین اسم در این پنجره به چشم میخورد که مربوط به خود Xilinx است که ویژگی dynamic clock را ندارد و لذا برای کاربرد مورد نظر ما مناسب نیست).


این Core دارای اینترفیس Axi بوده و به سادگی قابل اتصال به Microblaze می‌باشد. لازم به ذکر است سورس این Core بصورت رایگان فعلا تنها در اختیار خریداران برد پازج-۱ قرار داده می‌شود و انشاءالله در آینده در دسترس عموم قرار خواهد گرفت.

 

گام دوم: ویرایش کتابخانه chang

در گام بعدی لازم است مجموعه توابع ارتباط  SPI موجود در کتابخانه‌ی Chang با توجه به ساختار SPI Core ی که طراحی کرده‌ایم بازنویسی شوند. خوشبختانه به دلیل ساختار ماژولار کتابخانه‌ی Chang انجام این کار چالش خاصی در پی نداشت.

گام سوم: اجرای عملی 

به قسمت هیجان‌انگیز کار یعنی اجرای آن بصورت عملی بر روی برد پازج-۱ می‌رسیم! برای این کار علاوه بر برد پازج-۱ به یک بال حافظه‌ی MicroSD و یک حافظه‌ی MicroSD نیاز داریم. بعلاوه به دلیل اینکه مبدل usb->serial روی برد در محیط Xilinx SDK عملکرد قابل اطمینانی ندارد، برای مشاهده‌ی خروجی برنامه روی کنسول سریال، نیاز به یک مبدل USB->Serial جداگانه داریم که نمونه‌های متنوعی از آن در بازار وجود دارد.

سورس پروژه از اینجا قابل دانلود است (دانلود)

در کلیپ ویدئویی زیر نحوه‌ی اجرای این پروژه بصورت عملی روی برد پازج-۱ توضیح داده شده است:

در پایان امیدوارم این آموزش برایتان مفید بوده باشد. چنانچه سوال یا نظری در رابطه با این مطلب دارید در قسمت نظرات همین مطلب درج نمایید تا در اولین فرصت پاسخ داده شود. ضمنا چنانچه این مطلب برایتان مفید بوده، خواهش میکنم آن را با سایر دوستانتان به اشتراک بگذارید.