پیادهسازی عملی یک پروژه FPGA شامل مراحلی است که باید پشت سر هم و به دقت انجام شوند تا نتیجه مطلوب حاصل شود. در این برنامه ویدئویی، تمام مراحل مربوط به پیادهسازی را مرحله به مرحله و به کمک یک برد آموزشی به شما نشان خواهم داد.
More...
پیادهسازی عملی بر روی FPGA نیاز به مقدماتی دارد که در برنامه یک قدم مانده به پیادهسازی عملی در مورد آنها به طور مفصل توضیح دادم.
برای آشنایی با مراحل قبل از پیادهسازی عملی مدار، این برنامه ویدئویی را ببینید…
در این برنامه، ابتدا موضوعات مربوط به مقدمات پیادهسازی را مرور میکنم و سپس، یک مثال را به صورت عملی و به کمک یک برد آموزشی FPGA پیادهسازی میکنم.
همچنین در مورد نحوه پروگرام کردن FPGA و حافظه Flash برای ذخیره دائمی فایل توصیف کننده مدار توضیح خواهم داد و تمام مراحل این کار را به صورت عملی به شما نشان خواهم داد.
اگر مایلید بیشترین بهره را از این برنامه ببرید، پیشنهاد میکنم برنامههای ویدئویی قبلی در مورد نرمافزار ISE و همچنین آموزش زبان VHDL را قبل از مشاهده این برنامه ببینید.
برای آشنایی با نرم افزار ISE این برنامه ویدئویی را ببینید…
برای آشنایی با زبان VHDL این برنامه ویدئویی را ببینید…
ویدئو یا متن؟
محتوای این برنامه آموزشی، به دو صورت ویدئو و متن آماده شده است. اگر علاقمند به یادگیری این مطلب به صورت ویدئویی هستید، ویدئوی زیر را ببینید و اگر ترجیح میدهید آن را به صورت متن مطالعه کنید، ادامه این مطلب را بخوانید.
برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:
برای دانلود کد نمونه، روی دکمه زیر کلیک کنید:
در مقالهی قبل، در مورد مراحل پیادهسازی یک پروژه، قبل از پیادهسازی آن به صورت عملی روی FPGA، صحبت کردیم.
در این مقاله، همانطور که قبلاً هم وعده داده بودم، میخواهم مراحل پیادهسازی یک پروژه را به صورت عملی و روی یک بُرد واقعی به شما نشان دهم تا ببینید که چگونه میتوانیم یک پروژه واقعی را به صورت عملی روی FPGA پیادهسازی کنیم.
مروری بر مقالهی "یک قدم مانده به پیادهسازی"
قبل از اینکه وارد بحث اصلی این مقاله شویم، اجازه دهید مطالب مقالهی قبل را یادآوری کنیم.
در مقالهی قبل، راجع به مراحل طراحی، قبل از پیادهسازی عملی در FPGA، صحبت کردم.
دیدیم که اولین مرحلهی کار، نوشتن یک کد توصیف سختافزاری به یکی از زبانهای VHDL یا Verilog است.
نوشتن این کد را میتوانید در هر ویرایشگر متنی انجام دهید و اگر از نرمافزار ISE استفاده میکنید، خود این نرمافزار، یک ویرایشگر متن در اختیار شما قرار میدهد.
پس از آن، باید شبیهسازی عملکردی یا رفتاری را انجام دهید؛ به کمک این شبیهسازی، میتوانید مطمئن شوید که منطق و عملکرد مداری که طراحی کردهاید، کاملاً درست است.
اگر این اتفاق افتاد و مطمئن شدید که عملکرد مدارتان درست است، میتوانید مراحل روتین بعدی که شامل سنتز مدار، جانمایی و مسیریابی است را انجام دهید.
در نهایت، فایل پیکرهبندی یا بیت-فایل را ایجاد کنید و آن را به کمک یک پروگرامر، در FPGA پروگرام کنید؛ به این ترتیب، FPGA شما تبدیل به مداری میشود که آن را به کمک یک کد توصیف سختافزاری، توصیف کرده بودید.
در مقالهی قبلی، یک پروژهی نمونه معرفی کردیم که پروژهی شمارش باینری، روی LEDها بود.
روی بُرد آموزشی که میخواهیم با هم از آن استفاده کنیم، چهار عدد LED داریم که میخواهیم در این پروژهی ساده، این چهار عدد LED، عمل شمارش را به صورت باینری انجام دهند.
برای اینکه پروژه را پیچیدهتر کنیم، یک دکمه به آن اضافه میکنیم که با هر بار فشردن آن، جهت شمارش تغییر کند.
کدی که در زیر میبینید، کدی است که قبلاً برای این مدار نوشتهایم:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Farad1_Top is Port ( Clock : in std_logic; LED : out unsigned (03 downto 0); Push_Button : in std_logic ); end Farad1_Top; architecture Behavioral of Farad1_Top is signal Push_Button_Int : std_logic := '0'; signal Push_Button_Prev : std_logic := '0'; signal LED_Int : unsigned (3 downto 0) := (others=>'0'); signal Count_Direction : std_logic := '0'; signal Delay_Counter : unsigned (24 downto 0) := (others=>'0'); begin LED <= LED_Int; process(Clock) begin if rising_edge(Clock) then Push_Button_Int <= Push_Button; Push_Button_Prev <= Push_Button_Int; Delay_Counter <= Delay_Counter + 1; if (Delay_Counter = to_unsigned(25000000,25)) then LED_Int <= LED_Int + 1; Delay_Counter <= (others=>'0'); if (Count_Direction = '1') then LED_Int <= LED_Int - 1; end if; end if; if (Push_Button_Int = '0' and Push_Button_Prev = '1') then Count_Direction <= not Count_Direction; end if; end if; end process; end Behavioral;
همانطور که میبینید، در Entity این مدار، فقط یک کلاک و یک LED وجود دارد.
برای اینکه بتوانیم روی LEDها شمارش باینری را نمایش دهیم، یک پورت ورودی به نام Push_Button داریم، که همان دکمهای است که قرار است با فشردن آن، جهت شمارش عوض شود.
همانطور که میبینید، این یک کد ساده است که من برای مطالعهی بیشتر شما، در زیر ویدئوی همین صفحه، آن را قرار دادهام. میتوانید این کد را دانلود کنید و اگر احیاناً سوالی در مورد این کد داشتید، میتوانید آن را در پایین همین پست، برای من بنویسید.
اجازه دهید قبل از اینکه این پروژه را به صورت عملی با هم انجام دهیم، با بُرد و تنظیماتی که میخواهیم برای انجام این پروژه استفاده کنیم، آشنا شوید.
آشنایی با یک بُرد حاوی FPGA (بُرد فراد ۱)
برای انجام این پروژه، به تنها وسایلی که نیاز دارید یک کامپیوتر و یک بُرد است که بتوانید به کمک یک رابط USB آن را به کامپیوتر متصل کنید.
بُردی که میخواهیم در این پروژه استفاده کنیم، برد فراد ۱ است. این همان بُردی است که در دورههای آموزشی آموزشگاه فراد اندیش از آن استفاده میکنیم. در این بُرد، امکانات متنوعی برای انجام انواع آزمایشها و تمرینهای مرتبط با یادگیری FPGA وجود دارد.
همانطور که در شکل زیر میبینید، روی این بُرد، چهار LED، یک سونسگمنت، یک سنسور دما، یک حافظه SRAM، یک اسیلاتور 50 مگاهرتز، یک دیپسوییچ چهارتایی و یک کلید یا PUSH BUTTON وجود دارد.
در این پروژه، از LEDها و PUSH BUTTON روی بُرد استفاده میکنیم.
همچنین روی بُرد، یک رابط RS232 وجود دارد که به کمک آن میتوانید با کامپیوتر ارتباط سریال برقرار کنید. یک هدر 20 پایه هم روی این بُرد قرار داده شده است؛ در صورتی که بخواهید یک قطعه، که بُرد نیست را به FPGA متصل کنید، میتوانید از طریق این هدر، این کار را انجام دهید.
برای پروگرام کردن FPGA روی این بُرد، نیازی به تهیهی یک پروگرامر خارجی ندارید، بلکه پروگرامر USB، به صورت On-Board تعبیه شده است. شما میتوانید آن را تنها به کمک یک کابل USB، به کامپیوتر متصل کنید و به راحتی آن را پروگرام کنید.
نکتهی جالب دیگر در مورد این بُرد این است که برای تغذیه آن نیاز به آداپتور یا تغذیه خارجی ندارید و تغذیه آن، از همان پورت USB تامین میشود.
نحوهی پروگرام کردن FPGA
برای پروگرام کردن FPGA، ابتدا نیاز است که مراحل سنتز، جانمایی، مسیریابی و ساخت بیت-فایل را انجام دهیم؛ برای انجام این کارها، باید مطابق شکل زیر، روی گزینهی Generate Programming File، دبل-کلیک کنید.
بعد از اینکه بیت-فایل یا Configuration File ساخته شد، مطابق شکل زیر، علامت مثبت کنار گزینهی Configure Target Device را کلیک کنید؛ سپس روی گزینهی Manage Configuration Project دبل-کلیک کنید تا نرمافزار iMPACT (که از آن برای پروگرام کردن FPGA استفاده میکنیم.)، اجرا شود.
حالا مطابق شکل زیر، گزینهی Boundary Scan، در نرمافزار iMPAC را انتخاب کنید.
پس از آن، دکمهی Initialize Chain را فشار دهید تا نرمافزار از طریق پروگرامر، با بُرد ارتباط برقرار کند.
همانطور که میبینید نرمافزار، FPGA روی بُرد را میشناسد.
روی بُرد ما تراشهی FPGA SPARTAN6 از نوع LX9 وجود دارد.
با چند بار فشار دادن دکمهی ESC روی کیبورد کامپیوتر، از پیامهایی که ظاهر میشوند عبور کنید.
حالا باید آن بیت-فایلی که ساخته بودید را به این FPGA، اِعمال کنید. سپس، FPGA را پروگرام کنید.
برای این کار، مطابق شکل زیر، روی FPGA کلیک راست کنید و گزینهی Assign New Configuration File را انتخاب کنید.
پس از آن، فولدر پروژهای که در آن بیت-فایل را درست کردهاید، باز کنید و بیت-فایل را انتخاب کنید.
اکنون دوباره چند بار دکمهی ESC روی صفحه کلید کامپیوتر را فشار دهید تا از پیامهای ظاهر شده عبور کنید.
حالا، همانطور که میبینید، بیت-فایل به این FPGA اِعمال شده و نام بیت-فایل در پایین تراشه نوشته شده است.
برای پروگرام کردن FPGA، کافی است روی FPGA یک کلیک-راست کنید و گزینهی پروگرام را انتخاب کرده و سپس دکمهی OK را فشار دهید.
همانطور که روی بُرد میبینید، شمارش باینری به کمک LEDها انجام میشود.
در پروگرام کردن این بُرد، نکتهای وجود دارد؛ همانطور که میدانید، محتوای FPGA مثل یک حافظهی RAM یا حافظه موقتی است. بنابراین اگر ما بُرد را خاموش و روشن کنیم، محتوای FPGA پاک میشود و در عمل نمیتواند کاری انجام دهد، مگر اینکه دوباره آن را پروگرام کنیم.
روی بُرد فراد ۱، یک دکمهی Initial کردن FPGA یا ریست کردن FPGA وجود دارد.
هربار که این دکمه را فشار دهید، مانند این است که برق FPGA را قطع کرده باشید؛ یعنی محتوای FPGA پاک میشود.
در واقع با فشار دادن این دکمه، شمارش متوقف میشود و FPGA کاری انجام نمیدهد؛ چون کدی که در آن بوده، پاک شده است.
نحوهی پروگرام کردن دائمی FPGA
برای حل این مشکل، میتوان در کنار FPGAها، یک حافظهی کوچک دائمی قرار داد.
روی بُرد فراد ۱، یک حافظهی فلش دائمی از نوع SPI وجود دارد.
روند پروگرام کردن دائمی FPGA به این صورت است که پس از اینکه مطمئن شدید کدتان صحیح است، آن را روی FPGA پروگرام نمیکنید؛ بلکه کد را روی حافظهی دائمی جانبی، پروگرام میکنید. بدین ترتیب، پس از هر بار که بُرد را روشن کنید محتوای حافظهی فلش، به صورت خودکار، به داخل FPGA منتقل میشود و FPGA پروگرام میشود و آن عملکردی که شما نیاز دارید را انجام میدهد.
اجازه دهید که مراحل پروگرام کردن حافظه جانبی FPGA را، یکبار به صورت عملی ببینیم.
برای اینکه حافظهی فلش که از نوع SPI است را پروگرام کنید، باید یک فایل جدید، از روی آن بیت-فایلی که مخصوص پروگرام کردن FPGA است تولید کنید.
برای این کار، در نرمافزار iMPACT روی گزینهی Create PROM File دبل کلیک کنید تا پنجرهی PROM File Formatter ظاهر شود.
سپس، در بخش SPI Flash روی گزینهی Configure Single FPGA کلیک کنید.
پس از آن، فلش سبز رنگ را فشار دهید.
حالا باید سایز حافظهی SPIی روی بُرد را انتخاب کنید؛ سایز حافظهی SPIی روی بُرد فراد ۱، ۶۴ مگابایت است. بنابراین، گزینهی 64MB را انتخاب میکنیم.
سپس گزینهی Add Storage Device را انتخاب کنید.
اکنون مطابق شکل زیر، روی فلش سبز رنگ کلیک کنید.
میتوانید در قسمت Output، برای فایلی که قرار است برای پروگرام کردن فلش ساخته شود، نامی انتخاب کنید. من اسم این فایل را LED4 قرار میدهم. همچنین، میتوانید در پایین قسمت نامگذاری، محل ذخیرهسازی فایل را وارد کنید. من همان محل پروژه را انتخاب میکنم. سپس گزینهی OK را انتخاب کنید.
مطابق شکل زیر، گزینهی OK را انتخاب کنید.
در این مرحله، باید بیت-فایلی را که قرار است از روی آن فایل فلش یا همان MCS File ساخته شود را معرفی کنید.
سپس، نرمافزار از شما میپرسد که آیا بیت فایل دیگری دارید که بخواهید به این فایل فلش اضافه کنید؟ که من گزینهی NO را انتخاب میکنم.
سپس گزینهی OK را کلیک کنید.
نهایتاً با دبل کلیک روی گزینه Generate File، فایل MCS ساخته میشود.
به این ترتیب پیغام Generate Succeed را دریافت میکنید.
برای اینکه فایل MCS ساخته شده را روی حافظهی فلش پروگرام کنیم، باید دوباره گزینهی Boundary Scan را انتخاب کنیم.
سپس روی FPGA کلیک راست میکنیم و گزینهی Add SPI/BPI Flash را انتخاب میکنیم.
نام فایل MCSای که ساختیم، LED4.mcs بود که آن را انتخاب میکنیم و روی گزینهی Open کلیک میکنیم.
اکنون باید دوباره نوع حافظهی SPIای که روی بُرد است را به نرمافزار معرفی کنم.
اسم حافظهی SPIی روی بُرد، W25Q64BV است که مطابق شکل زیر، آن را انتخاب میکنیم:
سپس گزینهی OK را انتخاب میکنیم.
همانطور که در شکل زیر میبینید، در نرمافزار، یک علامت آیسی فلش در بالای تراشهی FPGA ظاهر میشود:
روی علامت آیسی فلش کلیک راست کنید و گزینهی پروگرام را انتخاب کنید و سپس گزینهی OK را کلیک کنید تا عمل پروگرام کردن شروع شود.
مطابق معمول، ابتدا آیسی فلش پاک میشود و پس از آن پروگرام کردن شروع میشود.
اکنون حافظهی فلش پروگرام شده و مدار ما به صورت صحیح کار میکند.
حالا برای اینکه عملکرد این حافظهی فلش را ببینید، یک بار بُرد را ریست کنید؛ میبینید که بعد از ریست شدن، به صورت خودکار محتوای فایل فلش به FPGA منتقل میشود و بُرد، عملکرد عادی خودش را انجام میدهد؛ برخلاف حالت قبل، که فلش را پروگرام نکرده بودیم و بعد از ریست کردن بُرد، خبری از عملکرد مورد انتظار ما از بُرد، نبود.
امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژههایتان استفاده کنید.
آیا برنامه ویدئویی پیادهسازی عملی یک پروژه در FPGA برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.
بسیار عالی
خداخیرتون بده.ممنون
سلام
در کد نمونه پروژه LED ، عمل جمع صرفا با علامت + انجام شده است.
در صورتی که برای جمع دو سیگنال (در پروژه یکی از سیگنال ها می تواند عدد یک می باشد)، آیا نباید برنامه adder نوشته شود؟ چرا که در حال نوشتن کد یک سخت افزار هستیم نه برنامه نویسی!
با سپاس
سلام،
ممنون از توجه شما به این برنامه.
در زبان VHDL عملگر + تعریف شده است و استفاده از آن منجر به پیادهسازی یک جمع کننده بهینه میشود.
موفق باشید.
مثل همیشه عااااااااااالی.خداخیرتون بده.
سلام جناب ثقفی.
بسیار ممنون که اینطور خالصانه دانش و تجربه خودتون رو در اختیار همه قرار میدید. به امید اینکه با کمک افرادی مثل شما، ایران نیاز به هیچ کشوری نداشته باشه.
فقط یه سوال که شاید ابتدایی باشه، شما در مقاله ی دیگری در مورد کد spi توضیح دادید. یعنی خواندن از مموری باید توسط spi انجام بشه که ایجاب میکنه کدش نوشته بشه. در صورتی که بعد از ریست، fpga پاک میشه و کدی درش وجود نداره. پس چطوری از مموری اکسترنال برنامه رو بارگذاری میکنه؟
سلام، ممنون از شما.
محتوای فایل پیکرهبندی (پروگرام) FPGA در یک حافظه جانبی که ممکن است با پروتکل SPI یا پروتکل دیگری کار کند قرار داده میشود. برای ارتباط این حافظه خاص با FPGA نیازی به نوشتن کد از سمت ما به عنوان طراح نیست و این کار به صورت خودکار انجام میشود. به عبارت دیگر، از قبل در FPGA تعبیه شده است.
موفق باشید.
با سلام و تشکر بخاطر اینکه امکان پرسیدن سئوال را فراهم نموده اید.
اگر بخواهیم حافظه فلش که برنامه را در آن ریخته ایم پاک کنیم باید چه کاری انجام بدهیم یا اینکه چند برنامه در آن ریخته ایم پس از اتصال برد، برنامه اول موجود در فلش را اجرا می کند چگونه به برنامه های بعدی آن را ارجاع بدهیم و یا ترتیب برنامه های موجود در حافظه فلش را جابجا کنیم.
امیدوارم سئوالات اینجانب را پاسخ دهید
باتشکر از توجه شما
سلام،
برای پاک کردن حافظه میتوانید از برنامه iMPACT استفاده کنید. پاسخ به بخش دوم سوال شما بسیار مفصل است و در این کامنت نمیگنجد. در صورت تمایل، میتوانید موضوع partial reconfiguration را جستجو و مطالعه کنید.
موفق باشید.
در این برنامه زمان 500 میلی ثانیه ثابت هست و امکان تغییرش نیست دلیلش هم وجود اشکال در برنامه میباشد در حقیقت بایستی دستور صفر کردن متغیر کانتر را در داخل شرط IF افزایش دهنده مقدار باینری LED داده شود با دستور زیر
Delay_Counter <= to_unsigned(0,26);
یعنی بشه این :
if (Delay_Counter = to_unsigned(25000000,25)) then
LED_Int <= LED_Int + 1;
if (Count_Direction = '1') then
LED_Int <= LED_Int – 1;
end if;
Delay_Counter <= to_unsigned(0,26);
end if;
بهتره متغیر Delay_Counter هم 26 بیتی تعریف بشه تا امکان ایجاد تاخیر یک ثانیه ای هم مقدور باشه
متاسفانه توضیحی در خصوص کدهای برنامه ندادید و منم که تازه کارم تا این اشکال رو پیدا کنم یه ساعتی طول کشید
سلام،
با تشکر از توجه شما. عبارت ارجاع مربوط به ریست کردن شمارنده در کد جا افتاده بود که تصحیح شد.
موفق باشید.
سلام استاد، وقتتون بخیر
استاد برد کی موجود میشه که بتونیم بخریم؟
سلام،
متاسفانه زمان موجود شدن دوباره برد فراد ۱ مشخص نیست.
موفق باشید.