#BLOCK_RAM
#DISTRIBUTED_RAM
✅ مفهوم حافظه در تراشه های FPGA و کاربردهای آن
✳️ مقاله کوتاهی که در ادامه خدمتتان ارائه می شود، حاصل مطالعات و تجربیات شخصی خودم است و بر اساس اطلاعاتی که شرکت Xilinx برای تراشه هایش ارائه کرده، تدوین شده است. این مقاله به هیچ وجه کپی برداری نیست و برای اولین بار در این کانال منتشر می شود. البته واضح است که این مطلب کوتاه تنها بخشی از اطلاعات موجود درباره حافظه ها و نحوه بکارگیری آن ها را بیان می کند. ما به صورت مدوام این مقاله را بروز رسانی می کنیم و محتویات پیشرفته و کاربردی تری به آن اضافه می کنیم. در ادامه می توانید اولین بخش از این مقاله را مطالعه بفرمایید.
اما پیش از شروع مقاله لازم می دانم این مطلب را یادآوری کنم که لازمه یک طراحی خوب، داشتن شناخت کافی از منابع سخت افزاری درون تراشه FPGA است، که البته کافی نیست، اما اصل اول است. 👇👇👇
@Hexalinx
#DISTRIBUTED_RAM
✅ مفهوم حافظه در تراشه های FPGA و کاربردهای آن
✳️ مقاله کوتاهی که در ادامه خدمتتان ارائه می شود، حاصل مطالعات و تجربیات شخصی خودم است و بر اساس اطلاعاتی که شرکت Xilinx برای تراشه هایش ارائه کرده، تدوین شده است. این مقاله به هیچ وجه کپی برداری نیست و برای اولین بار در این کانال منتشر می شود. البته واضح است که این مطلب کوتاه تنها بخشی از اطلاعات موجود درباره حافظه ها و نحوه بکارگیری آن ها را بیان می کند. ما به صورت مدوام این مقاله را بروز رسانی می کنیم و محتویات پیشرفته و کاربردی تری به آن اضافه می کنیم. در ادامه می توانید اولین بخش از این مقاله را مطالعه بفرمایید.
اما پیش از شروع مقاله لازم می دانم این مطلب را یادآوری کنم که لازمه یک طراحی خوب، داشتن شناخت کافی از منابع سخت افزاری درون تراشه FPGA است، که البته کافی نیست، اما اصل اول است. 👇👇👇
@Hexalinx
#Essentials
🔖 حافظه ها درون FPGA به دو دسته تقسیم می شوند
✳️ حافظه های بلوکی یا #BLOCK_RAM
✳️ حافظه های توزیع شده یا #DISTRIBUTED_RAM
حافظه های بلوکی یکسری منابع اختصاصی سخت افزاری هستند و به صورت بلوک هایی با ظرفیت ذخیره سازی چند ده کیلوبیت روی تراشه های FPGA قابل فراخوانی هستد. ظرفیت هر هر کدام از بلوک های حافظه در تراشه های سری 7 ، 36 کیلوبیت است که البته به صورت بلوک های حافظه 18 کیلو بیتی نیز قابل استفاده هستند. با توجه به سری ساخت FPGA و نوع آن بلوک های حافظه ممکن است ظرفیت پایین تری داشته باشند، به عنوان مثال برای تراشه های Spartan 6 ظرفیت ذخیره سازی یک بلوک حافظه 18 کیلوبیت است و در صورت نیاز می تواند به صورت بلوک 9 کیلوبیتی نیز استفاده شود.
این که چه تعداد از این بلوک های حافظه در هر FPGA وجود دارد، بستگی به نوع FPGA دارد به عنوان مثال کوچکترین تراشه FPGA سری 7 یعنی تراشه XC7S6 از خانواده Spartan 7 تنها 5 بلوک حافظه 36 کیلوبیتی دارد در حالی تراشه های قدرتمند Virtex 7 می توانند تا 1880 بلوک حافظه داشته باشند، یعنی ظرفیت ذخیره سازی حدود 68 مگابیت !!! تعداد بلوک های حافظه برای تراشه های خانواده Spartan 6 بین 12 تا 268 بلوک 16 کیلوبیتی متغیر است.
زمانی که هر کدام از این بلوک های حافظه توسط طراح فراخوانی شوند، فارغ از اینکه چه مقدار اطلاعات قرار است در آنها ذخیره شود، کل فضای ذخیره سازی آن بلوک مورد استفاده قرار می گیرد، به عنوان مثال فرض کنید قرار است 128 کلمه 16 بیتی را درون یک حافظه بلوکی روی یکی از تراشه های Spartan 6 پیاده سازی کنیم. یعنی 2048 بیت یا 2 کیلو بیت، در صورت استفاده از یک حافظه 9 کیلوبیتی درون تراشه واضح است که 7 کیلوبیت آن بدون استفاده باقی می ماند و این یک اشکال در طراحی است. اجازه بدهید بحث در رابطه با حافظه های بلوکی را در همینجا متوقف کنیم و کمی به حافظه های توزیع شده بپردازیم.
برخلاف حافظه های بلوکی حافظه های توزیع شده، منابع اختصاصی سخت افزاری نیستند، و با استفاده از LUT ها ساخته می شوند و همانطور که از نامشان می توان تشخیص داد، می توانند در هر جایی از تراشه پیاده سازی شوند. این حافظه ها قابلیت ذخیره سازی تعداد محدودی بیت دارند و در مواردی که نیاز به ذخیره سازی حجم کمی از داده ها وجود داشته باشد، مورد استفاده قرار می گیرند، ظرفیت ذخیره سازی این حافظه ها ثابت نیست و می تواند کاملا سفارشی شده باشند، برای تراشه XC7S6 که پیشتر به عنوان کوچکترین تراشه خانواده Spartan 7 معرفی شد، کل ظرفیت حافظه های توزیع شده برابر با 70 کیلو بیت است. این عدد برای بزرگترین تراشه خانواده Virtex 7 حدود 21 مگابیت است.
در حالت کلی LUT ها برای انجام روابط منطقی بکار گرفته می شوند اما LUT های درون اسلایس های کامل #SLICEM که از قبل آنها را می شناسیم، می توانند به صورت حافظه پیکره بندی شوند، هر LUT در تراشه های سری 7 قابلیت ذخیره سازی حداکثر 64 بیت داده را دارد و با اتصال آبشاری LUT های درون یک اسلایس امکان افزایش این ظرفیت تا 256 بیت نیز وجود دارد.
البته با استفاده از چندین اسلایس و بخشی از منایع دیگر FPGA امکان افزایش ظرفیت حافظه های توزیع شده وجود دارد و به عنوان مثال با استفاده از 16 اسلایس می توان یک حافظه 16 بیتی با عمق ذخیره سازی 64 کلمه تولید کرد یعنی یک حافظه 1 کیلوبیتی.
❗️ حالا سوال اینجاست؟ برای طراحی از کدام حافظه استفاده کنیم، یا سوال مهمتر اینکه چگونه این حافظه ها را در کدهای خودمون فراخوانی کنیم و چگونه پیکره بندی آن ها را تنظیم کنیم.
پاسخ به این سوال بسیار ساده است، فقط باید درست کد نویسی انجام دهیم، ابزار سنتز به صورت اتوماتیک حافظه ها را به منابع درون تراشه نگاشت می کند. یعنی ابزار سنتز با توجه به ظرفیت حافظه بهترین جایگاه برای پیاده سازی را انتخاب می کند. می توان این مساله را با چند مثال توضیح داد اما قبل از ارائه مثال بهتر است با پیکره بندی های مختلف حافظه ها نیز آشنا بشویم.
✳️ حافظه های بلوکی و حافظه های توزیع شده می توانند به اشکال مختلفی پیکره بندی شوند. اگر علاقه مندید با آن ها آشنا بشوید، به شما توصیه می کنم مقاله بعدی ما در رابطه با حافظه ها که چند روز دیگر منتشر می شود را مطالعه کنید.
@Hexalinx
🔖 حافظه ها درون FPGA به دو دسته تقسیم می شوند
✳️ حافظه های بلوکی یا #BLOCK_RAM
✳️ حافظه های توزیع شده یا #DISTRIBUTED_RAM
حافظه های بلوکی یکسری منابع اختصاصی سخت افزاری هستند و به صورت بلوک هایی با ظرفیت ذخیره سازی چند ده کیلوبیت روی تراشه های FPGA قابل فراخوانی هستد. ظرفیت هر هر کدام از بلوک های حافظه در تراشه های سری 7 ، 36 کیلوبیت است که البته به صورت بلوک های حافظه 18 کیلو بیتی نیز قابل استفاده هستند. با توجه به سری ساخت FPGA و نوع آن بلوک های حافظه ممکن است ظرفیت پایین تری داشته باشند، به عنوان مثال برای تراشه های Spartan 6 ظرفیت ذخیره سازی یک بلوک حافظه 18 کیلوبیت است و در صورت نیاز می تواند به صورت بلوک 9 کیلوبیتی نیز استفاده شود.
این که چه تعداد از این بلوک های حافظه در هر FPGA وجود دارد، بستگی به نوع FPGA دارد به عنوان مثال کوچکترین تراشه FPGA سری 7 یعنی تراشه XC7S6 از خانواده Spartan 7 تنها 5 بلوک حافظه 36 کیلوبیتی دارد در حالی تراشه های قدرتمند Virtex 7 می توانند تا 1880 بلوک حافظه داشته باشند، یعنی ظرفیت ذخیره سازی حدود 68 مگابیت !!! تعداد بلوک های حافظه برای تراشه های خانواده Spartan 6 بین 12 تا 268 بلوک 16 کیلوبیتی متغیر است.
زمانی که هر کدام از این بلوک های حافظه توسط طراح فراخوانی شوند، فارغ از اینکه چه مقدار اطلاعات قرار است در آنها ذخیره شود، کل فضای ذخیره سازی آن بلوک مورد استفاده قرار می گیرد، به عنوان مثال فرض کنید قرار است 128 کلمه 16 بیتی را درون یک حافظه بلوکی روی یکی از تراشه های Spartan 6 پیاده سازی کنیم. یعنی 2048 بیت یا 2 کیلو بیت، در صورت استفاده از یک حافظه 9 کیلوبیتی درون تراشه واضح است که 7 کیلوبیت آن بدون استفاده باقی می ماند و این یک اشکال در طراحی است. اجازه بدهید بحث در رابطه با حافظه های بلوکی را در همینجا متوقف کنیم و کمی به حافظه های توزیع شده بپردازیم.
برخلاف حافظه های بلوکی حافظه های توزیع شده، منابع اختصاصی سخت افزاری نیستند، و با استفاده از LUT ها ساخته می شوند و همانطور که از نامشان می توان تشخیص داد، می توانند در هر جایی از تراشه پیاده سازی شوند. این حافظه ها قابلیت ذخیره سازی تعداد محدودی بیت دارند و در مواردی که نیاز به ذخیره سازی حجم کمی از داده ها وجود داشته باشد، مورد استفاده قرار می گیرند، ظرفیت ذخیره سازی این حافظه ها ثابت نیست و می تواند کاملا سفارشی شده باشند، برای تراشه XC7S6 که پیشتر به عنوان کوچکترین تراشه خانواده Spartan 7 معرفی شد، کل ظرفیت حافظه های توزیع شده برابر با 70 کیلو بیت است. این عدد برای بزرگترین تراشه خانواده Virtex 7 حدود 21 مگابیت است.
در حالت کلی LUT ها برای انجام روابط منطقی بکار گرفته می شوند اما LUT های درون اسلایس های کامل #SLICEM که از قبل آنها را می شناسیم، می توانند به صورت حافظه پیکره بندی شوند، هر LUT در تراشه های سری 7 قابلیت ذخیره سازی حداکثر 64 بیت داده را دارد و با اتصال آبشاری LUT های درون یک اسلایس امکان افزایش این ظرفیت تا 256 بیت نیز وجود دارد.
البته با استفاده از چندین اسلایس و بخشی از منایع دیگر FPGA امکان افزایش ظرفیت حافظه های توزیع شده وجود دارد و به عنوان مثال با استفاده از 16 اسلایس می توان یک حافظه 16 بیتی با عمق ذخیره سازی 64 کلمه تولید کرد یعنی یک حافظه 1 کیلوبیتی.
❗️ حالا سوال اینجاست؟ برای طراحی از کدام حافظه استفاده کنیم، یا سوال مهمتر اینکه چگونه این حافظه ها را در کدهای خودمون فراخوانی کنیم و چگونه پیکره بندی آن ها را تنظیم کنیم.
پاسخ به این سوال بسیار ساده است، فقط باید درست کد نویسی انجام دهیم، ابزار سنتز به صورت اتوماتیک حافظه ها را به منابع درون تراشه نگاشت می کند. یعنی ابزار سنتز با توجه به ظرفیت حافظه بهترین جایگاه برای پیاده سازی را انتخاب می کند. می توان این مساله را با چند مثال توضیح داد اما قبل از ارائه مثال بهتر است با پیکره بندی های مختلف حافظه ها نیز آشنا بشویم.
✳️ حافظه های بلوکی و حافظه های توزیع شده می توانند به اشکال مختلفی پیکره بندی شوند. اگر علاقه مندید با آن ها آشنا بشوید، به شما توصیه می کنم مقاله بعدی ما در رابطه با حافظه ها که چند روز دیگر منتشر می شود را مطالعه کنید.
@Hexalinx
#BLOCK_RAM
#DISTRIBUTED_RAM
✅ در مورد مفهوم حافظه ها در FPGA قبلا مقاله ای خدمتتان ارائه شده که در آن یک مقایسه کوچک بین قابلیت ها و محدودیت های انواع حافظه های قابل استفاده درون تراشه مورد بررسی قرار گرفت. اگر هنوز موفق به مطالعه این مقاله نشدید، پیشنهاد می کنم وقت را از دست ندهید و همین الان شروع کنید.
✅ امروز دومین قسمت از این مقاله برای علاقه مندان به یادگیری مفاهیم بنیادی پیاده سازی در FPGA ارائه می شود. بدون شک بیان تمام جزئیات در این مجال کوتاه امکان پذیر نیست، از این رو درصورتی که نیاز به اطلاعات تکمیلی داشتید، حتما سوال خود را با @aks_linx در میان بگذارید.
@Hexalinx
#DISTRIBUTED_RAM
✅ در مورد مفهوم حافظه ها در FPGA قبلا مقاله ای خدمتتان ارائه شده که در آن یک مقایسه کوچک بین قابلیت ها و محدودیت های انواع حافظه های قابل استفاده درون تراشه مورد بررسی قرار گرفت. اگر هنوز موفق به مطالعه این مقاله نشدید، پیشنهاد می کنم وقت را از دست ندهید و همین الان شروع کنید.
✅ امروز دومین قسمت از این مقاله برای علاقه مندان به یادگیری مفاهیم بنیادی پیاده سازی در FPGA ارائه می شود. بدون شک بیان تمام جزئیات در این مجال کوتاه امکان پذیر نیست، از این رو درصورتی که نیاز به اطلاعات تکمیلی داشتید، حتما سوال خود را با @aks_linx در میان بگذارید.
@Hexalinx
#XADC
#Intermediate
✅ سیگنال آنالوگ در FPGA
✳️در کنار منابع دیجیتالی مرسوم موجود در تراشههای FPGA شرکت Xilinx همچون بلوکهای منطقی قابل پیکره بندی #CLB، بلوکهای ضرب کننده #DSP_BLOCK و بلوکهای حافظه #BLOCK_RAM، یک بلوک کاملا آنالوگ نیز درون این تراشهها وجود دارد. این بلوک برای کاربردهایی که نیاز به پردازش ترکیبی سیگنالهای آنالوگ و دیجیتال دارند بکار گرفته میشود. این بلوک آنالوگ در تراشههای نسل قبل همچون Vitex 5 و Virtex 6 تحت عنوان System Monitor و در تراشههای سری ۷ به بعد تحت عنوان #XADC شناخته میشود.
بلوک XADC متشکل از یک ADC دو کاناله ۱۲ بیتی با حداکثر نرخ نمونه برداری 1 مگا سمپل بر ثانیه (MSPS) به همراه تعدادی سنسور و مدارات کنترلی است. در واقع XADC به عنوان یک ورودی آنالوگ همه منظوره برای FPGA در نظر گرفته میشود و کاربردهای فراوانی را میتوان برای آن برشمرد.
@Hexalinx
#Intermediate
✅ سیگنال آنالوگ در FPGA
✳️در کنار منابع دیجیتالی مرسوم موجود در تراشههای FPGA شرکت Xilinx همچون بلوکهای منطقی قابل پیکره بندی #CLB، بلوکهای ضرب کننده #DSP_BLOCK و بلوکهای حافظه #BLOCK_RAM، یک بلوک کاملا آنالوگ نیز درون این تراشهها وجود دارد. این بلوک برای کاربردهایی که نیاز به پردازش ترکیبی سیگنالهای آنالوگ و دیجیتال دارند بکار گرفته میشود. این بلوک آنالوگ در تراشههای نسل قبل همچون Vitex 5 و Virtex 6 تحت عنوان System Monitor و در تراشههای سری ۷ به بعد تحت عنوان #XADC شناخته میشود.
بلوک XADC متشکل از یک ADC دو کاناله ۱۲ بیتی با حداکثر نرخ نمونه برداری 1 مگا سمپل بر ثانیه (MSPS) به همراه تعدادی سنسور و مدارات کنترلی است. در واقع XADC به عنوان یک ورودی آنالوگ همه منظوره برای FPGA در نظر گرفته میشود و کاربردهای فراوانی را میتوان برای آن برشمرد.
@Hexalinx