آموزش FPGA و Verilog برای تازه کارها! – قسمت اول : مقدمات، گاهی اوقات یادگیری مباحث الکترونیکی میتواند تا حدودی چالشبرانگیز و سخت به نظر برسد اما فقط کافیست قدری حوصله به خرج بدهید؛ بیشتر بخوانید، بیشتر یاد بگیرید و بیشتر تجربه کسب کنید. آنوقت خواهید دید که حتی برایتان جذاب خواهد بود. یادگیری FPGA هم از این قاعده مستثنی نیست. در سلسله آموزشهایی که در میکرو دیزاینر الکترونیک مختص این موضوع برای شما تدارک دیدهایم، خواهیم دید که چقدر راحت و سریع میتوانیم با اصول اولیهی آنها آشنا شویم و حتی یک پروژهی کوچک را با هم انجام دهیم.
اما برای اینکه به بتوانیم به این هدف برسیم، شدیدا به شما توصیه میکنیم که تمام ابزارهایی که در انتهای این آموزش برای شما لیست کردهایم را حتما دانلود کنید و مراحل آموزش را همانطور که قدم به قدم و همراه با ما میخوانید و آموزید، خودتان نیز تجربه کنید.
مسیر یادگیری FPGA
مدتها قبل که من قصد داشتم برنامهنویسی FPGA ها را یاد بگیرم، شروع کردم به گوگل کردن تا بلکه بتوانم یک فایل آموزشی کامل و جامع پیدا کنم. و شاید خندهدار یا عجیب به نظر برسد اما چنین چیزی وجود نداشت. ( البته مسلما این متعلق به زمانیست که من میخواستم یاد بگریم و حالا احتمالا بتوان چنین جزواتی را پیدا کرد.) اما منظورم از فایل آموزشی جامع چه بود؟ چیزی که به قدری کافی و مورد نیاز در مورد HDL صحبت کرده باشد، و بعد از آن تمام مراحل طراحی، سیمولیشن و پیادهسازی را سرراست و بدون حاشیه آموزش داده باشد. مسئله این جا بود – و شاید هنوز هم هست ! – که آموزشهای بسیاری وجود دارند که بر مباحث HDL تمرکز دارند. همینطور آموزشها و جزوات فراوانی که هر کدام بر طراحی، سیمولیشن، پیاده سازی و …به طور مفصل و جداگانه میپردازند. اما چیزی که وجود داشته باشد و تمام این ها را به زبان ساده، به قدرلازم و کافی و بدون پرداختن به جزییات غیرضروری و در یک جا جمع کرده باشد؛ خیر!
همانجا بود که تصمیم گرفتم این مجموعهی آموزشی چند قسمتی را تهیه کنم و به مخاطبان این سایت ارائه دهم. به این امید که شما چون من و شاید بقیه سرگردان نشوید و بتوانید با دغدغه و صرف زمان کمتری اندکی با FPGAهای دوستداشتنی آشنا شوید!
ابتدا از وریلاگ شروع میکنیم و قدری با آن آشنا میشویم. (علت اینکه من ابتدا از HDL شروع میکنم، شباهتی ست که سینتکسهای آن با سینتکسهای زبان C دارد. ) بعد یاد میگیریم که چگونه کدهایمان را شبیهسازی کنیم و آنها را بر روی سختافزارهای واقعی پیادهسازی کنیم.
ما در این مجموعهی آموزشی فرض را بر این میگذاریم که شما با برخی مفاهیم پایهای به قدر کافی آشنایی دارید. مثلا مفاهیم الکترونیک دیجیتال یا اصول اولیه زبانهای برنامهنویسی (با تاکید بر زبان C).
و البته خوب است در همین شروع کار این نکته را هم صریحا توضیح دهیم که این چند جلسهی آموزشی همانطور که گفتیم قرار است مقدمهای سرراست و جمع و جور باشند برای آشنایی اولیه و مختصر شما با وریلاگ، FPGA و هر مفهوم دیگری که از آن صحبت میکنیم. قرار نیست به صورت عمیق به تمام این مفاهیم بپردازیم و ریز و درشت نکات آنها را زیر ذرهبین ببریم. در پایان این جلسات شما ضمن اینکه خواهید دانست که بالاخره داستان FPGA ها از چه قرار است و اصول و مقدمات اولیهی آنها چه هستند، قادر خواهید بود که یک پروژهی ساده را در وریلاگ طراحی کنید، آن را شبیهسازی کنید و سپس بر روی سخت افزار پیادهسازی کنید. همین، نه بیشتر و نه کمتر! ( والبته فهم و یادگیری همینها اصلا چیز کم ارزشی نیست و ادامهی مسیر را برای شما بسیار هموار خواهد ساخت. پس اصلا دست کم نگیریدش!)
برای کارهای سیمولیشن از Xilinx ISE استفاده خواهیم کرد. ترجیحا نسخهی 14.7 از ISE Webpack را استفاده کنید. والبته آخرین نسخه از زمانی که Xilinx به Vivado منتقل شد.
اگر در زمان نصب از شما سوال کرد ، System Edition را نصب کنید. چون شامل Xilinx EDK نیز هست. توجه داشته باشید که لایسنسهای EDK و ISE Webpack جداگانه هستند و برای آنکه بتوانید برخی قسمتها را انجام دهید حتما باید لایسنس ISE را نصب کنید. و نکتهای که باید بدانید این است که لایسنس EDK تنها برای 30 روز قابل استفاده است ولی لایسنس ISE Webpack همیشگی ست. البته خوشبختانه در ایران زندگی میکنید و میتونید بصورت رایگان این ابزارها را دانلود کنید. طراحی نهایی شده را پس از شبیهسازی، بر روی بورد Elbert – Spartan 3A FPGA Development پیاده سازی میکنیم تا اطمینان حاصل کنیم کدمان بر روی سخت افزار واقعی نیز درست کار میکند. و البته اگر شما این بورد را ندارید نگران بناشید و ادامه دهید.
FPGA چیست؟
FPGA مخفف عبارت Field Programmable Gate Array به معنای آرایه گیتهای برنامهپذیر میدانی است.
همانطور که ممکن است خودتان هم بدانید یا شنیده باشید، FPGA در واقع یک مجموعهی بزرگ از گیتهای منطقی است که میتوان بارها و بارها آنها را برنامهنویسی کرد و آرایش مداری اتصالات آنها را بر حسب نیاز و کارکرد تغییر داد. اگر بخواهیم دقیقتر صحبت کنیم، عبارت “یک مجموعه/آرایهی بزرگ از گیتهای منطقی” یک عبارت کلی و بسیار ساده شده و تنها برای درک مفهوم FPGA هاست.اما در واقعیت امر با چیزی پیچیدهتر از یک آرایهی ساده از گیتهای منطقی مواجه هستیم. FPGA هایی وجود دارند که در درون آنها حتی بلوکهای سختافزاری دیگری مانند کنترلرهای مموری، اینترفیسهای ارتباطی پرسرعت، گذرگاههای PCI و … نیز تعبیه میشود. اما نکتهای که وجود دارد و باعث میشود که وقتی میخواهیم FPGA را در یک جملهی کوتاه و خلاصه معرفی کنیم، از عبارت “آرایهای از گیتهای منطقی برنامهپذیر” استفاده کنیم، این است که ماهیت عملکرد FPGA همین گیتهایی هستند که در درون آن وجود دارند و میتوان آنها را با هر پیکربندی دلخواهی به هم متصل نمود و به این ترتیب هر مدار منطقی دلخواهی را پیاده سازی کرد. باز هم شاید سادهسازی اغراقشدهای باشد اما برای تقریب ذهن میتوانید اینطور تصور کنید که تا حدودی شبیه وصل کردن گیتهای منطقی جداگانهای که به صورت IC وجود دارند. با این تفاوت که در یک مدار معمولی شما فقط یک پیکربندی مشخص دارید و پس از ساخت دیگر نمیتوانید آن را تغییر دهید. اما در FPGA این امکان وجود دارد که بارها و بارها پیکربندیهای مختلفی را پیادهسازی کرد.
FPGA ها به طور عمده توسط شرکتهای مانند Xilinx, Altera, Microsemi و … تولید میشوند. ساختمان FPGA ها تا حدودی مشابه CPLD هاست. با این تفاوت که CPLD ها ابعاد کوچکتر و قابلیتهای محدودتری دارند.
FPGA ها چه کاربردهایی دارند؟
گفتیم که اگر بخواهیم با دید معماری به آنها بنگریم، یک FPGA دریایی ست از گیتهای منطقی با قابلیت تنظیم و تغییر پیکربندی برای ساخت هر مدار دیجیتالی که بتوانید فکرش را بکنید! چنین قابلیت بینظیر و انعطافپذیری بالایی ، مسلما FPGA ها را در بسیاری از کاربردها به گزینههای مطلوبتری در مقایسه با ASIC ها (مدارهای مجتمع با کاربرد خاص) تبدیل میکند. مثلا در کاربردهای هوش مصنوعی، یادگیری عمیق، سیستمهای شتابدهی و … میتوانند با استفاده از FPGA، الگوریتمهای مختلف را بارها و بارها تکرار کنند تا زمانی که به نتیجهی بهینه برسند. در حالیکه اگر از ASIC استفاده کنند چنین انعطافپذیری گستردهای وجود ندارد و برای اجرای هر الگوریتم به یک بورد اختصاصی نیاز خواهد بود. یا مثلا در برخی کاربردهای خاص، تعداد واحدهای سختافزاری ای که باید تولید شوند اندک است. در چنین شرایطی طراحی با استفاده از ASIC به طور چشمگیری پرهزینه است. اما FPGA هم به صرفهتر و هم بهینهتر است.
بوردهای دیگری نیز وجود دارند که کار پیادهسازی را حتی سادهتر نیز کردهاند. به این ترتیب که دیگر نیازی نیست مهندسان طراحی محصول نهایی، بخواهند جزییاتی مانند تغذیهی FPGA، روتینگ DDR3 و امثالهم را در نظر بگیرند.
اگر بخواهیم لیستی از کاربردهای احتمالی FPGAها در حوزههای مختلف را مرور کنیم، موارد زیر برخی از آنها خواهند بود. و البته توصیه میکنم مقاله کاربردهای تراشه های FPGA را نیز مطالعه کنید.
- کاربردهای رمزنگاری
- ساخت پروتوتایپ در ASIC
- تجهیزات علمی، پزشکی و صنعتی
- فرآیندهای پردازش تصویر، صوت و ویدئو و یا انتشار گستردهی آنها
- هوش مصنوعی، یادگیری عمیق، محاسبات با توان بالا
- کاربرد در صنایع فضایی و نظامی
- در مخابرات، شبکه و تحلیل ترافیک
- و …
برنامه نویسی ( پروگرم کردن) در FPGA به چه معناست؟
پروسهی پروگرم کردن یا به اصطلاح دیگر توسعه دادن (develop) در FPGA ها، شامل برنامهریزی، طراحی و پیادهسازی یک مدار بر روی FPGA است که این مدار در پاسخ به یک نیاز طراحی و پیادهسازی میشود.
میزان و نوع برنامهریزی ما برای طراحی و پیادهسازی هر مدار، از مداری به مدار دیگر میتواند متفاوت باشد. اما در همهی آنها انجام دو کار میتواند در راستای یافتن مسائل پیشرو در این طراحی و اندیشیدن پیرامون راهحلی برای آنها، مفید باشد. یکی بدست آوردن لیست نیازمندیها؛ که در آن تمام نیازهای عمومی وخصوصی که در این طراحی ممکن است رخ دهند را لیست میکنیم. و دیگری تهیهی یک نقشهی راه برای آن طراحی ست. در این نقشهی راه توضیح میدهیم که مدار در نظر گرفته شده و ارائه شده، قرار است چگونه پیادهسازی شود. هر اندازهی کوتاهی که بیشتر بر روی این نقشهی راه درنگ و تامل کنیم؛ بعدتر در زمان تولید، دیباگ و رفع عیب کردن هزاران برابر آن زمان را صرفهجویی خواهیم کرد.
اما منظور از پیادهسازی کردن یک مدار طراحی شده در FPGA چیست؟ این پیادهسازی شامل :
- بازنویسی مدار طراحی شدن به یکی از روشهای قابل فهم برای FPGA است. از جملهی این روشها میتوان استفاده از شماتیکها را نام برد و یا استفاده از زبان HDL (که میتواند VHDL یا Verilog باشد.)
- سپس سنتز کردن (Synthesizing) مداری که طراحی و بازنویسی نمودهایم. ( شامل سنتز کردن، تولید netlist ها، روتینگ ها و … ) و خروجی گرفتن از آن . خروجی این مرحله نیز باید برای FPGA قابل فهم باشد.
- در نهایت این فایل خروجی را از طریق ابزارهای پروگرم کردن، به یک FPGA میدهیم. به اصطلاح برنامه را روی آن میریزیم.
البته بد نیست یادآور شویم که استفاده از روش شماتیک در بازنویسی مدار برای FPGA، امروزه دیگر چندان در صنعت متداول نیست. بنابراین ما هم عمدهی تمرکزمان را از این به بعد بر همان روش HDL (به معنای زبان توصیف سختافزاری (Hardware Description Language)) و علیالخصوص Verilog میگذاریم.
البته خبر خوبی که وجود دارد این است که مراحل سنتز و پروگرم کردن تا حدود زیادی بر عهدهی خود ابزارهای موجود نظیر ISE، Vivado و Numato Lab است و تنها کارهای کوچکی بر عهدهی کاربر است! که در ادامه ی این آموزشها آنها را توضیح خواهیم داد.
RTL چیست؟
شاید تا به حال زیاد این کلمه را شنیده باشید اما معنای آن را ندانسته باشد. RTL مخفف عبارت Register Transfer Level ، یکی از سطوح طراحی مدار در سختافزارها است. حتی ممکن است به جای سطح Register Transfer، منطق یا زبان Register Transfer هم به گوشتان بخورد. تمام اینها از نظر سختافزار یک مفهموم را میرسانند و آن بالاترین تصویری ست که شما از طراحی سختافزاری یک مدار منطقی دارید. این سطح جایی در بین دو سر طیفی قرار میگیرد که یکی از آنها داشتن مدلهای دقیق رفتاری از یک مدار و دیگری داشتن مدلهای ساختاری کلی از یک مدار در سطح گیتهاست. در مورد مدل رفتاری در جلسهی بعدی از این مجموعه آموزش صحبت میکنیم پس فعلا نگران آن نباشید و از نام آن نترسید! اما مدلهای گیتی از مدار، در واقع توصیف یک مدار دیجیتال است در قالب گیتهای منطقی تشکیل دهندهی آن که البته تا حدودی نیز روش خستهکنندهای ست!
از منظری دیگر اگر بخواهیم ببینیم، RTL را میتوان همارز با توصیف “سودو کد”ی مدارها گرفت که در نرمافزارها استفاده میشود.
اما طراحی سختافزاری را میتوان اینگونه توصیف کرد : توالی مجموعهای از مراحل که در آنها، دادهها در هر یک سیکل ساعت، از یک مجموعه رجیستر به یک مجموعه رجیستر دیگر جریان مییابند.
از همین رو، RTL را طراحی جریانِ داده (dataflow) نیز میگویند.
پس از آنکه طراحی مدار در سطح RTL آماده شد، باید آن را به کمک زبانهایی مانند Verilog، VHDL ، System Verilog یا هر زبان توصیف سختافزاری دیگری، به صورت کدهای HDL ترجمه کنیم.
در مورد HDL و Verilog در قسمت بعدی صحبت میکنیم اما در مورد RTL اگر سوالی دارید یا دوست دارید بیشتر بدانید، نگاهی به صفحهی ویکیپدیای آن بیندازید :
https://en.wikipedia.org/wiki/Register-transfer_level
Verilog چیست؟
در قسمتهای قبلی چند بار تاکید کردیم که این که FPGA ها را به صورت مجموعهای از تعداد زیادی گیت منطقی برنامهپذیرمعرفی میکنیم، تعبیری بهشدت سادهسازی شده است و حقیقت این است که FPGA ها چیزی فراتر از این عبارت هستند.
واقعیت این است که هرچند امکان پیادهسازی هر نوع مدار دیجیتالی تنها با تغییر آرایش و اتصالات گیتها در FPGA وجود دارد، اما این کار به همین صورت ساده ( یعنی صرفا تغییر آرایش و جابهجایی اتصالات) نه عملیست و نه بهینه. کاری که باید بکنیم این است که ابتدا تمام مدارها به یک فرمت سهلالاستفاده که به هر نوع آرایهای از گیتها قابل اعمال است، ترجمه کنیم.
همانطور که گفتیم دو روش موجود برای این ترجمه ، یکی استفاده از روشهای توصیف شماتیکی مدارها و دیگری استفاده از زبان توصیف سختافزار یا HDL است. تا پیش از آنکه HDL محبوب شود، روش توصیف شماتیک ، روشی پرطرفداری در میان مهندسان بود. مزیت و در عین حال نقطهی ضعف این روش این بود که علیرغم اینکه بدست آوردن آنها برای مدارهای کوچک بسیار ساده بود، در مدارهای بزرگ به غایت پیچیده و بغرنج میشد. ( برای اینکه تصوری دقیق از میزان این بغرنجی و پیچیدگی داشته باشید ؛ به این فکر کنید که مهندسین شرکت Intel، اگر قرار بود برای تراشههای Pentium که چیزی در حدود میلیونها گیت دارند، شماتیک تهیه کنند، چه فاجعهای رخ میداد! پذیرش چنین شدتی از سختی اصلا منطقی نبوده و نیست. )
اما صادقانه اگر بخواهم بگویم، اتفاقی که برای خود من هم افتاد ، این است که اگر شما اهل کارهای الکترونیکی باشید، احتمالا بر حسب عادت همیشه تمایلاتی ناخودآگاهی به سمت تهیهی شماتیک در شما وجود دارد چرا که به شما کمک میکند دید جامعی از مدار پیدا کنید. بنابراین ممکن است مقاومتی نهفته در برابر یادگرفتن زبان توصیف سختافزاری در شما وجود داشته باشد که اصلا خوب نیست! و باید تلاش کنید برای یادگیری FPGA ها بر آن غلبه کنید! به همین دلیل، در این آموزشها هم سعی میکنیم روابط فی ما بین شما و زبانهای HDL را تا حد امکان اصلاح کنیم که سخت به نفعتان خواهد بود!
Verilog یک زبان توصیف سختافزاری(HDL) ست که میتوان با استفاده از آن یک مدار دیجیتال را با روش نوشتاری توصیف کرد. ما طراحی هایی که برای FPGA انجام میدهیم را به این زبان ترجمه میکنیم.( همانطور که برنامهای که میخواهیم به میکروکنترلر بدهیم را به زبان اسمبلی یا C برگردان میکنیم.)
اگر قدری پیشینهی برنامهنویسی داشته باشید، آموختن زبان وریلاگ نیز برایتان سخت نخواهد بود.
VHDL هم یکی دیگر از زبانهای توصیف سختافزاری معروف است که به طور گسترده در صنایع مورد استفاده قرار میگیرد. واقعیت این است که هردوی اینها (Verilog و VHDL) محبوبیت و طرفداران تقریبا یکسانی دارند اما من Verilog را ترجیح میدهم چرا که هم یادگیری آن سادهتر است و هم از نظر سینتکسی مشابهتهای بسیاری با زبان C دارد.
و اصلا نگران نباشید، همین که Verilog را بیاموزید، بعد از آن یاد گرفتن VHDL کار دشواری نخواهد بود.
ابزارهای مورد نیاز در طول این آموزش
- یک نرم افزار ویرایش متن که با آن راحت باشید . (مثلا ++Notepad)
- Xilinx ISE
- یک بورد FPGA خوب! (ما در مثال های این آموزش از Mimas V2 FPGA Development Board استفاده میکنیم که تصویر آن در ابتدا مطلب آورده شده است. بورد Elbert V2 Spartan 3A FPGA نیز بورد بسیار خوبی ست. و البته اجرای پروژه در هر کدام از این دو بورد بعضا تفاوتهایی نیز دارد که هر کجا نیاز بود به آنها اشاره خواهیم کرد.)
- نرم افزار Mimas V2 /Elbert V2 Configuration downloader . ( تنها برای زمانی که از یکی از دو بورد معرفی شده در قسمت 3 استفاه میکنید. هر کدام از این دو نرم افزار را هم میتوانید از سایت خود شرکت تولیدکننده آنها دانلود کنید.)
- البته زمانی که به قسمتهای پیشرفته تر میرسیم ممکن است از ابزارهای دیگری مضاف بر اینها نیز استفاده کنیم که هر زمان لازم شدند، آنها را به شما معرفی خواهیم کرد.
توصیه میکنم زبان برنامه نویسی C و مدار منطقی را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
با عرض سلام؛
مطالب مفید و تقریبا جامعی بود،
یک سوال داشتم:بین vhdl و verilog اگر سادگی و شبیه بودن سینتکس نسبت به سی ملاک نباشه واگر فقط بخواهیم یک مورد رو یادبگیریم به نظر شما کدوم بهتره ، کاربردی تره ، جامع تره و….و چرا ؟
اگه توضیح بدید ممنون میشم.
با تشکر.
سلام، معمولا افراد حرفهای سینتکس هر دو را بلد هستن. ولی بنظرم VHDL پرطرفدار تر است.
سلام. آفرین بسیار پر محتوا و کاربردی
سلام
من نمیتونم Xilinx ISE رو دانلود کنم ، رجیستر شدم ولی دوباره مشخصات میخواد و مرتب تکرار میشه.
من نیاز به برنامه نویس زبان cبرای ARM و fpga دارم ۰۹۱۲۱۵۴۱۹۲۳
خیلی خوب توضیح دادین ممنون