اشتباه در انتخاب حافظههای موقت در FPGA میتواند به شدت عملکرد مدار شما را تضعیف کند. در این برنامه ویدئویی، با انواع حافظههای موقت در FPGA آشنا خواهید شد. از این حافظههای موقت میتوانید در طراحی مدارات استفاده کنید و به کمک آنها، دادهها و مقادیر مورد نظرتان را ذخیره کنید.
More...
دو نوع حافظه موقت که در FPGAها وجود دارند، حافظههای بلوکی و حافظههای توزیع شده هستند که هر کدام باید در کاربرد مناسب خودش استفاده شود.
حافظههای بلوکی یا Block RAMها، منابع مستقل دیجیتالی در FPGAها هستند که در بخشهای خاصی از FPGA از قبل به صورت سختافزاری تعبیه شدهاند. این حافظهها در اندازههای مشخصی وجود دارند و میتوانند توسط پیادهساز استفاده شوند.
حافظههای توزیع شده یا Disributed RAMها، در حقیقت از اتصال چندین LUT ساخته میشوند. بعضی از LUTها در FPGA، این قابلیت را دارند که با اتصال به یکدیگر، حافظههای موقت کوچکی را ایجاد کنند.
این مقالهها را هم در مورد نحوه افزایش سرعت مدارات دیجیتال از دست ندهید
در این برنامه، شما را با این دو نوع حافظه موقت که در FPGAها وجود دارند آشنا میکنم و موارد استفاده هر کدام را توضیح میدهم. استفاده نابجا از این منابع میتواند آسیبهای جدی را به طرح شما وارد کنند و مانع از رسیدن به عملکرد مطلوب شوند.
ویدئو یا متن؟
محتوای این برنامه آموزشی، به دو صورت ویدئو و متن آماده شده است. اگر علاقمند به یادگیری این مطلب به صورت ویدئویی هستید، ویدئوی زیر را ببینید و اگر ترجیح میدهید آن را به صورت متن مطالعه کنید، ادامه این مطلب را بخوانید.
برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:
در این مقاله قصد دارم در مورد انواع حافظههای موقت یا RAMها، در FPGA صحبت کنم.
بعد از اینکه این نوع حافظهها را به شما معرفی کردم، در مورد این موضوع صحبت میکنم که هر کدام از انواع حافظه را، تحت چه شرایطی باید استفاده کرد.
کاربردهای استفاده از حافظهی موقت در مدارات دیجیتال
اگر حتی تجربهی کمی در زمینهی طراحی دیجیتال داشته باشید، میدانید که وقتی یک سیستم دیجیتال را پیادهسازی میکنید، در موارد زیادی نیاز به استفاده از حافظههای موقت یا RAMها دارید.
مثلاً، ممکن است در مدار شما لازم باشد که بخشی از محاسباتی که در زمان دیگری در بخش دیگری از مدار انجام شده است، مورد استفاده قرار گیرد. بنابراین، باید نتیجهی این بخش از محاسبات را در یک حافظهی موقت ذخیره کنید.
یا ممکن است به کمک یک ADC (مبدل آنالوگ به دیجیتال) در حال نمونهبرداری از دادههای ورودی هستید و میخواهید بعد از اینکه نمونهبرداری کامل شد، آن را به بیرون از FPGA، مثلاً به یک کامپیوتر یا یک FPGA دیگر ارسال کنید.
در این شرایط، باید این دادهها را در یک حافظهی موقت ذخیره کنید.
یکی دیگر از کاربردهایی که ممکن است، به استفاده از حافظهی موقت نیاز باشد، این است که ممکن است بخواهید جداولی از ضرایب یا منحنیهای خاص را در FPGA ذخیره کنید.
مثلاً، ممکن است لازم باشد یک دورهی تناوب از یک موج سینوسی را در یک جدول ذخیره کنید تا به کمک آن بتوانید یک موج سینوسی را در FPGA تولید کنید.
از آنجا که معمولاً حافظهی موقت، در اکثر طراحیهای دیجیتال مورد استفاده قرار میگیرد، در FPGAها نیز، برای این موضوع، تمهیداتی اندیشیده شده و بلوکهایی، به صورت سختافزاری، برای ایجاد و ساخت حافظه در FPGA ایجاد شده است.
انواع حافظههای موقت
به طور کلی، در FPGAها، دو نوع حافظه وجود دارد:
یکی حافظههای بلوکی یا Block RAMها و دیگری حافظههای توزیعشده یا Distributed RAMها.
اگر اولین برنامهی مجموعهی "آموزش FPGA از صفر" را دیده باشید، حتماً شکل زیر را به یاد دارید:
این شکل، شمایی از منابع سختافزاری موجود در FPGA را به شما نشان میدهد.
همانطور که میبینید، آن بخشی که به رنگ قرمز نشان داده شده، حافظهی بلوکی است، که به صورت سختافزاری در بخشهای مختلفی از FPGA، از قبل ساخته شده است؛ شما میتوانید از این حافظهها در پیادهسازیهایتان استفاده کنید.
بخشهای آبی رنگ شکل، Logic Blockها هستند که اگر به خاطر داشته باشید، در برنامهی "FPGA چیست؟" در این مورد توضیح دادم که قسمت اصلی Logic Blockها، بخش LUT است؛ LUT در واقع یک حافظهی خیلی کوچک است که میتوانید به کمک آن یک مدار کوچک را پیادهسازی کنید. با متصل کردن این LUTها به یکدیگر، میتوانید یک مدار بزرگ را طراحی کنید.
اکنون با این یادآوری، اجازه دهید که به صورت دقیقتر ببینیم، حافظههای بلوکی و حافظههای توزیعشده دقیقاً چه هستند؟
حافظههای بلوکی در FPGA
همانطور که گفتم، حافظههای بلوکی یا Block RAMها، در حقیقت بخشهای سختافزاری هستند که از قبل، در FPGAها طراحی شدهاند و شما میتوانید از آنها برای پیادهسازی حافظههای موقت استفاده کنید.
معمولاً این حافظهها، در اندازههای مشخصی وجود دارند؛ مثلاً در FPGAهای شرکت XILINX مقدار این حافظهها ۱۸ کیلوبیت یا ۳۶ کیلوبیت است که به تعداد قابل توجهی در یک FPGA وجود دارند.
معمولاً، هر کدام از این حافظههای ۱۸ یا ۳۶ کیلوبیتی، میتواند به ترتیب به صورت دو عدد حافظهی نُه کیلوبیتی یا ۱۸ کیلوبیتی استفاده شود.
در شکل زیر، یک Block-RAM یا حافظهی بلوکی ۱۸ کیلو بیتی را میبینید که به دو بخش نُه کیلوبیتی تقسیم شده است.
اگر نیاز داشته باشید، میتوانید کل این حافظهی ۱۸ کیلو بیتی را یکجا استفاده کنید.
و اگر نیاز به حافظهای کمتر از نُه کیلوبیت داشته باشید، میتوانید به جای اینکه کل این ۱۸ کیلوبیت را استفاده کنید، فقط نُه کیلوبیت آن را استفاده کنید.
نکتهی دیگر در مورد حافظههای بلوکی این است که این حافظهها در FPGA، به صورت Dual Port وجود دارند؛
حافظهای که Dual Port است، همانطور که در شکل بالا میبینید، برای ورودی دیتا (یعنی برای نوشتن دیتا در RAM)، و برای خروجی دیتا (یعنی برای خواندن اطلاعات از RAM)، دو پورت مستقل از هم دارد.
به ازای هر کدام از این پورتها نیز، یک خط آدرس مستقل دارد.
همانطور که در شکل بالا میبینید، یک خط آدرس Write و یک خط آدرس Read داریم. یک ورودی Write Enable هم داریم که برای نوشتن استفاده میشود.
نحوهی خواندن و نوشتن در حافظههای بلوکی FPGAها
مثلاً، اگر بخواهیم عمل نوشتن را در این حافظه انجام دهیم، ابتدا باید دیتای مورد نظرمان را در پورت Data In قرار دهیم و آدرسی که میخواهیم داده در آن خانه از حافظه نوشته شود را نیز، در پورت Write Address قرار دهیم.
سپس، باید یکبار پورت Write Enable را فعال کنیم تا دیتا در محل مورد نظر نوشته شود.
برای خواندن از این حافظه نیز، باید آدرس مورد نظرمان را روی خط Write Address قرار دهیم، پس از آن، و در کلاک بعدی، میتوانیم در خروجی Data Out، محتوای آن خانه از حافظه را داشته باشیم.
ویژگی مهم حافظههای بلوکی در FPGA
آخرین نکتهای که در مورد حافظههای بلوکی باید به آن دقت کنید، این است که اگر شما، بخشی از حافظهی نُه کیلوبیتی، مثلاً یک کیلوبیت آن را اِشغال کنید و در هر کلاک، به محتوای این حافظهی یک کیلوبیتی نیاز داشته باشید، دیگر نمیتوانید از بقیهی این حافظه، یعنی از هشت کیلوبیت دیگرش استفاده کنید.
دلیل آن، این است که برای حافظهی نُه کیلوبیتی فقط یک مجموعه پورت وجود دارد و بنابراین اگر شما برای پیادهسازی یک حافظهی یک کیلوبیتی، از این پورتها استفاده کنید، دیگر نمیتوانید از بقیهی هشت کیلوبیت استفاده کنید و این هشت کیلوبیت در سیستم بلااستفاده باقی میماند.
حافظههای توزیعشده در FPGA
اما حافظههای توزیعشده، چه حافظههایی هستند؟
باز اگر از برنامهی "FPGA چیست؟" که اولین برنامهی مجموعه برنامههای "آموزش FPGA از صفر" است، به خاطر داشته باشید، هر FPGA، در واقع از هزاران LUT یا حافظهی کوچک تشکیل شده است که هر کدام از این حافظههای کوچک میتوانند بخش کوچکی از مدار شما را پیادهسازی کنند.
شما با متصل کردن این LUTها به یکدیگر، به کمک سیم بندیهایی که در FPGA وجود دارد، میتوانید یک مدار بزرگتر را طراحی کنید.
در FPGAها، بعضی از LUTها این قابلیت را دارند که به یکدیگر متصل شوند و یک حافظه را درست کنند.
به حافظهای که از به هم متصل شدن LUTها ایجاد میشود، حافظهی توزیعشده گویند.
ویژگی مهم حافظهی توزیعشده
نکتهای که باید به آن توجه کنید، این است که برای اینکه حوزههای کوچک به هم متصل شوند و یک حافظهی بزرگتر را ایجاد کنند، مقدار زیادی سیمبندی و مدار در FPGA استفاده میشود؛ در عمل، وقتی که شما یک حافظهی توزیعشده را ایجاد میکنید، منابع زیادی از FPGA اِشغال میشود.
نکتهی دیگر این است که این منابع استفاده شده برای تولید حافظهی توزیعشده، اگر برای حافظهی توزیعشده استفاده نمیشدند، میتوانستید از آنها برای پیادهسازی هر نوع مدار دیگری استفاده کنید.
اکنون سوالی که مطرح میشود این است که هر کدام از این انواع حافظه را، چه موقع باید به کار برد؟
کاربرد هر کدام از این حافظهها کجاست؟
چه موقع باید از حافظههای بلوکی و چه موقع باید از حافظههای توزیعشده استفاده کنیم؟
جواب این سوال در توضیحاتی که پیشتر، در این مقاله گفتم، نهفته است و اکنون آن نکات اصلی را، دوباره خلاصه میکنم.
همانطور که گفتم، اگر از بخشی از یک حافظهی بلوکی استفاده کنید، بخش دیگر آن، بلااستفاده میماند.
مثلاً، اگر از ۱۰۰ بیت یک حافظهی نُه کیلوبیتی استفاده کنید، دیگر نمیتوانید از بقیهی این حافظه استفاده کنید.
بنابراین، احتمالاً اکنون این نکته در ذهنتان ایجاد میشود که پس اگر بخواهم از حافظههای خیلی کوچک استفاده کنم، استفاده از حافظههای بلوکی، کار اشتباهی است.
نکتهی بعدی، در مورد حافظههای توزیعشده این است که اگر شما از حافظههای توزیعشده برای تولید و پیادهسازی حافظه استفاده کنید، منابع عمومی پیادهسازی را (که همان LUTها هستند)، به مقدار زیادی مصرف میکنید.
همچنین برای اینکه این LUTها به هم متصل شوند، تعداد زیادی سیمبندی، مالتیپلکسر و منابع دیگر نیاز است؛ در عمل، وقتی که بخواهیم برای پیادهسازی حافظهی موقت از حافظههای توزیعشده استفاده کنیم، خواهید دید که با افزایش حجم حافظهی توزیعشده، منابع مختلف دیجیتالی موجود در FPGA، به سرعت اِشغال میشوند و خیلی زود FPGA پُر میشود.
بنابراین، اگر بخواهم صحبتم را خلاصه کنم، بهترین حالت برای استفاده از حافظهی توزیعشده، زمانی است که شما میخواهید حافظههای خیلی کوچک را پیادهسازی کنید؛ مثلاً، حافظههایی در حد چند ده یا چند صد بیت.
خصوصاً اگر لازم باشد که این حافظهها را به تعداد زیادی استفاده کنید، بهترین انتخاب این است که از حافظههای توزیعشده استفاده کنید.
و وقتی بخواهید از حافظههای بزرگ، مثلاً، یک کیلوبیت، دو کیلوبیت یا بیشتر، استفاده کنید، بهترین انتخاب، استفاده از حافظههای بلوکی است.
اگر در این شرایط، از حافظهی توزیعشده استفاده کنید، میبینید که خیلی سریع، منابع دیجیتالی FPGA اِشغال میشود.
مشکل دیگری که ایجاد میشود، این است که به دلیل نوع پیادهسازی حافظههای توزیعشده، وقتی حافظهی بزرگی را پیادهسازی کنید، سرعت کلاک سیستمتان، به شدت پایین میآید و این موضوع میتواند مشکلات بسیار جدی، برای پیادهسازی سیستم شما ایجاد کند.
امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژههایتان استفاده کنید.
آیا برنامه ویدئویی انواع حافظههای موقت در FPGA برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.
سلام
ممنون مختصر و مفید بود
سلام.ممنون.مفید بود.اگه میشه کلاس ها رو به صورت انلاین هم برگزار بکنید با همون قیمت
سلام، ممنون از شما.
در حال حاضر در حال تهیه دوره آنلاین هستیم و به زودی در مورد آن اطلاعرسانی خواهیم کرد.
موفق باشید.
سلام. اولش ممنونم از ویدیوی مفیدی که به اشتراک گذاشتین. سوالی که برا من پیش اومده اینه که وقتی ما یه سیگنال آرایه ای تعریف می کنیم یا کلا وقتی داریم یه سیگنال تعریف می کنیم، از lut ها استفاده میشه؟ سوال بعدیم این بود که من الان یه آرایه مثلا 60 *40 دارم و تو هر کلاک میخوام با مقادیر و لوکیشن های این آرایه تعامل داشته باشم، چه نوع حافظه ای مناسبه؟ و نهایتا سوال آخر اینکه چه طوری می تونم تو کد از حافظه های بلوکی استفاده کنم؟ سپاسگزارم.
سلام،
اینکه سیگنال چگونه پیادهسازی میشود بستگی به نحوه استفاده از آن سیگنال در کد دارد. اگر به یک سیگنال در محیط concurrent ارجاع شود، سیگنال در پیادهسازی به صورت یک سیم پیاده میشود. اگر به سیگنال در محیط process و درون شرط لبه بالارونده کلاک ارجاع شود، سیگنال به صورت یک رجیستر پیادهسازی میشود.
در مورد سوال دوم و سوم، لطفا به آموزش زیر مراجعه کنید:
https://faradandish.com/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D8%AD%D8%A7%D9%81%D8%B8%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C-%D9%85%D9%88%D9%82%D8%AA-%D8%AF%D8%B1-fpga/
موفق باشید.