شروع به کار با Mojo Plus
اگر شما هرگز چیزی راجع به FPGA نشنیدهاید یا تجربهای در استفاده از آن ندارید، مشکل شما در حال حل شدن است! FPGA مخفف عبارت Field Programmable Gate Arrays میباشد که در نگاه اول کمی گنگ به نظر میرسد. درهرصورت نگران نباشید، در حقیقت استفاده از FPGA آنطور که نشان میدهند پیچیده نیست. به بیان ساده FPGA سختافزاری است که شما میتوانید بهوسیلهی آن اقدام به طراحی مدارات دیجیتال کنید. درواقع FPGA ها میتوانند مشابه میکروکنترلرها یا کامپیوترها (میکروپروسسورها) بهآسانی از یک فایل پیکرهبندی، بازپیکربندی شوند (پروگرام شوند)، با این تفاوت که عمل پیکربندی در میکروکنترلرها بهواسطهی کد نویسی و در FPGA ها بهواسطهی طراحی دیجیتال صورت میگیرد. البته ناگفته نماند که برخی شرکتهای فعال در این زمینه امکان طراحی دیجیتال FPGA را بازهم در قالب کد نویسی محقق ساختهاند. قابلیت طراحی مدارات دیجیتال سفارشی بدون ایجاد تغییرات فیزیکی واقعاً مفید خواهد بود. در ابتدا پروژههایی را در حد اتصال یک LED یا شستی به FPGA خواهید ساخت و نهایتاً اقدام به طراحیهای گستردهتر میکنید.
FPGA در ابتدا توسط شرکتهای بزرگ سازندهی نیمههادی همچون اینتل بهعنوان یک نمونهی اولیه برای طراحی ساختار داخلی تراشههای خود قبل از تولید میلیونها نسخه از آنها استفاده میشد. بالاخره این فناوری به حدی ارزان شد که بتوان از آن در کاربردهای اختصاصی توسط عامه علاقهمندان نیز بهره برد. خبر بهتر اینکه بردهای Mojo، کار با FPGA را چندین برابر راحتتر کردهاند و بهواسطهی این بردها روند یادگیری و توسعه برای شما تسریع خواهد یافت.
مقایسهی اجمالی FPGA با Microcontroller
تفاوت اصلی این دو در نوع پیکربندی است. روش کار با یک میکروکنترلر بدینصورت است که شما مجموعه دستورات محدودی که در قالب یک زبان برنامهنویسی استاندارد نوشتهاید را روی آن بارگذاری میکنید، طی عملیات بارگذاری دستورالعملهای تعریفشده در قسمتی معین از میکروکنترلر ذخیره میشوند و میکرو وظیفه دارد که بر اساس آنها عمل کند. بدنهی برنامهی نوشتهشده، یک حلقهی نامتناهی است و دستورات در آن بهصورت پشتسرهم، خط به خط و با یک نرخ سرعت بر مبنای کلاک سیستم توسط میکرو اجرا میشوند و امکان اجرای موازی دستورات وجود ندارد. البته اخیراً برخی از میکروکنترلرهای پیشرفته با مجهز بودن به سیستمعامل بلادرنگ تا حدودی موفق به اجرای موازی چندین حلقهی نامتناهی بهطور همزمان میشوند؛ اما بازهم این به معنای ویژگی ذاتی آنها شناخته نمیشود، بلکه فقط میتوان از آن بهعنوان یک قابلیت افزودهشده یاد کرد. در FPGA هر گیت یا مجموعهای از گیتها وظیفهی محولهی خود را بهصورت مستقل انجام میدهند، در این صورت هیچ خبری از اجرای پشت سر هم دستورات یا پالس کلاک موردنیاز برای اجرای هر قطعه کد نیست. درواقع علت سرعت بالای FPGA نسبت به MCU همان عملکرد موازی آن است. همچنین در میکروکنترلر شما اقدام به پیکرهبندی یک سری واحدهای داخلی از پیش تعریفشده و بسته که توسط شرکت سازندهی میکروکنترلر طراحیشده است میکنید، حالآنکه در FPGA شما مستقیماً پیکرهبندی خود را روی سختافزار انجام میدهید. بهعبارتدیگر عمل پیکرهبندی با تعیین نحوهی اتصال گیتهای منطقی موجود در داخل تراشه به یکدیگر تحقق مییابد. فرض کنید اندازهی فیزیکی گیتهای منطقی داخل تراشهی FPGA در یک مقیاس سانتیمتری در دسترس شما باشد در این صورت پیکرهبندی FPGA چیزی نیست جز اتصال دادن ورودی-خروجی گیتها برای طراحی یک مدار منطقی، در واقعیت نیز شما همین عمل را بهراحتی و بهواسطهی نرمافزارهای رابط مناسب انجام میدهید.
اما MCU ها نیز برتریهایی نسبی دارند که ازجملهی آنها میتوان به آماده بودن واحدهای پیچیده از قبیل تایمرها، پروتکلهای انتقال داده همچون USB, I2C, SPI, UART و … اشاره کرد که موجب سهولت در استفاده از آنها گشته است. بااینوجود برخی شرکتهای فعال درزمینهی FPGA اقدام به طراحی و انتشار بردهای توسعهی FPGA به همراه برخی کتابخانههای نرمافزاری آمادهی مربوط به واحدهای جانبی کردهاند که تا حد زیادی این نارسایی را نیز حل کرده است. مضاف بر این برخی واحدهای پیچیدهتر نظیر HDMI که نیاز به قدرت پردازش بالا دارند – که امکان راهاندازی آنها فقط در MCU های پیشرفته ممکن است – بهراحتی قابل پشتیبانی توسط این قبیل بردها میباشد. Mojo را میتوان یک نمونهی بارز و متداول از بردهای توسعه مبتنی بر FPGA دانست که پشتیبانی علمی مناسبی دارند.
Lucid روشی پویاتر برای طراحی دیجیتال
Lucid یک نوع زبان توصیف سختافزار (HDL) است که برای راحتی کار با FPGA ساخته شده است. این زبان بر مبنای زبان برنامهنویسی Verilog – که نسبت به زبان VHDL سادهتر است – پایهریزی شده است اما در آن از برخی syntax های زبانهای C++ و Java نیز استفادهشده است. هدف Lucid سادهسازی هرچه بیشتر کار با FPGA از طریق کاهش کدهای نامفهوم، ارائهی الگوهای دستوری قابلفهمتر و اجتناب از درگیری بیشتر با زبان برنامهنویسی بجای تمرکز روی طراحی FPGA است. هر دو زبان برنامهنویسی Lucid و Verilog توسط Mojo IDE پشتیبانی میشوند و در طی برنامهنویسی ابزارهای مفیدی همچون قابلیت real time error checking شما را در امر برنامهنویسی یاری خواهند کرد.
برد Mojo
Mojo یک برد توسعه مبتنی بر FPGA میباشد که برای انجام کارهای خارقالعاده طراحیشده است. فقط شروع کنید، بدون اینکه چیزی در مورد FPGA بدانید. نگران نباشید! Mojo یک منبع غنی برای یادگیری شما دارد.
Mojo را میتوان یک هنر یا تمرینی برای اجرای وردهای جادویی دانست. با برد Mojo شما قطعاً خواهید توانست تا به هر معجزهای تحقق دهید. Mojo یک برد توسعه بر مبنای FPGA میباشد، شما میتوانید با بهرهگیری از این برد لذت یک طراحی دیجیتال با خلاقیت خودتان را داشته باشید. چیزی که این برد را از سایر بردهای مشابه متمایز میکند، سهولت استفاده از آن و منابع آموزشی جامع آن میباشد. برتری Mojo در سوق دادن شما به پیشرفت از طریق یادگیری FPGA به سادهترین وجه ممکن میباشد.
برد Mojo از یک تراشهی مرکزی بهینه یافته به نام Spartan XC6SLX9 در کنار یک میکروکنترلر مجهز به رابط USB بهره میبرد. لازم به اشاره نیست که این برد به سبب بهرهگیری از تراشه FPGA کمبودی از نظر قدرت پردازش ندارد. با استفاده از کانکتور USB تعبیهشده روی برد، میتوانید بدون نیاز به پروگرامر خارجی و بهواسطهی میکروکنترلر تراشهی FPGA خود را پروگرام کنید. با هر بار اتصال تغذیه برد، برنامهی نوشتهشده توسط کاربر که طی عملیات پروگرام، در حافظهی Flash موجود روی برد ذخیرهشده است، بهوسیلهی میکروکنترلر روی FPGA بارگذاری میشود و پس از موفقیتآمیز بودن این روند، میکروکنترلر به وضعیت slave سوئیچ میشود. در این وضعیت این بار FPGA (طراحی FPGA شما) اجازه دارد تا از امکانات میکرو از قبیل دسترسی به پورت سریال یا ورودیهای آنالوگ استفاده کند؛ بنابراین میکروکنترلر روی برد Mojo دارای دو نقش اساسی است. اول اینکه ازیکطرف بهعنوان بارگذار (پروگرامر) تراشهی FPGA عمل میکند و از طرف دیگر امکانات مفیدی را در اختیار FPGA قرار داده و کارایی آن را افزایش میدهد.
مقایسه برد Mojo با Mojo Plus
برد Mojo پایه دارای امکانات زیر میباشد که البته با اتصال شیلدهای متنوع قابلگسترش میباشد:
- تراشه اصلی Spartan 6 XC6SLX9 FPGA
- 84 عدد ورودی-خروجی دیجیتال
- 8 ورودی آنالوگ
- 8 خروجی LED با کاربری عمومی
- ولتاژ رگولاتور روی برد با امکان تأمین تغذیه از ورودی 4.8 الی 12 ولت
- میکروی ATmega32U4 چندمنظوره برای کانفیگ FPGA، ارتباط USB و …
- 2 مگابیت حافظه فلش روی برد برای ذخیره فایل کانفیگ FPGA
با توجه به ضعفهایی که در برد موجوی وارداتی به کشور وجود داشت، نسخه داخلی برد موجو با اسم Mojo Plus توسط مهندسین داخلی کشور طراحی و توسعه دادهشده است که امکانات بهمراتب کاملی را در مقایسه با نمونه خارجی در دسترس قرار میدهند.
از تغییرات عمده این نسخه میتوان به جایگزینی میکروکنترلر برد از هسته AVR با هسته ARM Cortex M3 اشاره کرد که سبب افزایش قابلملاحظه کارایی برد شده است. بهطور مثال در برد Mojo Plus به لطف پردازنده و رابط USB قویتر سرعت کانفیگ FPGA بیش از 2.5 برابر بهبودیافته است و یا دقت 12 بیتی برای ورودیهای آنالوگ در دسترس شده است که در نمونه قدیمی 10 بیت بود. در جدول زیر مقایسه کاملی از بهبودهای صورت پذیرفته در برد Mojo Plus لیست شده است:
ابزارهای موردنیاز برای شروع کار با برد Mojo
برای شروع کار ابتدا باید یک برد Mojo Plus تهیه کنید، همچنین شما به یک کابل میکرو USB جهت اتصال برد به سایر عناصر سختافزاری بهمنظور پروگرام کردن برد، تبادل اطلاعات و … نیاز پیدا خواهید کرد.
دو نرمافزار وجود دارند که شما برای کار با Mojo به آنها نیاز پیدا خواهید کرد. اولین نرمافزار ISE هست. ISE نرمافزاری است ساخت شرکت Xilinx (یک شرکت فعال درزمینهی FPGA) که بهعنوان یک IDE یا محیط توسعهی مجتمع استاندارد برای کد نویسی FPGA و درنهایت ترجمه کدهای نوشتهشده در قالب یک فایل خروجی ارائهشده است. نرمافزار بعدی موسوم به Mojo Loader وظیفهی بارگذاری فایل خروجی تولیدشده توسط نرمافزار ISE روی برد Mojo را داراست.
اما پیشنهاد میشود برای محیط توسعه از نرمافزار Mojo IDE استفاده کنید. در این صورت دیگر نیازی به نصب Mojo Loader نخواهید داشت، همچنین محیط برنامهنویسی این نرمافزار نسبت به ISE سادهتر و بهروزتر میباشد و امکانات نرمافزاری جالبی مانند ابزار آنالیز سیگنال در اختیار شما قرار میدهد، بااینوجود به علت پیچیده و منحصربهفرد بودن عمل کامپایل کد به زبان ماشین در FPGA، Mojo IDE قادر به انجام این مهم نخواهد بود، بنابراین حداقل فقط به خاطر اجرای عمل سنتز و … مجبور به استفاده از برنامهی حجیم ISE خواهید شد.
دانلود نرمافزار ISE Design Suite
http://p30download.com/fa/entry/49796/
دانلود نرمافزار Mojo IDE
https://embeddedmicro.com/ide/mojo-ide-B1.3.6.exe
دانلود نرمافزار Mojo Loader
https://embeddedmicro.com/media/wysiwyg/mojo-loader/mojo-loader-1.3.0.exe
اولین پروژه FPGA با Mojo
در این بخش نحوه ایجاد یک پروژه نمونه، سنتز و درنهایت پروگرام آن روی برد Mojo آموزش داده میشود. در ابتدا از نصب بودن دو نرمافزار ISE Design Suite و Mojo IDE روی سیستم خود اطمینان حاصل نمایید و نرمافزار Mojo IDE را اجرا نمایید. برای شناسایی ISE DS توسط محیط توسعه Mojo نیاز به مسیردهی دستی پوشه نصب آن داریم. به منوی Settings نرمافزار رفته و گزینه ISE Location … را انتخاب کرده و در پنجره بازشده مسیر پوشه نصب را انتخاب مینماییم. بهعنوانمثال این مسیر میتواند به این شکل باشد:
منوی File->New Project را انتخاب کرده و مشخصات پروژه جدید را مشابه شکل زیر وارد مینماییم.
در بخش Language میتوان زبان برنامهنویسی را مشخص کرد که میتواند Verilog یا Lucid باشد. درصورتیکه زبان Lucid انتخاب شود میتوان از پروژههای آماده که در زیر آن مشخص میشود، استفاده نمود. با زدن کلید Create به پنجره اصلی IDE برمیگردیم و فایل mojo_top.luc در بخش Source منوی درختی سمت چپ IDE را باز میکنیم. این فایل شامل تمام ورودی، خروجیهای خارجی طرح میباشد. هر پروژه میتواند شامل چندین ماژول با ورودی، خروجیهای مختلف باشد ولی درنهایت همه آنها در این فایل بهصورت زیر-مازول قرار میگیرند.
برای راحتی کار فایل پیشفرض تولیدی شامل تمام پینهای استفادهشده ورودی، خروجی تراشه FPGA روی برد Mojo میباشد و میتوان بهراحتی از آنها در داخل برنامه استفاده کرد.
در این بخش به بررسی محتویات و اجزای فایل mojo_top.luc میپردازیم و درنهایت بهعنوان یک پروژه ابتدایی در دنیای FPGA طرح را برای کنترل LED اول روی برد موجو توسط شستی rst پیکربندی مینماییم.
ماژولها
ماژولها یک راهکار بهینه برای مدیریت پروژه در تکههای کوچک و جدا از هم هستند. این مفهوم بسیار مشابه اصطلاح توابع در زبانهای برنامهنویسی نظیر C است که در آن با استفاده از توابع برنامههای حجیم به تکههای کوچکتر و قابلفهمتر با امکان استفاده مجدد تقسیمشده و تبادل اطلاعات بین توابع با ارسال و دریافت پارامترهای ورودی و خروجی انجام میشود. نقطه جذاب ماژولها نیز بهصورت مشابه قابلیت استفاده مجدد از آنها در جایجای پروژه میباشد. تعریف یک ماژول بهصورت زیر انجام میشود.
module mojo_top ( input clk, // 50MHz clock input rst_n, // reset button (active low) output led [8], // 8 user controllable LEDs input cclk, // configuration clock, AVR ready when high output spi_miso, // AVR SPI MISO input spi_ss, // AVR SPI Slave Select input spi_mosi, // AVR SPI MOSI input spi_sck, // AVR SPI Clock output spi_channel [4], // AVR general purpose pins (used by default to select ADC channel) input avr_tx, // AVR TX (FPGA RX) output avr_rx, // AVR RX (FPGA TX) input avr_rx_busy // AVR RX buffer full )
این تعریف همواره با کلمه کلیدی module و بعدازآن نام ماژول شروع میشود که در مثال فوق mojo_top است. بهصورت قراردادی اسم ماژول و اسم فایل را یکسان در نظر میگیرند. بعد از تعریف اسم ماژول یک بخش اختیاری تعریف پارامترها قرار میگیرد که در مثال فوق وجود ندارد. بعدازآن بخش مهم تعریف پورتها قرار میگیرد که در آن تمام پینهای ورودی، خروجی و دو جهته ماژول تعریف میشوند. در مثال فوق اکثر پورتها بهصورت بیتی تعریفشدهاند ولی بهعنوانمثال پورت led که بهصورت خروجی تعریفشده، شامل 8 پین خروجی است که بهصورت مستقیم به 8 عدد LED روی برد Mojo متصل شده است.
بلوک Always
چند مورد قبل از بلوک always قرار دارند که فعلاً نیازی به آنها نداریم و از توضیح در مورد آنها صرفنظر میکنیم. بلوکهای Always بخشی از برنامه هستند که منطق برنامه در آنها اتفاق میافتد. اینجا جایی است که عملیات محاسباتی یا خواندن و نوشتن سیگنالها انجام میشوند. نام این بلوک نیز به همان معنی «همیشگی» است، زیرا پردازشهای آن بهصورت دائم و همیشگی اتفاق میافتند. زمانی که ابزارهای تحلیل کد سختافزاری با یک بلوک Always مواجه میشوند یک مدار دیجیتالی برای شبیهسازی رفتار بلوک تولید میکنند. بلوک Always پروژه تولیدی بهصورت زیر است:
always { reset_cond.in = ~rst_n; // input raw inverted reset signal rst = reset_cond.out; // conditioned reset led = 8h00; // turn LEDs off spi_miso = bz; // not using SPI spi_channel = bzzzz; // not using flags avr_rx = bz; // not using serial port {
مسئله مهمی که باید در نظر گرفت این است که برخلاف پیشزمینههای ذهنی که در مورد زبانهای برنامهنویسی نظیر C در ذهن داریم، در زبانهای توصیف سختافزاری رفتار بلوک شبیهسازی میشود و نه صرفاً سطر به سطر برنامه. برای واضح شدن مسئله به مثال زیر دقت کنیم.
always { led = 8h00; // turn LEDs off led = 8hFF; // turn LEDs on }
این بلوک طبق دیدگاههای رایج قبلی به نظر قرار است LED های روی برد را بهصورت متناوب روشن و خاموش کند. ولی در عمل اینگونه نبوده و برخلاف برنامهنویسی سیستمعاملی یا میکروکنترلری، پردازندهای برای اجرای سطر به سطر برنامه وجود ندارد. زمانی که ابزار سنتز برنامه FPGA با این بلوک مواجه میشود سطر اول را کاملاً نادیده در نظر میگیرد؛ زیرا سطر دوم از اولویت بالایی برخوردار بوده و درنتیجه تمام LED های روی برد بهصورت مستقیم به منطق 1 وصل شده و پیوسته روشن خواهند بود.
اتصال شستی ریست به یک LED
در این بخش میخواهیم ماژول TOP را به نحوی ویرایش کنیم تا کلید ریست روی برد Mojo به LED اول وصل شود و با فشردن شستی این LED روشن شود. برای این کار سطر 28 ماژول رو بهصورت زیر تغییر میدهیم:
led = c{7h00, rst}; // connect rst to the first LED
با قطعه کد بالا 7 عدد LED باارزشتر به سطح منطقی 0 و LED اول مستقیماً به ورودی rst که در حقیقت not ورودی rst_n میباشد متصل میشود. در مقداردهی 7h00 عدد 7 نمایانگر طول، h نمایانگر واحد عددی (در اینجا هگزادسیمال یا 16 تایی) و 00 نمایانگر مقدار میباشد.
ساخت پروژه
پس از نهایی کردن فایلهای سورس پروژه نیاز داریم تا پروژه را ساخت یا در اصطلاح Build نماییم. این کار بهصورت عامیانه مشابه پروسه compile در زبان C میباشد ولی در واقعیت عملیات بسیار پیچیدهتری نظیر سنتز مدار، پیادهسازی، مپینگ و مسیریابی و … انجام میشود که زمانبر است و گاهی چندین دقیقه طول میکشد. عملیات ساخت با زدن گزینه Build Project در ابزار منوی بالای Mojo IDE شروع میشود. پس از خاتمه عملیات ساخت فایل bit تولید میشود که بایستی روی FPGA لود شود. برای لود برنامه روی FPGA در حالت عادی نیاز به پروگرامر JTAG داریم که به لطف امکان لود مستقیم USB برد Mojo از این بابت مشکلی نخواهیم داشت و لود برنامه بهسادگی انجام میشود. لود برنامه به دو طریق انجام میشود که در حالت اول بهصورت موقت بوده و در حالت دوم بهصورت دائمی یا Flash است. تفاوت این دو حالت در این مورد است که با لود موقت برنامه روی FPGA این برنامه تنها یکبار قابلاستفاده میباشد و با ریست تغذیه FPGA برنامه از بین خواهد رفت و نیاز به لود مجدد دارد. ولی ازآنجاییکه سرعت لود در این حالت بیشتر است برای عملیات دیباگ و تست موقت برنامه مفید خواهد بود.
در حالت دوم اما برنامه ابتدا روی حافظه Flash روی برد ذخیره میشود و بعداً روی FPGA لود میشود. درنهایت با هر بار ریست، FPGA بهصورت خودکار با آخرین برنامه دوباره لود میگردد. برای تست برنامه نوشتهشده گزینه لود موقت (Temporary) از منوی ابزار بالایی را انتخاب نمایید.
حال به برد Mojo خود نگاه کنید. باید LED با برچسب DONE کنار کانکتور ورودی روشن شود. این LED نشانگر صحت لود برنامه روی FPGA میباشد و درصورتیکه به هر نحوی اطلاعات لود شده توسط CRC تصدیق نشود این LED روشن نخواهد شد.
حال با فشردن شستی ریست بلافاصله LED اول روشن خواهد شد و با رها کردن آن خاموش میشود.
نتیجهگیری نهایی
در این پروژه پسازاینکه کلید فشرده شود، مدتزمانی که طول میکشد تا LED روشن شود چقدر است؟ برای این کار اگر بهجای FPGA از یک پردازنده استفاده کنیم، پردازنده داخل یک حلقه قرار میگیرد و بهصورت متناوب وضعیت کلید را رصد کرده و بر مبنای آن LED را کنترل مینماید. زمان مابین فشار کلید و روشن شدن LED متناسب با فرکانس کاری پردازنده و میزان تأخیر اجرای دستورات خواهد بود و اگر کدهای دیگری در داخل همین حلقه قرار گیرند زمان بیشتری صرف خواهد شد.
اما در FPGA وضعیت فرق میکند. در این حالت یا طرح ورودی شستی بهصورت مستقیم به خروجی LED متصل میشود. در ذهن میتوان یک سیم مسی بین ورودی شستی و خروجی LED در نظر گرفت ولی در عمل مجموعهای از سوئیچها و مالتی پلکسرها بین ورودی و خروجی نقش مسیریابی سیگنال ورودی به خروجی را بر عهده میگیرند. ازآنجاییکه سیگنال ورودی نیازی به انتظار برای پردازنده ندارد با حداکثر سرعت ممکن از طریق سیلیکون به LED منتقل میشود. از همه جالبتر اینکه بقیه FPGA نیز خالی بوده و میتوان فرایندهای دیگری را بهصورت همزمان درآنواحد و بدون تأثیر منفی در بلوک فعلی اجرا نمود.
مقایسه پیشرفت کارایی FPGA در مقابل CPU درگذر زمان
این مطلب در شماره 15 مجله نویز منتشر شده است.
لینک برنامه mojo loader خرابه لطفا اصلاحش کنید نتونستم پیداش کنم ممنون
سلا
ببخشید من میخواهم کد vhdl بزنم و سنتز کنم با برد XC6SLX9 میخواستم ببینم که امکان پذیر است؟
و اینکه میتوانم تنها از دو نرم افزار ISE و Mojo loader استفاده کنم؟