#Essentials
✅ آیا تا به حال به اهمیت رعایت مساله زمانبندی در طراحی های FPGA فکر کردید؟ آیا با مفاهیم ساده و اولیه سنجش کارایی یک پیاده سازی آشنایی دارید؟ تا به حال به این فکر کردید که چرا برخی از پیاده سازی ها با وجود اینکه نتایج شبیه سازی آن ها کاملا درست است، اما نتایج سخت افزاری کاملا اشتباه و نامعتبر دارند؟
به طور کلی انجام مجاسبات ریاضی و پردازش سیگنال در FPGA نیازمند رعایت اصول پیاده سازی خاص در این مدارهاست، سوال اینجاست که اگر این اصول رعایت نشود، چه مشکلی پیش می آید؟
✅ قبل از پاسخ به این سوال اجازه بدهید در پست زیر یکسری مفاهیم مقدماتی را به زبان ساده توصیف کنیم. هر طراح FPGA باید با مفاهیمی همچون #Race_Condition و #Glitch آشنایی داشته باشد تا بتواند دلیل رعایت یکسری از اصول را در برنامه نویسی متوجه شود، و برای آن ها راه حل مناسب پیدا کند. این آغاز ماجراجویی شماست، با ما همراه باشید ...
@Hexalinx
✅ آیا تا به حال به اهمیت رعایت مساله زمانبندی در طراحی های FPGA فکر کردید؟ آیا با مفاهیم ساده و اولیه سنجش کارایی یک پیاده سازی آشنایی دارید؟ تا به حال به این فکر کردید که چرا برخی از پیاده سازی ها با وجود اینکه نتایج شبیه سازی آن ها کاملا درست است، اما نتایج سخت افزاری کاملا اشتباه و نامعتبر دارند؟
به طور کلی انجام مجاسبات ریاضی و پردازش سیگنال در FPGA نیازمند رعایت اصول پیاده سازی خاص در این مدارهاست، سوال اینجاست که اگر این اصول رعایت نشود، چه مشکلی پیش می آید؟
✅ قبل از پاسخ به این سوال اجازه بدهید در پست زیر یکسری مفاهیم مقدماتی را به زبان ساده توصیف کنیم. هر طراح FPGA باید با مفاهیمی همچون #Race_Condition و #Glitch آشنایی داشته باشد تا بتواند دلیل رعایت یکسری از اصول را در برنامه نویسی متوجه شود، و برای آن ها راه حل مناسب پیدا کند. این آغاز ماجراجویی شماست، با ما همراه باشید ...
@Hexalinx
#Race_Condition
#Metastabilty
#Glitch
✳️ رخداد #Race_Condition نتیجه و حاصل یک طراحی نامناسب برای یک لچ یا فلیپ فلاپ در FPGA است. در واقع نشان دهنده وضعیتی است که در آن داده و کلاک ورودی به یک فلیپ فلاپ در یک زمان تغییر می کنند و نتیجه خروجی بستگی به این دارد که کدام یک از این دو در اصطلاح برنده شود.
✳️ در موارد نادر، ممکن است در زمان تغییر وضعیت کلاک، داده دقیقا برابر 0 و یا 1 باشد ، ولی در اکثر موارد داده مقداری بین 0 و یا 1 دارد، یعنی در بازه زمانی گذر از حالت low به حالت high قرار دارد. در این چنین شرایطی خروجی برای یک لحظه بین 0 و 1 باقی می ماند، (برای مثال در یک سیستم با ولتاژ 5V ، خروجی ممکن است برای مدت زمان خیلی کوتاهی مثلا چند نانو ثانیه حدود 2.5V باشد. هنگامی که این اتفاق می افتد در اطلاح گفته می شود خروجی ناپایدار یا #Metastable است. ناپایدار بودن باعث ایجاد اثرات جدی و منفی بر روی عملکرد سیستم می شود از همه بدتر اینکه، تقریبا تکرار پذیری این حالت ناپایدار تقریبا غیرممکن است و بنابراین پیدا کردن منشا خطا و برطرف کردن آن بسیار سخت است.
✳️ مسئله ناپداری در خروجی فقط مختص به فلیپ فلاپ ها نیست و ممکنه به دلیل تاخیر وضعیت نامتناسب در ورودی های گیت های منطقی نیز وجود داشته باشد و باعث ایجاد مشکلات ناخواسته بشود، این رخداد نیز در اصطلاح #Glitch نامیده می شود.
✳️ برای جلوگیری از بروز چنین مشکلاتی در طراحی، طراح باید با در نظر گرفتن بدترین شرایط ممکن، آنالیز زمانی کاملا دقیقی روی مداری که طرحی کرده است، انجام دهد. این نوع آنالیزها عموما با بکارگیری تاخیرهای انتشار، تاخیرهای مسیر بین عناصر موجود در FPGA، محاسبه زمان بندی high و low شدن سیگنال و یکسری پارامترهای دیگر انجام می شود. این کار عموما زمان بر است، اما شرکت های سازنده تراشه های قابل برنامه ریزی ابزارهای مناسبی را برای انجام این تحلیل ها ارائه داده اند.
@Hexalinx
#Metastabilty
#Glitch
✳️ رخداد #Race_Condition نتیجه و حاصل یک طراحی نامناسب برای یک لچ یا فلیپ فلاپ در FPGA است. در واقع نشان دهنده وضعیتی است که در آن داده و کلاک ورودی به یک فلیپ فلاپ در یک زمان تغییر می کنند و نتیجه خروجی بستگی به این دارد که کدام یک از این دو در اصطلاح برنده شود.
✳️ در موارد نادر، ممکن است در زمان تغییر وضعیت کلاک، داده دقیقا برابر 0 و یا 1 باشد ، ولی در اکثر موارد داده مقداری بین 0 و یا 1 دارد، یعنی در بازه زمانی گذر از حالت low به حالت high قرار دارد. در این چنین شرایطی خروجی برای یک لحظه بین 0 و 1 باقی می ماند، (برای مثال در یک سیستم با ولتاژ 5V ، خروجی ممکن است برای مدت زمان خیلی کوتاهی مثلا چند نانو ثانیه حدود 2.5V باشد. هنگامی که این اتفاق می افتد در اطلاح گفته می شود خروجی ناپایدار یا #Metastable است. ناپایدار بودن باعث ایجاد اثرات جدی و منفی بر روی عملکرد سیستم می شود از همه بدتر اینکه، تقریبا تکرار پذیری این حالت ناپایدار تقریبا غیرممکن است و بنابراین پیدا کردن منشا خطا و برطرف کردن آن بسیار سخت است.
✳️ مسئله ناپداری در خروجی فقط مختص به فلیپ فلاپ ها نیست و ممکنه به دلیل تاخیر وضعیت نامتناسب در ورودی های گیت های منطقی نیز وجود داشته باشد و باعث ایجاد مشکلات ناخواسته بشود، این رخداد نیز در اصطلاح #Glitch نامیده می شود.
✳️ برای جلوگیری از بروز چنین مشکلاتی در طراحی، طراح باید با در نظر گرفتن بدترین شرایط ممکن، آنالیز زمانی کاملا دقیقی روی مداری که طرحی کرده است، انجام دهد. این نوع آنالیزها عموما با بکارگیری تاخیرهای انتشار، تاخیرهای مسیر بین عناصر موجود در FPGA، محاسبه زمان بندی high و low شدن سیگنال و یکسری پارامترهای دیگر انجام می شود. این کار عموما زمان بر است، اما شرکت های سازنده تراشه های قابل برنامه ریزی ابزارهای مناسبی را برای انجام این تحلیل ها ارائه داده اند.
@Hexalinx
#ACAP
#Versal
#Advanced
✅ پلت فرم Versal چیست؟
عنوان Versal ACAP نامی است که Xilinx برای اولین پلت فرم شتاب دهنده محاسبه تطبیقی خود انتخاب کرده است. واژه Versal ترکیبی از واژه Universal و Versatility است. این تراشه یا به تبعیت از Xilinx پلت فرم محاسباتی شامل موتورهای پردازش اسکالر، موتورهای سخت افزاری تطبیقی و موتورهای هوشمند با فناوری های پیشرفته حافظه و ارتباطات برای ارائه شتاب ناهمگن قدرتمند برای هر نوع کاربردی می باشند. اما مهمتر از همه، سخت افزار و نرم افزار Versal ACAP می تواند توسط برنامه نویسان نرم افزار، دانشمندان داده پرداز و توسعه دهندگان سخت افزار به طور یکپارچه برنامه ریزی شود. این بهینه سازی عملکردی توسط مجموعه ابزارها، نرم افزارها، کتابخانه ها، میان افزارها، IP ها و چارچوب های استانداری که امکان طراحی صنعتی را فراهم می کنند صورت می پذیرد.
@Hexalinx
#Versal
#Advanced
✅ پلت فرم Versal چیست؟
عنوان Versal ACAP نامی است که Xilinx برای اولین پلت فرم شتاب دهنده محاسبه تطبیقی خود انتخاب کرده است. واژه Versal ترکیبی از واژه Universal و Versatility است. این تراشه یا به تبعیت از Xilinx پلت فرم محاسباتی شامل موتورهای پردازش اسکالر، موتورهای سخت افزاری تطبیقی و موتورهای هوشمند با فناوری های پیشرفته حافظه و ارتباطات برای ارائه شتاب ناهمگن قدرتمند برای هر نوع کاربردی می باشند. اما مهمتر از همه، سخت افزار و نرم افزار Versal ACAP می تواند توسط برنامه نویسان نرم افزار، دانشمندان داده پرداز و توسعه دهندگان سخت افزار به طور یکپارچه برنامه ریزی شود. این بهینه سازی عملکردی توسط مجموعه ابزارها، نرم افزارها، کتابخانه ها، میان افزارها، IP ها و چارچوب های استانداری که امکان طراحی صنعتی را فراهم می کنند صورت می پذیرد.
@Hexalinx
#MICROBLAZE
#SOFT_PROCESSOR
#Essentials
✅ میکرو بلیز، یک میکرو پروسسور نرم افزاری یا در اصطلاح soft micro processor است که توسط Xilinx در سال 2002 معرفی شد. این کنترلر یا پروسسور داخلی داری معماری 32 بیتی ریسک است و تقریبا در تمام FPGA های شرکت Xilinx قابل فراخوانی است. این پروسسور یک واحد سخت افزاری مجزا روی تراشه نیست و با استفاده از منابع داخلی تراشه های Xilinx یعنی LUT ها و حافظه ها ساخته می شود و فراخوانی آن باعث می شود بخشی از فضای منطقی روی تراشه مصرف شود، این دقیقا مفهوم #soft_processor است.
✅ در واقع هدف Xilinx از معرفی میکروبلیز قرار دادن یک کنترلر در کنار تراشه های FPGA با صرف کمترین هزینه بوده است و با این کار انعطاف پذیری بالایی را برای طراحان فراهم آورده است.
✅ میکروبلیز کاملا قابل سفارشی سازی است و می توان آن را متناسب با هر نیازی پیکره بندی کرد، محدودیتی در رابطه با تعداد میکروبلیزهای قابل فراخوانی در تراشه وجود ندارد و کاربر می تواند به راحتی چندین پروسسور را با ویژگی های مختلف در کد خود استفاده کند و در کنار سایر مدارات درون FPGA از آنها به بهترین شکل استفاده کند.
@Hexalinx
#SOFT_PROCESSOR
#Essentials
✅ میکرو بلیز، یک میکرو پروسسور نرم افزاری یا در اصطلاح soft micro processor است که توسط Xilinx در سال 2002 معرفی شد. این کنترلر یا پروسسور داخلی داری معماری 32 بیتی ریسک است و تقریبا در تمام FPGA های شرکت Xilinx قابل فراخوانی است. این پروسسور یک واحد سخت افزاری مجزا روی تراشه نیست و با استفاده از منابع داخلی تراشه های Xilinx یعنی LUT ها و حافظه ها ساخته می شود و فراخوانی آن باعث می شود بخشی از فضای منطقی روی تراشه مصرف شود، این دقیقا مفهوم #soft_processor است.
✅ در واقع هدف Xilinx از معرفی میکروبلیز قرار دادن یک کنترلر در کنار تراشه های FPGA با صرف کمترین هزینه بوده است و با این کار انعطاف پذیری بالایی را برای طراحان فراهم آورده است.
✅ میکروبلیز کاملا قابل سفارشی سازی است و می توان آن را متناسب با هر نیازی پیکره بندی کرد، محدودیتی در رابطه با تعداد میکروبلیزهای قابل فراخوانی در تراشه وجود ندارد و کاربر می تواند به راحتی چندین پروسسور را با ویژگی های مختلف در کد خود استفاده کند و در کنار سایر مدارات درون FPGA از آنها به بهترین شکل استفاده کند.
@Hexalinx
#PYNQ
#Python
#Essentials
✅ چگونه یک طراح نرم افزار کارش را با FPGA ها شروع کند؟
در نگاه اول به نظر می رسد، شما باید در یک زمان، تمام مفاهیم جدید، سخت افزار جدید و محیط توسعه جدید را مدیریت کنید. در حالت کلی تمامی مدارک، مستندات و مثال های آموزشی در این حوزه توسط مهندسین الکترونیک برای مهندسان الکترونیک ایجاد شده اند و این به مهندسان نرم افزار کمک نمی کند. این دقیقا نکته ایست که توجه شرکت Digilent را به خودش جلب کرد. بورد آموزشیPYNQ-Z1 برای حل این مشکل به افراد برنامه نویس اجازه می دهد به آرامی در انتهای کم عمق استخر شنا کنند، و کم کم به سمت مسائل پیچیده تر بروند.
اجرای کدها و کار با بورد در هر محیطی امکان پذیر است اما پیشنهاد خود سازندگان استفاده از Ubuntu است. به این ترتیب کار شروع می شود و شما به عنوان یک مهندس نرم افزار با اجرای کدهای پایتون یکسری فیدبک مثبت دریافت می کننید. کم کم همان طور که شما کد پایتون را اجرا می کنید، متوجه خواهید شد که تراشه Xilinx ZYNQ یک تراشه کاملا سازمان یافته است و به مرور نحوه اجرای کد روی آن را درک می کنید. البته اشتباه نکنید، شما در نهایت باید دست به کار شوید و به سطوح پایین تر طراحی بروید و مهارت کافی در بکاگیری مجموعه ابزارهای ارائه شده برای توسعه FPGA را بدست بیاورید. اما شما تنها پس از رسیدن به برخی از موفقیت ها و درک مفاهیم، شروع خواهید کرد. پس وقت را تلف نکنید و شروع کنید.
@Hexalinx
#Python
#Essentials
✅ چگونه یک طراح نرم افزار کارش را با FPGA ها شروع کند؟
در نگاه اول به نظر می رسد، شما باید در یک زمان، تمام مفاهیم جدید، سخت افزار جدید و محیط توسعه جدید را مدیریت کنید. در حالت کلی تمامی مدارک، مستندات و مثال های آموزشی در این حوزه توسط مهندسین الکترونیک برای مهندسان الکترونیک ایجاد شده اند و این به مهندسان نرم افزار کمک نمی کند. این دقیقا نکته ایست که توجه شرکت Digilent را به خودش جلب کرد. بورد آموزشیPYNQ-Z1 برای حل این مشکل به افراد برنامه نویس اجازه می دهد به آرامی در انتهای کم عمق استخر شنا کنند، و کم کم به سمت مسائل پیچیده تر بروند.
اجرای کدها و کار با بورد در هر محیطی امکان پذیر است اما پیشنهاد خود سازندگان استفاده از Ubuntu است. به این ترتیب کار شروع می شود و شما به عنوان یک مهندس نرم افزار با اجرای کدهای پایتون یکسری فیدبک مثبت دریافت می کننید. کم کم همان طور که شما کد پایتون را اجرا می کنید، متوجه خواهید شد که تراشه Xilinx ZYNQ یک تراشه کاملا سازمان یافته است و به مرور نحوه اجرای کد روی آن را درک می کنید. البته اشتباه نکنید، شما در نهایت باید دست به کار شوید و به سطوح پایین تر طراحی بروید و مهارت کافی در بکاگیری مجموعه ابزارهای ارائه شده برای توسعه FPGA را بدست بیاورید. اما شما تنها پس از رسیدن به برخی از موفقیت ها و درک مفاهیم، شروع خواهید کرد. پس وقت را تلف نکنید و شروع کنید.
@Hexalinx
#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
#ZYNQ_MPSoC
#MACHINE_LEARNING
#Advanced
✅ معرفی کتاب
✳️ این کتاب با استفاده از تراشه های قدرتمند Zynq Ultrascal plus به آموزش نحوه پیادی سازی الگوریتم های پردازشی می پردازد و پیاده سازی پروژه ها را روی بورد #PYNQ انجام می دهد. هدف اصلی کتاب نشان دادن توانایی این تراشه ها در پیاده سازی الگوریتم های بینایی ماشین و هوش مصنوعی است، که امروزه بسیار مورد توجه محققان و دانشجویان تحصیلات تکمیلی قرار دارد، لینک دانلود مستقیم این کتاب در پست بعدی قرار داده شده است. 👇👇
@Hexalinx
#MACHINE_LEARNING
#Advanced
✅ معرفی کتاب
✳️ این کتاب با استفاده از تراشه های قدرتمند Zynq Ultrascal plus به آموزش نحوه پیادی سازی الگوریتم های پردازشی می پردازد و پیاده سازی پروژه ها را روی بورد #PYNQ انجام می دهد. هدف اصلی کتاب نشان دادن توانایی این تراشه ها در پیاده سازی الگوریتم های بینایی ماشین و هوش مصنوعی است، که امروزه بسیار مورد توجه محققان و دانشجویان تحصیلات تکمیلی قرار دارد، لینک دانلود مستقیم این کتاب در پست بعدی قرار داده شده است. 👇👇
@Hexalinx
#CLB, #LUT
#DISTRIBUTED_RAM
✅ آیا تا به حال به این فکر کرده اید که توابع منطقی مانند f = x1 and x2 در FPGA به چه صورت پیاده سازی می شوند؟ آیا به نظر شما در FPGA گیت AND ، OR یا هر نوع گیت دیگری برای اینکار وجود دارد؟ اگر وجود دارد این گیت ها کجا هستند؟
✳️ در پاسخ به این سوال باید گفت، خیر، در FPGA گیت های مجزا برای این نوع عملیات منطقی و حتی عملیات منطقی پیچیده تر وجود ندارد، و در عمل بلوک های منطقی قابل پیکره بندی یا همان #CLB ها وظیفه اصلی پیاده سازی توابع منطقی با هر نوع پیچیدگی را بر عهده دارند. در این مقاله می خواهم به شکلی دقیق تر به مرور ساختار داخلی #CLB ها بپردازم، و نحوه پیاده سازی توابع منطقی با استفاده از این بلوک ها و همچنین نحوه بکارگیری این بلوک ها برای جهت ساختن یک حافظه را بررسی کنم.
@Hexalinx
#DISTRIBUTED_RAM
✅ آیا تا به حال به این فکر کرده اید که توابع منطقی مانند f = x1 and x2 در FPGA به چه صورت پیاده سازی می شوند؟ آیا به نظر شما در FPGA گیت AND ، OR یا هر نوع گیت دیگری برای اینکار وجود دارد؟ اگر وجود دارد این گیت ها کجا هستند؟
✳️ در پاسخ به این سوال باید گفت، خیر، در FPGA گیت های مجزا برای این نوع عملیات منطقی و حتی عملیات منطقی پیچیده تر وجود ندارد، و در عمل بلوک های منطقی قابل پیکره بندی یا همان #CLB ها وظیفه اصلی پیاده سازی توابع منطقی با هر نوع پیچیدگی را بر عهده دارند. در این مقاله می خواهم به شکلی دقیق تر به مرور ساختار داخلی #CLB ها بپردازم، و نحوه پیاده سازی توابع منطقی با استفاده از این بلوک ها و همچنین نحوه بکارگیری این بلوک ها برای جهت ساختن یک حافظه را بررسی کنم.
@Hexalinx
#Essentials
🔖 مقاله ایی که خدمتتان ارائه می گردد، با توجه به معماری تراشه های 7 Series و خانواده Spartan 6 تهیه شده است، معماری CLB ها در سایر تراشه های Xilinx تا حدودی متفاوت است، اگر چه شباهت هایی نیز وجود دارد.
تمامی تراشه های FPGA شرکت Xilinx دارای تعداد زیادی بلوک #CLB هستند که هر کدام متشکل از دو اسلایس #Slice هستند. هر اسلایس نیز شامل 4 عدد #LUT شش ورودی، 8 عدد فلیپ فلاپ #FLIP_FLOP ، یک زنجیره بیت نقلی #CARRY_CHAIN و تعدادی مالتی پلکسر عریض #WIDE_MULTIPLEXER است. ساختار داخلی یک LUT در شکل بالا نشان داده شده است.
همانطور که در شکل می بینیم، هر #LUT داری شش ورودی مستقل به نام های D1 تا D6 و دو خروجی مستقل به نام های O5 و O6 می باشد. هر #LUT قابلیت پیاده سازی یک تابع 6 ورودی با هر نوع پیچیدگی را دارد، مثلا تابع f را به صورت زیر در نظر بگیرد.
f=((D1 and D2) or (D3 and not(D4 or D5)) and D6)
با یک مرور کوتاه به درس مدار منطقی به یاد می آوریم که یک جدول درستی با شش ورودی می توانست 64 خروجی مختلف داشته باشد. در حقیقت #LUT ها در FPGA کاملا مشابه جداول درستی با شش ورودی عمل می کنند. علاوه بر این یک #LUT می تواند مشابه یک حافظه با 64 عنصر حافظه نیز عمل کند.
هنگام پیاده سازی یک تابع شش ورودی روی FPGA ، ابتدا جدول درستی این تابع توسط ابزار سنتز در ISE و یا Vivado ساخته می شود و سپس روی #LUT ها نگاشت می شود و در نهایت روی تراشه FPGA پیکره بندی می شود.
نکته دیگری که باید به آن اشاره کرد این است که همانطور که شکل بالا نشان می دهد. یک #LUT شش ورودی می تواند همانند دو عدد #LUT مستقل 5 ورودی نیز مورد استفاده قرار بگیرد، البته این 5 ورودی بین هر دو #LUT مشترک هستند ولی هر #LUT می تواند جدول درستی اختصاصی خودش و البته خروجی اختصاصی خودش یعنی O5 یا O6 را داشته باشد. در حالتی که تابع مورد نظر برای پیاده سازی نیاز به استفاده همزمان از هر دو #LUT داشته باشد، یک #LUT شش ورودی ساخته می شود و تنها خروجی O6 استفاده می شود، ولی در صورت استفاده تکی از #LUT ها هر دو خروجی بکار گرفته می شوند.
از سوی دیگر هر #LUT می تواند در نقش یک حافظه ROM یا RAM جهت ذخیره سازی 64 عدد تک بیت یا 32 عدد دو بیتی استفاده شود. در اینجا هم در حالت اول فقط خروجی O6 و در حالت دوم هر دو خروجی O5 و O6 به صورت همزمان استفاده می شوند. توجه داشته باشید هنگامی که تعداد محدودی عدد چند بیتی (مثلا 128 عدد بیتی) در یک ROM ذخیره می کنیم، در صورت کدنویسی صحیح (تاکید می کنم، حتما باید ساختار کد صحیح باشد) ابزار سنتز به صورت اتوماتیک از #LUT ها جهت این کار استفاده می کند و به نوعی یک حافظه توزیع شده #DISTRIBURD_RAM سنتز می شود ولی اگر تعداد اعداد از یک حدی بیشتر باشند حافظه ROM ما به بلوک های حافظه داخللی نگاشت می شود.
❗️ تعیین آستانه برای انتخاب بین یک حافظه توزیع شده یا بلوک های حافظه به موارد متعددی بستگی دارد که در مقاله ای جداگانه به آن پرداخته می شود.
با ترکیب هر چهار #LUT درون یک اسلایس می توان حافظه های بزرگتری با ظرفیت حداکثر 256 بیت بدون استفاده از هیچ نوع منابع اضافی روی تراشه فراخوانی کرد. همانطور که در شکل زیر نشان داده شده است.
❗️درون هر اسلایس سه مالتی پلکسر عریض با نام های
1⃣ #F7AMUX
2⃣ #F7BMUX
3⃣ #F8MUX
وجود دارد که برای ترکیب کردن خروجی #LUT ها و ساخت حافظه های 128 و 256 بیتی مورد استفاده قرار می گیرند، وجود این مالتی پلکسرهای عریض به طراح اجازه می دهد تا با ترکیب کردن #LUT ها توابع منطقی با 7 و یا 8 ورودی را نیز به راحتی درون یک اسلایس طراحی کند. نام گذاری مالتی پلکسرهای عریض با توجه به تعداد ورودی های آن ها صورت گرفته و عناصر بسیار مهمی در طراحی هستند.
https://www.researchgate.net/publication/321234978/figure/fig1/AS:563666749333511@1511400033789/Partial-diagram-of-a-Xilinx-7-Series-configurable-logic-block-CLB-slice.png
✳️ بحث در رابطه با #CLB ها هنوز به پایان نرسیده و در مقاله بعدی به قابلیت های #CLB ها در انجام عملیات ریاضی و به خصوص عملکرد زنجیره بیت نقلی می پردازیم.
@Hexalinx
🔖 مقاله ایی که خدمتتان ارائه می گردد، با توجه به معماری تراشه های 7 Series و خانواده Spartan 6 تهیه شده است، معماری CLB ها در سایر تراشه های Xilinx تا حدودی متفاوت است، اگر چه شباهت هایی نیز وجود دارد.
تمامی تراشه های FPGA شرکت Xilinx دارای تعداد زیادی بلوک #CLB هستند که هر کدام متشکل از دو اسلایس #Slice هستند. هر اسلایس نیز شامل 4 عدد #LUT شش ورودی، 8 عدد فلیپ فلاپ #FLIP_FLOP ، یک زنجیره بیت نقلی #CARRY_CHAIN و تعدادی مالتی پلکسر عریض #WIDE_MULTIPLEXER است. ساختار داخلی یک LUT در شکل بالا نشان داده شده است.
همانطور که در شکل می بینیم، هر #LUT داری شش ورودی مستقل به نام های D1 تا D6 و دو خروجی مستقل به نام های O5 و O6 می باشد. هر #LUT قابلیت پیاده سازی یک تابع 6 ورودی با هر نوع پیچیدگی را دارد، مثلا تابع f را به صورت زیر در نظر بگیرد.
f=((D1 and D2) or (D3 and not(D4 or D5)) and D6)
با یک مرور کوتاه به درس مدار منطقی به یاد می آوریم که یک جدول درستی با شش ورودی می توانست 64 خروجی مختلف داشته باشد. در حقیقت #LUT ها در FPGA کاملا مشابه جداول درستی با شش ورودی عمل می کنند. علاوه بر این یک #LUT می تواند مشابه یک حافظه با 64 عنصر حافظه نیز عمل کند.
هنگام پیاده سازی یک تابع شش ورودی روی FPGA ، ابتدا جدول درستی این تابع توسط ابزار سنتز در ISE و یا Vivado ساخته می شود و سپس روی #LUT ها نگاشت می شود و در نهایت روی تراشه FPGA پیکره بندی می شود.
نکته دیگری که باید به آن اشاره کرد این است که همانطور که شکل بالا نشان می دهد. یک #LUT شش ورودی می تواند همانند دو عدد #LUT مستقل 5 ورودی نیز مورد استفاده قرار بگیرد، البته این 5 ورودی بین هر دو #LUT مشترک هستند ولی هر #LUT می تواند جدول درستی اختصاصی خودش و البته خروجی اختصاصی خودش یعنی O5 یا O6 را داشته باشد. در حالتی که تابع مورد نظر برای پیاده سازی نیاز به استفاده همزمان از هر دو #LUT داشته باشد، یک #LUT شش ورودی ساخته می شود و تنها خروجی O6 استفاده می شود، ولی در صورت استفاده تکی از #LUT ها هر دو خروجی بکار گرفته می شوند.
از سوی دیگر هر #LUT می تواند در نقش یک حافظه ROM یا RAM جهت ذخیره سازی 64 عدد تک بیت یا 32 عدد دو بیتی استفاده شود. در اینجا هم در حالت اول فقط خروجی O6 و در حالت دوم هر دو خروجی O5 و O6 به صورت همزمان استفاده می شوند. توجه داشته باشید هنگامی که تعداد محدودی عدد چند بیتی (مثلا 128 عدد بیتی) در یک ROM ذخیره می کنیم، در صورت کدنویسی صحیح (تاکید می کنم، حتما باید ساختار کد صحیح باشد) ابزار سنتز به صورت اتوماتیک از #LUT ها جهت این کار استفاده می کند و به نوعی یک حافظه توزیع شده #DISTRIBURD_RAM سنتز می شود ولی اگر تعداد اعداد از یک حدی بیشتر باشند حافظه ROM ما به بلوک های حافظه داخللی نگاشت می شود.
❗️ تعیین آستانه برای انتخاب بین یک حافظه توزیع شده یا بلوک های حافظه به موارد متعددی بستگی دارد که در مقاله ای جداگانه به آن پرداخته می شود.
با ترکیب هر چهار #LUT درون یک اسلایس می توان حافظه های بزرگتری با ظرفیت حداکثر 256 بیت بدون استفاده از هیچ نوع منابع اضافی روی تراشه فراخوانی کرد. همانطور که در شکل زیر نشان داده شده است.
❗️درون هر اسلایس سه مالتی پلکسر عریض با نام های
1⃣ #F7AMUX
2⃣ #F7BMUX
3⃣ #F8MUX
وجود دارد که برای ترکیب کردن خروجی #LUT ها و ساخت حافظه های 128 و 256 بیتی مورد استفاده قرار می گیرند، وجود این مالتی پلکسرهای عریض به طراح اجازه می دهد تا با ترکیب کردن #LUT ها توابع منطقی با 7 و یا 8 ورودی را نیز به راحتی درون یک اسلایس طراحی کند. نام گذاری مالتی پلکسرهای عریض با توجه به تعداد ورودی های آن ها صورت گرفته و عناصر بسیار مهمی در طراحی هستند.
https://www.researchgate.net/publication/321234978/figure/fig1/AS:563666749333511@1511400033789/Partial-diagram-of-a-Xilinx-7-Series-configurable-logic-block-CLB-slice.png
✳️ بحث در رابطه با #CLB ها هنوز به پایان نرسیده و در مقاله بعدی به قابلیت های #CLB ها در انجام عملیات ریاضی و به خصوص عملکرد زنجیره بیت نقلی می پردازیم.
@Hexalinx
#BARE_METAL
#Essentials
✅ آیا واژه bare-metal عنوان یک سیستم عامل است؟ طراحی یک سیستم bare-metal به چه معناست؟ آیا روی FPGA ها طراحی bare-metal انجام می شود؟
✳️ شاید برای شما هم پیش آمده باشد که در زمان مطالعه توصیف یک سیستم دیجیتال به واژه bare-metal برخورد کرده باشید و بدون اینکه معنای آن را درک کنید، از روی آن عبور کرده اید. بسیاری از دانشجویان و حتی طراحان با تجربه FPGA هم درک صحیحی از این واژه ندارند. 👇👇
@Hexalinx
#Essentials
✅ آیا واژه bare-metal عنوان یک سیستم عامل است؟ طراحی یک سیستم bare-metal به چه معناست؟ آیا روی FPGA ها طراحی bare-metal انجام می شود؟
✳️ شاید برای شما هم پیش آمده باشد که در زمان مطالعه توصیف یک سیستم دیجیتال به واژه bare-metal برخورد کرده باشید و بدون اینکه معنای آن را درک کنید، از روی آن عبور کرده اید. بسیاری از دانشجویان و حتی طراحان با تجربه FPGA هم درک صحیحی از این واژه ندارند. 👇👇
@Hexalinx
🔖 سیستم عامل bare-metal
واژه سیستم های bare-metal به سیستم هایی اطلاق می گردد که فاقد سیستم عامل هستند، در این سیستم ها بخش نرم افزاری سیستم نیاز به تعداد زیادی ویژگی ندارد ( مثلا ویژگی های شبکه سازی یا networking که تقریبا به صورت پیش فرض در تمام سیستم عامل ها وجود دارد). به طور کلی سیستم عامل مقدار محدودی از ظرفیت پردازشی پردازنده را مصرف می کند و عدم قطعیت بیشتری نسبت به سایر برنامه های نرم افزاری ساده دارد. اما برخی از سیستم ها مجاز به تحمل این سربار هر چند کوچک ناشی از سیستم عامل نیز، نیستند. این درحالیست که همگام با افزایش پردازش در سیستم های نهفته سربار سیستم عامل ها نیز روز به روز به کاهش می یابد. اما با این وجود بازهم برخی از طراحان به منظور کاهش پیچیدگی های سیستمی در طراحی خود از سیستم عامل استفاده نمی کنند و تمامی ظرفیت پردازشی را صرف هدف اصلی سیستم می کنند، این کاری است که ما تقریبا به صورت معمول برای تمام طراحی های مبتنی بر FPGA استفاده می کینم. پس می توان نتیجه گرفت، طراحی روی FPGA ذاتا bare-metal است مگر اینکه از یک Microblaze و سیستم عامل در آن بهره گرفته شود.
@Hexalinx
واژه سیستم های bare-metal به سیستم هایی اطلاق می گردد که فاقد سیستم عامل هستند، در این سیستم ها بخش نرم افزاری سیستم نیاز به تعداد زیادی ویژگی ندارد ( مثلا ویژگی های شبکه سازی یا networking که تقریبا به صورت پیش فرض در تمام سیستم عامل ها وجود دارد). به طور کلی سیستم عامل مقدار محدودی از ظرفیت پردازشی پردازنده را مصرف می کند و عدم قطعیت بیشتری نسبت به سایر برنامه های نرم افزاری ساده دارد. اما برخی از سیستم ها مجاز به تحمل این سربار هر چند کوچک ناشی از سیستم عامل نیز، نیستند. این درحالیست که همگام با افزایش پردازش در سیستم های نهفته سربار سیستم عامل ها نیز روز به روز به کاهش می یابد. اما با این وجود بازهم برخی از طراحان به منظور کاهش پیچیدگی های سیستمی در طراحی خود از سیستم عامل استفاده نمی کنند و تمامی ظرفیت پردازشی را صرف هدف اصلی سیستم می کنند، این کاری است که ما تقریبا به صورت معمول برای تمام طراحی های مبتنی بر FPGA استفاده می کینم. پس می توان نتیجه گرفت، طراحی روی FPGA ذاتا bare-metal است مگر اینکه از یک Microblaze و سیستم عامل در آن بهره گرفته شود.
@Hexalinx
#Basic
✅ معرفی اجمالی جریان طراحی روی FPGA
معمولا یکی از اولین دروسی که در دوره های مقدماتی FPGA ارائه می شود، آشنا کردن دانشجویان با گام های پیاده سازی است. در مقاله کوتاهی که در ادامه خدمتتان اراده می شود، فهرستی از گام های مورد نیاز برای اجرای صفر تا صد یک پروژه روی FPGA به صورت خلاصه توضیح داده می شود.
@Hexalinx
✅ معرفی اجمالی جریان طراحی روی FPGA
معمولا یکی از اولین دروسی که در دوره های مقدماتی FPGA ارائه می شود، آشنا کردن دانشجویان با گام های پیاده سازی است. در مقاله کوتاهی که در ادامه خدمتتان اراده می شود، فهرستی از گام های مورد نیاز برای اجرای صفر تا صد یک پروژه روی FPGA به صورت خلاصه توضیح داده می شود.
@Hexalinx
#FPGA_FLOW
🔖 بخش اول
❗️ گام اول، طراحی دیجیتال عملکرد مورد انتظار سیستم توسط مهندس طراح است، برای طراحی مناسب دو دسته اطلاعات نیاز داریم، 1- دانش های آکادمیک طراحی دیجیتال و 2- شناخت کافی از معماری و قابلیت های تراشه هدف. علاوه بر این الزامات پروژه و محدودیت های آن نیز باید در نظر گرفته شود، در عمل این گام مهمترین گام طراحی است در حالی کمتر به آن توجه می شود.
❗️ گام دوم کد نویسی به زبان VHDL و یا Verilog است، در این گام طراح علاوه بر تسلط به زبان توصیف سخت افزاری باید با اصول استفاده از IP Core ها، نحوه به اشتراک گذاری منابع، نحوه فراخوانی عناصر پایه موجود در تراشه نظیر بلوک های ضرب کننده و بافرهای کلاک و غیره آشنا باشد، وجه تمایز یک برنامه نویس خوب با برنامه نویس معمولی دقیقا در این گام نمایان می شود. این گام عملا دومین گام مهم در طراحی است.
❗️ گام سوم به کدنویسی و طراحی testbench اختصاص دارد. در طراحی های دیجیتال پیچیده، طراحی testbench به اندازه طراحی خود سیستم پرچالش و حائز اهمیت است، به صورت پیش فرض به محض اینکه حرف از تست مدار به میان می آید، فکر می کنیم وظیفه ما اثبات عملکرد صحیح مدار است، در حالی که این باور کاملا اشتباه است، در حقیقت ما با نوشتن testbench و انجام شبیه سازی های سخت گیرانه به دنبال پیدا کردن خطاهای احتمالی سیستم هستیم و تنها زمانی می توانیم از صحت کارکرد سیستم اطمینان حاصل کنیم که هیچ خطایی پیدا نکنیم. فراموش نکنیم توانمندی در نوشتن testbench خوب یک هنر است. این قضیه به حدی مهم است که زبان هایی همچون System Verilog و System C به طور اختصاصی برای این منظور توسعه داده شده اند.
❗️ گام چهار کامپایل یا سنتز کدها توسط ابزار سنتز است. خروجی این مرحله نت لیست سنتز نام دارد و توصیفی از منابع مورد نیاز برای پیاده سازی سیستم روی تراشه را تولید می کند. به صورت پیش فرض طراح هیچ نقشی در این گام ایفا نمی کند، مگر اینکه نیاز باشد با اعمال یکسری تنظیمات روی ابزار سنتز عملکرد آن را سفارشی کند، اعمال این تنظیمات غالبا نیاز به تسلط مهندس طراح به ابزار سنتز مورد استفاده دارد. طراح برای مسلط شدن به این تنظیمات نیازمند اجرای پروژه های عملی متعدد و صرف زمان کافی است.
❗️ گام پنجم بازهم به شبیه سازی کارکرد مدار اختصاص دارد ولی تقریبا هیچ گاه توسط مهندسان طراح در یک پروژه عملی اجرا نمی شود، این گام تنها در پروژه های آکادمیک و دانشگاهی جهت شبیه سازی عملکرد سیستم بعد از سنتز اجرا می شود. به صورت کلی بعد از سنتز با اعمال تاخیر ذاتی گیت ها و ریست اولیه به سیستم رفتار طرح تا حدودی دستخوش تغییر می شود.
در بخش دوم مقاله که فردا منتشر می شود گام های بعدی توضیح داده می شود، از همراهی شما سپاسگزاریم
@Hexalinx
🔖 بخش اول
❗️ گام اول، طراحی دیجیتال عملکرد مورد انتظار سیستم توسط مهندس طراح است، برای طراحی مناسب دو دسته اطلاعات نیاز داریم، 1- دانش های آکادمیک طراحی دیجیتال و 2- شناخت کافی از معماری و قابلیت های تراشه هدف. علاوه بر این الزامات پروژه و محدودیت های آن نیز باید در نظر گرفته شود، در عمل این گام مهمترین گام طراحی است در حالی کمتر به آن توجه می شود.
❗️ گام دوم کد نویسی به زبان VHDL و یا Verilog است، در این گام طراح علاوه بر تسلط به زبان توصیف سخت افزاری باید با اصول استفاده از IP Core ها، نحوه به اشتراک گذاری منابع، نحوه فراخوانی عناصر پایه موجود در تراشه نظیر بلوک های ضرب کننده و بافرهای کلاک و غیره آشنا باشد، وجه تمایز یک برنامه نویس خوب با برنامه نویس معمولی دقیقا در این گام نمایان می شود. این گام عملا دومین گام مهم در طراحی است.
❗️ گام سوم به کدنویسی و طراحی testbench اختصاص دارد. در طراحی های دیجیتال پیچیده، طراحی testbench به اندازه طراحی خود سیستم پرچالش و حائز اهمیت است، به صورت پیش فرض به محض اینکه حرف از تست مدار به میان می آید، فکر می کنیم وظیفه ما اثبات عملکرد صحیح مدار است، در حالی که این باور کاملا اشتباه است، در حقیقت ما با نوشتن testbench و انجام شبیه سازی های سخت گیرانه به دنبال پیدا کردن خطاهای احتمالی سیستم هستیم و تنها زمانی می توانیم از صحت کارکرد سیستم اطمینان حاصل کنیم که هیچ خطایی پیدا نکنیم. فراموش نکنیم توانمندی در نوشتن testbench خوب یک هنر است. این قضیه به حدی مهم است که زبان هایی همچون System Verilog و System C به طور اختصاصی برای این منظور توسعه داده شده اند.
❗️ گام چهار کامپایل یا سنتز کدها توسط ابزار سنتز است. خروجی این مرحله نت لیست سنتز نام دارد و توصیفی از منابع مورد نیاز برای پیاده سازی سیستم روی تراشه را تولید می کند. به صورت پیش فرض طراح هیچ نقشی در این گام ایفا نمی کند، مگر اینکه نیاز باشد با اعمال یکسری تنظیمات روی ابزار سنتز عملکرد آن را سفارشی کند، اعمال این تنظیمات غالبا نیاز به تسلط مهندس طراح به ابزار سنتز مورد استفاده دارد. طراح برای مسلط شدن به این تنظیمات نیازمند اجرای پروژه های عملی متعدد و صرف زمان کافی است.
❗️ گام پنجم بازهم به شبیه سازی کارکرد مدار اختصاص دارد ولی تقریبا هیچ گاه توسط مهندسان طراح در یک پروژه عملی اجرا نمی شود، این گام تنها در پروژه های آکادمیک و دانشگاهی جهت شبیه سازی عملکرد سیستم بعد از سنتز اجرا می شود. به صورت کلی بعد از سنتز با اعمال تاخیر ذاتی گیت ها و ریست اولیه به سیستم رفتار طرح تا حدودی دستخوش تغییر می شود.
در بخش دوم مقاله که فردا منتشر می شود گام های بعدی توضیح داده می شود، از همراهی شما سپاسگزاریم
@Hexalinx
#FPGA_FLOW
🔖 بخش دوم
❗️گام ششم، پیاده سازی طرح توسط ابزارهای پیاده سازی است، ابزارهای پیاده سازی منحصرا توسط شرکت های سازنده تراشه های FPGA تولید می شوند. این ابزارها با توجه به تکنولوژی ساخت تراشه و یکسری الگوریتم هوشمند اقدام به پیاده سازی مدارات دیجتال روی تراشه هدف می کنند. فرایند پیاده سازی در سه فاز انجام می شود، در فاز اول نت لیست های تولید شده در گام چهارم در غالب یک نت لیست واحد با هم ترکیب می شوند، سپس در فاز دوم عمل نگاشت این نت لیست به منابع داخل تراشه انجام می شود و در فاز سوم جانمایی مناسب منابع روی تراشه و مسیریابی بین آن ها انجام می شود. تعیین موقعیت پورت های سیستم روی پین های تراشه نیز در همین گام انجام می شود. همچون مرحله سنتز هر سه فاز پیاده سازی به صورت اتوماتیک توسط ابزار پیاده سازی اجرا می شود، اما یک تفاوت بسیار مهم وجود دارد. پیاده سازی مدارات روی تراشه با توجه به یکسری استراتژی صورت می پذیرد، که جزئیات این استراتژی ها توسط طراح قابل کنترل است. در اکثر موارد پیاده سازی با تنظیمات پیش فرض با موفقیت همراه است، اما در صورتی که نتایج مطلوب حاصل نشود، کار کمی سخت می شود. طراحان حرفه ای در گام پیاده سازی با تعریف یکسری قیود ابزار پیاده سازی را به صورت سفارشی راهنمایی می کنند، تا در نهایت بهترین جانمایی و مسیریابی ممکن حاصل شود. دو پارامتر مهم برای سنجش موفقیت یا عدم موفقیت در گام پیاده سازی وجود دارد، که اولی دستیابی به فرکانس کاری مطلوب و دومی به حداقل رساندن منابع مصرفی روی تراشه است. به طور کلی گستره وسیعی از تنطیمات باید در این گام انجام شود، و طراح باید با دقت عملکرد و کارایی مورد نظرش را برای ابزار توصیف کند تا خروجی کار مطلوب باشد، این گام سومین گام مهم در طراحی است.
❗️در گام هفتم طراح برای سنجش صحت عملکرد سیستم بعد از اتمام فاز جانمایی و مسیریابی، اقدام به شبیه سازی زمانی سیستم می کند، در این شبیه سازی رفتار واقعی سیستم روی تراشه در محیط نرم افزاری بررسی می شود، مثال های متعددی وجود دارد که در آن با وجود عملکرد صحیح مدار در گام سوم، در این گام پاسخ مطلوب حاصل نمی شود، دلیل آن نیز غالبا زیاد بودن تاخیرهای موجود در سیستم است. بخش قابل ملاحظه ای از این تاخیرها به دلیل جانمایی نامناسب و طولانی بودن مسیرهای ارتباطی بین عناصر است. در صورت بروز چنین مشکلی عملا کل طرح زیر سوال می رود و لازم است یک بازنگری کامل روی مسیرهای بحرانی و گلوگاه های طراحی صورت بپذیرد. البته لازم به ذکر است که این مرحله اغلب توسط طراحان با تجربه که تا حدود زیادی به صحت عملکرد سیستم اطمینان دارند، اجرا نمی شود، دلیل اصلی آن نیز کند بودن بیش از حد پروسه شبیه سازی زمانی است، برای مدارهای با پیچیدگی متوسط ممکن است این شبیه سازی یک روز کامل زمان نیاز داشته باشد.
❗️گام هشتم به تولید بیت فایل خروجی و پیکره بندی تراشه FPGA اختصاص دارد، تنظیماتی که طراح در این بخش انجام می دهد نسبتا محدود است و غالبا در ارتباط با فرمت فایل پیکره بندی خروجی است، در این گام کاربر با توجه به تراشه FPGA خود فرمت فایل خروجی را انتخاب و به صورت اتوماتیک با چند کلیک فایل را روی تراشه پیکره بندی یا در اصطلاح دانلود می کند، از آنجایی که تراشه های FPGA دارای حافطه دائمی نیستند معمولا از یک حافظه جانبی برای ذخیزه سازی فایل پیکره بندی و انتقال آن به FPGA استفاده می شود، از این رو انتظار می رود مهندس طراح فایل مناسب برای حافظه های فلش جانبی را نیز تولید کند.
❗️اگر خوش شانس باشیم و همه فرضیات طراحی را درست اجرا کرده باشیم، نیازی به اجرای گام نهم نداریم، در پروژه های کوچک که تعداد فانکشن های سیستم محدود است و یک عملکرد نه چندان پیچیده مورد نیاز است، می توانیم به خوش شانسی خودمان امیدورام باشیم، اما اگر فقط کمی تعداد ورودی خروجی ها و سیگنال های کنترلی سیستم افزایش پیدا کند، بروز خطا کاملا اجتناب ناپذیر می شود، به این ترتیب برای پیدا کردن منشا خطا چاره ای به جز اجرای گام نهم نداریم، در گام نهم طراح با توجه به شناخت خودش از سیستم اقدام به خطایابی سخت افزاری می کند، یعنی با بررسی و مانیتور کردن مدارات پیاده سازی شده روی FPGA به دنبال دلیل بروز خطا می گردد، موفقیت در این مرحله به معنای اتمام کامل کار طراحی و پیاده سازی یک پروژه است. دو IP Core معروف ILA و VIO به عنوان مهمترین ابزارهای خطایابی Xilinx به شکل گسترده ای در این گام مورد استفاده قرار می گیرند.
@Hexalinx
🔖 بخش دوم
❗️گام ششم، پیاده سازی طرح توسط ابزارهای پیاده سازی است، ابزارهای پیاده سازی منحصرا توسط شرکت های سازنده تراشه های FPGA تولید می شوند. این ابزارها با توجه به تکنولوژی ساخت تراشه و یکسری الگوریتم هوشمند اقدام به پیاده سازی مدارات دیجتال روی تراشه هدف می کنند. فرایند پیاده سازی در سه فاز انجام می شود، در فاز اول نت لیست های تولید شده در گام چهارم در غالب یک نت لیست واحد با هم ترکیب می شوند، سپس در فاز دوم عمل نگاشت این نت لیست به منابع داخل تراشه انجام می شود و در فاز سوم جانمایی مناسب منابع روی تراشه و مسیریابی بین آن ها انجام می شود. تعیین موقعیت پورت های سیستم روی پین های تراشه نیز در همین گام انجام می شود. همچون مرحله سنتز هر سه فاز پیاده سازی به صورت اتوماتیک توسط ابزار پیاده سازی اجرا می شود، اما یک تفاوت بسیار مهم وجود دارد. پیاده سازی مدارات روی تراشه با توجه به یکسری استراتژی صورت می پذیرد، که جزئیات این استراتژی ها توسط طراح قابل کنترل است. در اکثر موارد پیاده سازی با تنظیمات پیش فرض با موفقیت همراه است، اما در صورتی که نتایج مطلوب حاصل نشود، کار کمی سخت می شود. طراحان حرفه ای در گام پیاده سازی با تعریف یکسری قیود ابزار پیاده سازی را به صورت سفارشی راهنمایی می کنند، تا در نهایت بهترین جانمایی و مسیریابی ممکن حاصل شود. دو پارامتر مهم برای سنجش موفقیت یا عدم موفقیت در گام پیاده سازی وجود دارد، که اولی دستیابی به فرکانس کاری مطلوب و دومی به حداقل رساندن منابع مصرفی روی تراشه است. به طور کلی گستره وسیعی از تنطیمات باید در این گام انجام شود، و طراح باید با دقت عملکرد و کارایی مورد نظرش را برای ابزار توصیف کند تا خروجی کار مطلوب باشد، این گام سومین گام مهم در طراحی است.
❗️در گام هفتم طراح برای سنجش صحت عملکرد سیستم بعد از اتمام فاز جانمایی و مسیریابی، اقدام به شبیه سازی زمانی سیستم می کند، در این شبیه سازی رفتار واقعی سیستم روی تراشه در محیط نرم افزاری بررسی می شود، مثال های متعددی وجود دارد که در آن با وجود عملکرد صحیح مدار در گام سوم، در این گام پاسخ مطلوب حاصل نمی شود، دلیل آن نیز غالبا زیاد بودن تاخیرهای موجود در سیستم است. بخش قابل ملاحظه ای از این تاخیرها به دلیل جانمایی نامناسب و طولانی بودن مسیرهای ارتباطی بین عناصر است. در صورت بروز چنین مشکلی عملا کل طرح زیر سوال می رود و لازم است یک بازنگری کامل روی مسیرهای بحرانی و گلوگاه های طراحی صورت بپذیرد. البته لازم به ذکر است که این مرحله اغلب توسط طراحان با تجربه که تا حدود زیادی به صحت عملکرد سیستم اطمینان دارند، اجرا نمی شود، دلیل اصلی آن نیز کند بودن بیش از حد پروسه شبیه سازی زمانی است، برای مدارهای با پیچیدگی متوسط ممکن است این شبیه سازی یک روز کامل زمان نیاز داشته باشد.
❗️گام هشتم به تولید بیت فایل خروجی و پیکره بندی تراشه FPGA اختصاص دارد، تنظیماتی که طراح در این بخش انجام می دهد نسبتا محدود است و غالبا در ارتباط با فرمت فایل پیکره بندی خروجی است، در این گام کاربر با توجه به تراشه FPGA خود فرمت فایل خروجی را انتخاب و به صورت اتوماتیک با چند کلیک فایل را روی تراشه پیکره بندی یا در اصطلاح دانلود می کند، از آنجایی که تراشه های FPGA دارای حافطه دائمی نیستند معمولا از یک حافظه جانبی برای ذخیزه سازی فایل پیکره بندی و انتقال آن به FPGA استفاده می شود، از این رو انتظار می رود مهندس طراح فایل مناسب برای حافظه های فلش جانبی را نیز تولید کند.
❗️اگر خوش شانس باشیم و همه فرضیات طراحی را درست اجرا کرده باشیم، نیازی به اجرای گام نهم نداریم، در پروژه های کوچک که تعداد فانکشن های سیستم محدود است و یک عملکرد نه چندان پیچیده مورد نیاز است، می توانیم به خوش شانسی خودمان امیدورام باشیم، اما اگر فقط کمی تعداد ورودی خروجی ها و سیگنال های کنترلی سیستم افزایش پیدا کند، بروز خطا کاملا اجتناب ناپذیر می شود، به این ترتیب برای پیدا کردن منشا خطا چاره ای به جز اجرای گام نهم نداریم، در گام نهم طراح با توجه به شناخت خودش از سیستم اقدام به خطایابی سخت افزاری می کند، یعنی با بررسی و مانیتور کردن مدارات پیاده سازی شده روی FPGA به دنبال دلیل بروز خطا می گردد، موفقیت در این مرحله به معنای اتمام کامل کار طراحی و پیاده سازی یک پروژه است. دو IP Core معروف ILA و VIO به عنوان مهمترین ابزارهای خطایابی Xilinx به شکل گسترده ای در این گام مورد استفاده قرار می گیرند.
@Hexalinx
#CLB, #LUT
#CARRY_CHAIN
✅ اگر بخش اول این مقاله را که در ابتدای هفته تحت عنوان " LUT ها مهمترین عناصر پیاده سازی هستند " منتشر شد، مطالعه نکردید، پیشنهاد می کنم برای حفظ پیوستگی مطالب، چند دقیقه ای بیشتر وقت صرف کنید و ابتدا مقاله اول ما در رابطه با #CLB و #LUT را مطالعه بفرمایید.
✳️ به شما قول داده بودیم در رابطه با نحوه استفاده از LUT ها برای اجرای محاسبات ریاضی مقاله ای منتشر کنیم و در آن اهمیت وجود زنجیره نقلی #CARRY_CHAIN در CLB ها و کاربرد آن را بیان کنیم، خب بیش از این شما را منظر نمی گذاریم و مستقیما به سراغ این موضوع می رویم. 👇
@Hexalinx
#CARRY_CHAIN
✅ اگر بخش اول این مقاله را که در ابتدای هفته تحت عنوان " LUT ها مهمترین عناصر پیاده سازی هستند " منتشر شد، مطالعه نکردید، پیشنهاد می کنم برای حفظ پیوستگی مطالب، چند دقیقه ای بیشتر وقت صرف کنید و ابتدا مقاله اول ما در رابطه با #CLB و #LUT را مطالعه بفرمایید.
✳️ به شما قول داده بودیم در رابطه با نحوه استفاده از LUT ها برای اجرای محاسبات ریاضی مقاله ای منتشر کنیم و در آن اهمیت وجود زنجیره نقلی #CARRY_CHAIN در CLB ها و کاربرد آن را بیان کنیم، خب بیش از این شما را منظر نمی گذاریم و مستقیما به سراغ این موضوع می رویم. 👇
@Hexalinx