اگر کمی با ابزارهای الکترونیکی و میکروکنترلرها کار کرده باشید، شاید برای شما هم پیش آمده باشد که بخواهید تعداد زیادی عملیات را به طور همزمان انجام دهید. مثل من که برای اولین بار میخواستم دادههای تعداد زیادی سنسور متصل به یک ربات را به طور همزمان بخوانم و پردازش کنم. حتما میدانید که همزمانی در میکروکنترلر معنی ندارد و در واقع همه کارها پشت سر هم انجام میشود. در نتیجه اتفاقی که واقعا میافتاد این بود که تمام سنسورهای من باید منتظر میماندند تا دادههای قبلی پردازش شود. برای کارهای کوچک شاید این مسئله زیاد به چشم نیاید اما وقتی حجم اطلاعات بیشتر شود به یک مسئله جدی تبدیل میشود. بعد از این موضوع بود که متوجه شدم چیزی که من به آن نیاز داشتم یک برد FPGA بوده است.
اگر طراحی برد الکترونیکی برایتان جذابیت دارد، FPGA یکی از موضوعاتی است که باید در مورد آن بدانید. در این مطلب در مورد موارد زیر صحبت خواهیم کرد:
کاربردهای FPGA چیست؟
FPGA چه مزایا و معایبی دارد؟
برنامه نویسی FPGA
FPGA چطور کار میکند؟
FPGA یا field programmable gate array تراشههای نیمهرسانایی هستند که از تعداد زیادی جزء کوچک الکترونیکی به نام بلوک منطقی (Logic Block) یا سلول منطقی (Logic cell) ساخته شدهاند. از نظر من FPGA چیزی بین یک مدار الکترونیکی و یک میکروکنترلر است. همان طور که از نام آن برمیآید FPGA یک تراشه قابل برنامهریزی است.
کوچکترین جزء سازنده میکروکنترلرها و همین طور پردازندهها (CPU) المانهای الکترونیکی به نام گیتمنطقی (Logic gate) است. این گیت ها سادهترین اعمال منطقی مانند AND و OR را انجام میدهند. از همین المانها برای انجام اعمال ساده ریاضی مثل جمع و ضرب استفاده میشود و در نهایت مجموعه بزرگی از این گیت ها یک فرایند پیچیده را تشکیل میدهند. ساختار داخلی CPU ها و میکروکنترلرها در کارخانه سازنده به طور کامل طراحی شده و تمام گیتها به نحو خاصی و طبق معماری مشخصی ساخته شده و قابل تغییر نیستند.
اصلیترین تمایز FPGA با موارد قبل این است که در این حالت، تراشه یک ساختار خام دارد و شما میتوانید ساختار و معماری و نحوه ارتباطات بین گیتهای منطقی را خودتان تعریف کنید. نتیجه این تمایز این میشود که FPGA یک برد از پیش آماده نیست، بلکه با انتخاب و طراحی کاربر، میتواند مثل یک مدار الکترونیکی ساده یا یک واحد پردازش سیگنال و یا حتی مثل یک CPU عمل کند. از طرفی FPGA قابلیت برنامهریزی مجدد را نیز دارد که دست طراح را برای انجام تغییرات باز میگذارد.
بردهای FPGA توانایی انجام کارهایی را دارند که انجام آنها با ابزارهای دیگر بسیار مشکل یا غیرممکن است؛ اما در عین حال مثل هر چیز دیگری بدون عیب هم نیست.
مهمترین عاملی که باعث میشود افراد به سراغ برد FPGA بروند سرعت بسیار بالای آن است که به هیچ وجه با یک میکروکنترلر قابل مقایسه نیست. علت سرعت بالای FPGA این است که اعمال مورد نظر مستقیما از طریق المانهای الکترونیکی انجام شده و پردازش به مفهومی که در CPU تعریف میشود، وجود ندارد. انجام یک پردازش در CPU یا میکروکنترلر نیازمند زمان است که فرایند را کند میکند؛ در حالی که در FPGA عملیاتها تقریبا به صورت بلادرنگ انجام میشوند (مثلا در حد چند نانوثانیه).
بردهای FPGA معمولا تعداد بسیار زیادی پایه دارند. این باعث میشود تا بتوانید تعداد زیادی ورودی به آن داده و برای هر کدام از آنها عملیات مورد نظرتان را به طور مستقل انجام دهید. بنابراین هیچ ورودی برای پردازش منتظر سایر اعمال نمیماند و همه به طور همزمان انجام میشوند. این مورد برای کارهایی مثل پردازش تعداد زیادی سنسور، مزیت خیلی بزرگی به حساب میآید.
اینکه FPGA دقیقا چه کاری انجام دهد کاملا به طراح بستگی دارد. از این نظر FPGA به هیچ کدام از بردهای الکترونیکی دیگر شباهت ندارد. تفاوت FPGA با تراشهها و بردهای از پیش آماده مثل CPU مثل تفاوت مداری است که روی بردبورد میبندید با یک برد مدار چاپی الکترونیکی (PCB). طبیعتا مورد اول را میتوانید به هر صورتی که میخواهید تغییر دهید.
اگر بخواهید یک برد الکترونیکی معمولی به منظور خاصی بسازید، پس از ساخت برد ممکن است ایرادی در طراحی آن وجود داشته باشد. در این صورت مجبورید طرح را اصلاح کرده و مجددا برد جدید را بسازید. این کار زمان و هزینه زیادی را از شما تلف میکند. در صورتی که ایجاد تغییرات در FPGA بدون تغییر سختافزار و با همان برد قابل انجام است.
CPU ها تراشههای چندمنظوره (General Purpose) هستند. بنابراین سیستمعامل میتواند به نحوهای که ترجیح میدهد آن را کنترل کند و برنامههای مختلف میتوانند به گونهای که نیاز دارند از آن استفاده کنند. کاری که CPU انجام میدهد در زمانهای مختلف متفاوت است و حتی فرکانس کاری (که سرعت آن را تعیین میکند) و میزان استفاده از آن (Utilization) همواره در حال تغییر است. در سوی مقابل FPGA همیشه یک عمل ثابت را انجام میدهد و در صورتی که بخواهید عملکرد آن را تغییر دهید باید طراحی گیتهای آن اصلاح شود. تکمنظوره بودن الزاما نقطه ضعف نیست بلکه در بعضی شرایط نقطه قوت محسوب میشود. از این نظر FPGA شبیه به تراشههای ASIC است.
ASIC نوعی پردازنده نیمههادی است که برای کاربرد خاصی ساخته میشود. ASIC مثل FPGA تکمنظوره است با این تفاوت که پس از ساخت، دیگر قابل تغییر نیست و همیشه فقط همان عملکرد را دارد.
طراحی FPGA معمولا با استفاده از یکی از زبانهای VHDL یا Verilog انجام میشود. این زبانها با زبانهای برنامهنویسی متداول تفاوت داشته و معمولا درک آن سختتر است. به این زبانها، زبانهای توصیف سختافزار (Hardware Description Language) میگویند. به دلیل پیچیدگی این زبانها، معمولا طراحی یک برد FPGA حتی برای یک عملکرد ساده مشکل است.
بردهای FPGA تنوع زیادی دارند اما به طور معمول قیمت خیلی بیشتری نسبت به انواع میکروکنترلرها دارند. برای مثال قیمت برد توسعه spartan-6 که از نوع FPGA و ساخت شرکت Xilinx است نسبت به برد توسعه Discovery STM32 بیش از 16 برابر است. بنابراین فقط در صورتی که حتما به FPGA نیاز دارید از آن استفاده کنید.
بردهای FPGA تقریبا در هر کاربردی که نیاز به پردازش وجود داشته باشد میتوانند استفاده شوند. تنها باید دید که با توجه به مزایا و معایب، آیا استفاده از FPGA معقول و به صرفه است یا نه.
یکی از مواردی که FPGA استفاده میشود ساخت نمونه اولیه از یک مدار است که بعدا قرار است ساخته شود. FPGA امکان سعی و خطا در طراحی را به سازنده محصول میدهد. بجز این، هر جا که نیاز به پردازشهای همزمان و زیاد باشد، این روش استفاده شده است. مخصوصا در صنایع پیشرفته، دستگاههای الکترونیکی و ماشینآلات بزرگ، FPGA بسیار کاربردی است. صنایع هوا و فضا، مخابرات، صنعت خودرو، دوربینهای دیجیتال، ابررایانهها، کاربردهای پردازش تصویر، دستگاههای تصویربرداری پزشکی و رباتیک بخشی از مواردی است که FPGA به صورت گسترده استفاده میشود.
در حال حاضر ساخت بردهای FPGA عمدتا محدود به چند شرکت بزرگ است. مهمترین آنها شرکت Xilinx است که سالهاست سردمدار بردهای FPGA در دنیاست. رقیب Xilinx شرکت Altera است که بعدا توسط غول پردازندههای دنیا یعنی Intel خریداری شد. حدود 90 درصد کل بازار FPGA در اختیار این شرکت است. شرکت بزرگ Microchip نیز که تولیدکننده میکروکنترلر و انواع IC است، در این حوزه مطرح است اما هنوز بازار زیادی را در اختیار نگرفته است.
تنوع زیادی از بردهای FPGA وجود دارند که در اینجا چند نمونه مختلف آنها را معرفی میکنیم:
Perf-V یک برد نسبتا کوچک برای کسانی است که قصد دارند کار با FPGA را شروع کنند. این برد حدود 33 هزار واحد منطقی و 1800 کیلوبایت حافظه رم دارد. این برد توسط تیمهای opensource طراحی و توسعه داده شده است.
این برد برای کسانی که کارهای DIY انجام میدهند و با آردوینو آشنایی دارند خیلی جذاب است. ظاهر برد شباهت زیادی به آردوینو Uno دارد. در واقع این دو برد هماندازهاند. برد Spartan Edge طوری طراحی شده است تا بتوان آن را هم به عنوان یک شیلد برای آردوینو Uno استفاده کرد و هم به عنوان یک برد مجزا.
شیلدها بردهای ثانویهای هستند که بر روی برد اصلی نصب شده و یک قابلیت خاص را به آن اضافه میکنند.
این برد امکانات زیادی را بر روی خود دارد؛ برای مثال تراشه ESP32 که قابلیت اتصال وایفای 2.4GHz و بلوتوث را ایجاد میکند، یک ورودی آنالوگ به دیجیتال، یک درگاه مینی HDMI، شتابسنج 6 محوره و درگاه اتصال به دوربین.
برد A1 تعداد خیلی کمی واحد منطقی (256 تا) و 2 کیلوبایت حافظه رم دارد. طبیعتا کار پردازشی سنگینی با این برد نمیتوانید انجام دهید اما برای آموزش یا برای تعداد کم داده موازی (حداکثر 18 ورودی/خروجی) انتخاب خوبی است. این برد جزء ارزانترین بردهای FPGA است.
این برد یک غول پردازشی ساخت شرکت Xilinx است. Alveo بیش از 1 میلیون واحد منطقی، 8 گیگابایت حافظه سریع HBM2 و 32 گیگابایت حافظه رم در خود دارد. این برد به طور خاص برای کاربردهایی که نیاز به پردازشهای سنگین موازی دارند مانند روشهای یادگیری ماشین، طراحی شده است. طبیعتا مصرف برق این برد و قیمت آن نیز به طور قابل توجهی بالاست: 225 وات مصرف انرژی و بیش از 7500 دلار قیمت! این برد دارای درگاه PCI-E نسل چهارم است و از این طریق به کامپیوتر قابل اتصال است.
دو زبان عمده برای توصیف سخت افزار FPGA وجود دارد: VHDL و VHDL .Verilog زبانی است که توسط وزارت دفاع آمریکا توسعه پیدا کرده است. زبان Verilog نیز توسط موسسه مهندسان برق و الکترونیک (IEEE) استاندارد شده است. معمولا از همین دو زبان برای طراحی FPGA استفاده میشود. زبانهای توصیف سخت افزار تفاوتهای اساسی با سایر زبانهای برنامه نویسی دارند. تفاوت عمده این نوع زبان این است که میتوانند تاخیر انتشار (propagation delay) و قدرت سیگنال (signal strength) را نیز تعریف کنند. این تفاوتها هنگام نوشتن کد باید در نظر گرفته شوند.
با اینکه زبان Verilog و VHDL شباهت زیادی دارند اما Verilog بیشتر برای طراحی تراشه و VHDL بیشتر برای کار با FPGA استفاده میشوند هرچند که هر دو برای هر دو کار قابل استفاده هستند.
اگر بخواهیم برای کسی که چیزی در مورد FPGA نمیداند کارکرد آن را توضیح دهیم باید بگوییم که این برد مجموعهای از گیتهای منطقی است که به نحو خاصی که ما تعیین میکنیم با هم کار میکنند. این تعریف مقدار زیادی ساده شده است. توضیح دقیقتر این است که در FPGA میتوان سه عنصر تشکیل دهنده در نظر گرفت: جدول صحت یا Look Up Table (LUT)، فلیپ فلاپ (Flip Flop) و Routing Matrix.
جدول صحت، تعیین میکند که عملکرد هر جزء FPGA چطور باشد. هر LUT تعدادی ورودی و یک خروجی دارد. ارتباط ورودیها و خروجی LUT هر چیزی میتواند باشد. درون هر LUT یک حافظه وجود دارد که ارتباط ورودی و خروجی آن را ذخیره میکند. تعداد ورودیهای LUT را با عددی که بعد از آن میآید مشخص میکنند. مثلا یک LUT6، یک جدول صحت با 6 ورودی و یک خروجی است. یک LUT با دو ورودی میتواند به صورت شکل زیر باشد.
از آنجایی که مقدار داخل حافظه LUT میتواند هر چیزی باشد، با یک LUT دو ورودی میتوان هر گیت منطقی را ایجاد کرد. برای مثال میتوان یک گیت AND را با مقادیر حافظه زیر ایجاد کرد:
از آنجایی که خروجی LUT میتواند هرچیزی باشد، میتواند حالتهایی غیر از گیتهای منطقی را ایجاد کند که اگر میخواستیم آن را با استفاده از گیتهای استاندارد بسازیم، به بیش از یک گیت نیاز داشتیم. بنابراین مفهوم LUT چیزی فراتر از گیتهای منطقی است. به همین دلیل سنجش FPGA با تعداد گیت منطقی روش درستی نیست و معمولا تعداد LUT مدنظر قرار میگیرد.
خروجی هر LUT را میتوان به یک فلیپ فلاپ وصل کرد. برای ساختن واحدهای محاسباتی مثل جمع کننده یا ضرب کننده این کار الزامی است. مجموعهای متشکل از چند LUT و فلیپ فلاپ یک اسلایس (Slice) را تشکیل میدهند. برای مثال در spartan 6 که یک FPGA معمولی و پراستفاده است، هر اسلایس از 4 LUT6 و 8 فلیپ فلاپ تشکیل شده است. در این برد، 1430 اسلایس و 5720 LUT وجود دارد.
نکته مهمی که همچنان باقی میماند این است که صرف تعیین عملکرد هر اسلایس در FPGA برای کار کردن آن کافی نیست. بلکه باید ارتباط آنها با یکدیگر نیز مشخص شود. در FPGA هر دو اسلایس در یک واحد دیگر به نام CLB یا Complex Logic Block قرار میگیرند. هر CLB به یک ماتریس سوئیچ (Switch Matrix) متصل است که وظیفه دارد آن را به سایر نقاط مدار وصل کند. این سوئیچ میتواند هر ورودی یا خروجی این واحد را از طریق یک ماتریس روتینگ کلی (General Routing Matrix) به ورودی و خروجیهای سایر واحدها یا به همدیگر وصل کند. این ماتریس کلی مثل شبکهای تمام برد را به هم مرتبط میکند. مثل این است که تعدادی سیم و کلید در اختیار داشته باشید و بخواهید بخشهای یک مدار را به هم وصل کنید. از این طریق ارتباط کل مجموعه مشخص شده و در واقع تمام FPGA مثل یک مدار الکترونیکی واحد خواهد شد.
ماتریس روتینگ FPGA تا حد زیادی پیچیده است اما عنصر سازنده آن سیم و مالتیپلکسر است. مالتیپلکسر یک واحد الکترونیکی است با تعدادی ورودی و یک خروجی که در هر لحظه یک ورودی خاص آن به خروجی متصل است. از مالتیپلکسر برای آدرسدهی استفاده میشود به همین دلیل برای تعیین ارتباط بین CLB ها در FPGA مناسب است. چگونگی تعریف ماتریس روتینگ باید در یک حافظه RAM ذخیره شود. به این خاطر نیاز به یک میکروکنترلر در داخل FPGA یا به صورت خارجی است که این تعاریف را از RAM خوانده و در FPGA بارگذاری کند. این کار هر بار که برد روشن میشود باید انجام شود.
مثل هر چیز دیگری، FPGA هم خوبیها و بدیهای خودش را دارد. FPGA یک روش طراحی و پیادهسازی مدارهای منطقی و دیجیتال است که برای ساخت تراشهها، نمونهسازی یا برای کاربردهای صنعتی و پیشرفته استفاده میشود. استفاده از FPGA پیچیدهتر و گرانتر از میکروکنترلر است اما برای کاربردهای همزمان و موازی گزینه بسیار بهتری است. یکی از مسائل مهم در طراحی برد الکترونیکی، FPGA است که اگر قصد انجام کارهای مرتبط با پردازش موازی یا سیستمهای گسترده (Distributed) را دارید، میتوانید به این روش فکر کنید.
ممنونم که نظراتتان را با ما به اشتراک میگذارید!