Learn FPGA Season 1
نرمافزار ISE و زبان VHDL برای برنامهنویسی FPGA
نرمافزار ISE یا همان Xilinx ISE Design Suite خود شامل چندین نرمافزار میباشد.
این نرمافزارها برای طراحی، شبیهسازی، برنامهریزی و بسیاری از کارهای دیگر استفاده میشود که در ادامه بیشتر به آن خواهیم پرداخت.
آخرین نسخه این نرم افزار 14.7 و پس از انتشار آخرین نسخه جای خود را به نرمافزار Vivado داد.
البته ناگفته نماند، تراشههایی که در ISE در دسترس هستند، در Vivado غیرقابل دسترس هستند و همینطور بالعکس.
پس ما با توجه به تراشهای که قصد داریم با آن کار کنیم نرمافزار مورد نظر را انتخاب خواهیم کرد.
در این مجموعه آموزشی، چون مبنای آموزش بر اساس تراشهی Spartan-6 خواهد بود، پس نرمافزار ISE را انتخاب کردهایم.
نصب نرمافزار ISE
برای دانلود نرم افزار کلیک کنید.
نصب این نرمافزار بسیار ساده است ولی اگر شما از ویندوز 10 استفاده میکنید احتمالا پس از اجرای نرمافزار با خطای pn.exe has stopped working_ روبرو شوید.
در این صورت باید نرمافزار را بسته و مراحل زیر را به ترتیب انجام دهید.
- ابتدا وارد فولدر C:\Xilinx\14.7\ISE_DS\ISE\lib\nt64 شوید و نام فایل libPortability.dll را به libPortability.dll.orig تغییر دهید.
- در فولدر مرحله 1، یک کپی از فایل libPortabilityNOSH.dll ایجاد کنید و نام آن را libPortability.dll بگذارید.
- حال وارد فولدر C:\Xilinx\14.7\ISE_DS\common\lib\nt64 شوید و فایل libPortabilityNOSH.dll را در این فولدر هم کپی کنید.
- در فولدر مرحله 3، نام فایل libPortability.dll را به libPortability.dll.orig تغییر دهید.
- در آخر، نام فایل libPortabilityNOSH.dll در فولدر مرحله 3 را به libPortability.dll تغییر دهید.
نحوه ایجاد پروژه در ISE
ابتدا وارد نرمافزار شوید و سپس مانند تصویر زیر از منوی File گزینه ی New Project را انتخاب کنید.
از پنجره باز شده میتوانید نام و محل ذخیرهسازی پروژه را انتخاب کنید و با انتخاب Next به مرحله بعد بروید.
در پنجره باز شده باید تنظیمات مربوط به تراشه مورد نظر را انجام دهیم.
تراشه ما از خانواده Spartan-6 و از نوع XC65LX9 میباشد. و همچنین پکیج تراشهای که ما از آن استفاده میکنیم TQG144 است.
در همین پنجره مشاهده میکنید که ما Speed را 2- انتخاب کردیم.
در این رابطه باید ذکر گردد که این عدد مربوط به تکنولوژی تراشه است، که باید از دیتا شیت یا از روی خود تراشه خوانده شود.
و در نهایت پس از انتخاب Next و Finish پروژه ساخته خواهد شد.
تا اینجا ما فقط پروژه را ساختهایم و حالا باید مشخص کنیم چه نوع فایلی را میخواهیم در آن قرار دهیم.
در ابتدای کار باید یک ماژول VHDL را به پروژه اضافه کنیم، به همین منظور در قسمت Hierarchy راست کلیک کرده و گزینه New Source را انتخاب میکنیم.
اگر فایل از قبل آمادهای دارید میتوانید با استفاده از گزینه های Add Source یا Add Copy of Source آن را به پروژه اضافه کنید.
دقت کنید که فرق بین این دو گزینه این است که یکی از آنها یک کپی از فایل اصلی گرفته و آن را به پروژه اضافه میکند و گزینه دیگر خود فایل اصلی را در پروژه قرار میدهد، حال اگر شما در حین کار تغییراتی در این فایل ایجاد کنید، این تغییرات در فایل اصلی نیز اعمال خواهد شد.
پس بهتر این است که اگر فایل اصلی را نیاز داریم، از گزینه Add Copy of Source استفاده کنیم.
در پنجره ظاهر شده فایلهای متفاوتی وجود دارد که بعدا به توضیح هر کدام خواهیم پرداخت.
فایل مورد نظر ما در اینجا یک ماژول VHDL میباشد که با انتخاب گزینهی VHDL Module این فایل را به پروژه اضافه میکنیم.
دقت کنید که مانند تصویر زیر حتما هم اسم فایل و هم نوع فایل را انتخاب کنید.
در غیر این صورت خود نرم افزار یکی از گزینههای موجود را انتخاب میکند که ممکن است فایل مورد نظر ما نباشد.
با انتخاب گزینه ی Next پنجرهای ظاهر خواهد شد که ما میتوانیم با استفاده از این Wizard پورتهایی که قرار است اضافه کنیم را انتخاب کنیم.
البته میتوانیم در اینجا هیچ تنظیم خاصی را انجام ندهیم و بعد که فایل ساخته شد اسم پورتها را بنویسیم.
همانطور که در تصویر زیر مشاهده می کنید پورت ها می توانند ورودی، خروجی و یا ورودی-خروجی باشند.
همچنین در این Wizard می توانیم تعداد بیت های پورت ها را نیز انتخاب کنیم، که ما در اولین پروژه برای سادگی تمامی پورت ها را تک بیتی انتخاب می کنیم.
پس از تکمیل این مرحله ماژول VHDL ساخته و به پروژه اضافه خواهد شد.
در کد ایجاد شده همانطور که مشاهده میکنید پورت ها اضافه شدهاند، علاوه بر پورتها یک سری کامنت و الگوی اصلی کد نیز به صورت پیش فرض اضافه شده است.
بهتر است که کامنتها را حذف کنیم و با استفاده از کلید Tab چینش کد را هم منظم کنیم تا کد ما زیباتر و شکیلتر به نظر برسد.
با توجه به کدی که ما مینویسیم، باید اول کد، پکیج مربوط به کد مورد نظر اضافه شود.
در ادامه خواهید دید که ما از پکیجهای زیادی استفاده نمیکنیم و تقریبا هر نوع کدی را میتوان با پکیجهایی که معرفی خواهیم کرد نوشت.
با بروزرسانیهایی که شرکت Xilinx انجام داد می توان گفت عملا استفاده از پکیجهای قدیمی کاری بیهوده است اما هنوز هم هستند کسانی که علاقه دارند یک عالمه پکیج همان اول کد اضافه کنند که مبادا چیزی را از دست داده باشند.
در این کد ساده ما اول کد فقط دو خط زیر را اضافه می کنیم:
library IEEE;use
IEEE.STD_LOGIC_1164.ALL;
بعد از begin مربوط به architecture کد مورد نظرمان را مینویسیم، که البته ما در این پروژه به خاطر سادگی فقط یک خط کد نوشتیم. در این کد، ما در ابتدا A را با AND ،B و سپس نتیجه را با OR ،C کردهایم.
حائز اهمیت است که در اینجا ذکر گردد نتیجه کد تولید شده، ایجاد یک سخت افزار خواهد بود که شامل یک گیت AND دو ورودی و یک گیت OR دو ورودی میباشد و نتیجه کاملا متفاوت با این میباشد که ما همین منطق کد را مثلا در زبان C نوشته باشیم، در زبان برنامهنویسی هیچ سخت افزاری تولید نمیشود بلکه کدها پشت سرهم در CPU اجرا میشوند.
با استفاده از مسیر زیر میتوانید شماتیک سخت افزار ایجاد شده را مشاهده نمائید:
View RTL Schematic → OK → Add → Create Schematic
پس از اینکه مسیر بالا را طی کردید فقط یک شماتیک کلی اولیه که شامل ورودی-خروجیهای مدار شما میباشد نمایش داده خواهد شد، با دابل کلیک بر روی آن میتواند به شماتیک زیر برسید.
دیگر وقتش رسیده است که به قسمتهای جذاب داستان نزدیک و نزدیکتر شویم.
تقریبا از همین قسمت است که شما از حالت گنگ بودن و نامفهومی که شاید به خاطر آشنایی اولیه با FPGA و زبان VHDL است، رهایی خواهید جست، و دست و پنجه نرم کردن با این موجود به ظاهر خشک و عجیب و غریب برایتان هیجان انگیز خواهد بود.
پس اجازه بدهید بدون فوت وقت به موضوع اصلی مورد بحث در این مقاله بپردازیم و با مدارات ترکیبی و ترتیبی در محیطهای Concurrent و Sequential آشنا شویم.
انواع مدار دیجیتال
ترتیبی سنکرون چیست؟
مدارهای ترتیبی سنکرون تمامی مشخصات مدارات ترتیبی که ذکر کردیم را دارا میباشند.
علاوه بر این، اینگونه مدارها برخلاف مدارات آسنکرون، با یک عامل منظم به اسم کلاک نیز هماهنگ هستند.
الگو و ساختار کد در زبان VHDL
الگوی کلی یک کد به صورت مختصر در بالا نمایش داده شده است.
تصویر بالا به خوبی محیطهای مختلف و کاربرد آنها را نشان میدهد، اما به صورت کاملتر و دقیقتر در زیر به توضیح هر کدام خواهیم پرداخت:
اسم فایل: محلی که ما باید یک اسم دلخواه برای فایل VHDL (نه اسم پروژه) تعریف کنیم و دقیقا همان نام را در دو مکان دیگر، که در تصویر مشخص کردیم دوباره بنویسیم. البته اگر از Wizard استفاده کرده باشیم این کار به صورت خودکار انجام خواهد گرفت.
محل تعریف پورتها: در این محل ما باید ورودی-خروجیهایی را که در نهایت قرار است به پین های FPGA متصل شوند تعریف میکنیم.
محل تعریف سیگنالها: در این محل ما باید عواملی را تعریف کنیم که قرار است بعدا تبدیل به سیم یا رجیستر (حافظه) شوند. به محل تعریف سیگنالها دقت کنید، محل تعریف دقیقا قبل از begin مربوط به architecture میباشد.
حال اینکه سیگنالها چه موقع تبدیل به سیم و چه موقع تبدیل به رجیستر میشوند را طلبکار ما باشید تا بهش برسیم.
توجه کنید که برخلاف پورتها، سیگنالها عوامل داخلی هستند و قرار نیست که در نهایت مشخصا خودشان پورت ورودی-خروجی باشند. ولی میتوانند به پورتها ارجاع داده شوند که اتفاقا ما در ادامه همین کار را خواهیم کرد.
لیست حساسیت: عواملی هستند که با تغییر آنها process فعال خواهد شد، در واقع میتوان گفت بدون تغییر روی لیست حساسیت، process عملا هیچ کاری انجام نمیدهد.
محیط Concurrent: محلی که ما برای توصیف مدار ترکیبی از آن استفاده میکنیم. کدهایی که ما در این محل مینویسیم در نهایت تبدیل به یک سختافزار ترکیبی خواهند شد. دقت کنید که محیط Concurrent دقیقا بعد از begin مربوط به architecture میباشد.
محیط Sequential: محلی که ما برای توصیف مدار ترتیبی از آن استفاده میکنیم. این محیط نیز دقیقا بعد از begin مربوط به process میباشد. فرض کنید در لیست حساسیت، ما فقط کلاک را قرار دادیم و با تغییر کلاک، process فعال میشود و یک سری اعمال منطقی صورت میپذیرد، اگر کمی با مدار منطقی آشنا باشید میدانید که همین موضوع توصیف یک مدار ترتیبی خواهد بود.
در واقع محیط ترتیبی تعریف کردن process در دل محیط ترکیبی خواهد بود.
برای آشنا شدن بیشتر با محیط ترکیبی به کد زیر توجه کنید:
A <= B AND C;
D <= C;
قبل از هر چیزی توجه کنید که ما با استفاده از “=>” سمت راست را به سمت چپ ارجاع میدهیم.
اولویت
اگر مطالب قبلی را به خوبی دنبال کرده باشید، حتما این نکته را میدانید که هیچگونه اولویتی وجود ندارد و این دو خط کد اولویت یکسانی دارند و ارجاع تنها با تغییر مقادیر سمت راستی صورت میپذیرد. یعنی اگر مقدار C تغییر کند خط اول و دوم ارجاعاتشان همزمان خواهد بود.
پس طبق تعریفهای بالا میتوان گفت که کد زیر دقیقا معادل با کد بالا خواهد بود:
D <= C;
A <= B AND C;
Half Adder (نیم جمع کننده)
قصد داریم مدار ساده نیم جمع کننده را در FPGA پیادهسازی کنیم، اما قبل از آن با خود مدار و منطق مدار آشنا خواهیم شد که بعد بتوانیم همین منطق را پیادهسازی کنیم.
تصویر بالا به خوبی مدار نیم جمع کننده را توصیف میکند، ما فقط با توجه به جدول درستی مقادیر توابع خروجی را استخراج میکنیم، که به صورت زیر خواهند بود:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Example2 is
Port (
x : in STD_LOGIC;
y : in STD_LOGIC;
S : out STD_LOGIC;
C : out STD_LOGIC
);
end Example2;
architecture Behavioral of Example2 is
begin
S <= x xor y;
C <= x and y;
end Behavioral;
پس از اینکه کد را نوشتیم، میتوانیم کد را از لحاظ صحت Syntax بررسی کنیم.
برای این کار باید مانند تصویر زیر روی گزینه Check Syntax دابل کلیک کنیم، اگر کنار این گزینه مانند تصویر زیر سبز رنگ شد کد ما از لحاظ Syntax هیچگونه مشکلی ندارد.
در پایان اضافه کنم که شاید بعضی از دوستانی که قبلا یک آشنایی اولیه با این FPGA داشتند، منتظر هستند که هرچه سریعتر از مطالب ابتدایی گذر کنیم، ولی در نظر بگیرید که در میان خوانندگان این مجموعهی آموزشی، افرادی هستند که شاید اولین بار باشد که اسم FPGA به گوششان میخورد، پس کمی صبور باشید، به وقتش مطالبی را بیان خواهیم کرد که برای شما نیز تازگی خواهند داشت.
و دوستان مبتدی نیز در روند آموزش سعی کنند به مطالب جزئی مانند کلمات کلیدی، Syntax و دیگر نکات زبان VHDL که شاید بعضا توضیح داده نشوند توجه خاص کنند.
اولین دیدگاه را ثبت کنید