مقدمه
در قسمتسوم از مجموعه آموزشی FPGA با نرمافزار ISE آشنا شدیم و درحد یک آشنایی اولیه توانستیم یک پروژه ایجاد کنیم، و یک کد بسیارساده را نیز پیادهسازی کردیم. اکنون در این قسمت از آموزش FPGA قصد داریم که در ابتدا با ساختار و محیطهای مختلفی، که ما برای تولید سختافزار، در این محیطها، کد مینویسیم آشناشویم و درنهایت یک مدارترکیبی را بااستقادهاز کد توصیفکنیم. پساز اینکه در قسمتهای قبل بهصورت مفصل درمورد ساختار FPGA صحبتکردیم و در قسمتقبلی نیز فقط به نوشتن یک کدساده بسنده کردیم، دیگر وقتش رسیدهاست که به قسمتهای جذاب داستان نزدیک و نزدیکتر شویم. تقریبا از همین قسمت است که شما از حالت گنگبودن و نامفهومی که شاید بهخاطر آشنایی اولیه با FPGA و زبان VHDL است، رهایی خواهید جست، و دست و پنجه نرمکردن با این موجود به ظاهر خشک و عجیبو غریب برایتان هیجانانگیز خواهدبود. پس اجازهبدهید بدون فوت وقت به موضوعاصلی موردبحث در این مقاله بپردازیم و با مدارات ترکیبی و ترتیبی در محیطهای Concurrent و Sequential آشناشویم.
انواع مداردیجیتال
مدارهای دیجیتال شامل دو دستهکلی ترکیبی و ترتیبی (ترتیبی سنکرون و ترتیبی آسنکرون) هستند. مدارهای ترکیبی مداراتی هستند که خروجیهای مدار فقط به ورودیهای مدار در همانلحظه بستگی دارند. اما مدارهای ترتیبی مداراتی هستند که خروجیهای مدار علاوهبر ورودیهای مدار در همانلحظه، به ورودیهای لحظات قبلتر نیز وابسته هستند.
در FPGA نیز محیطهایی برای طراحی اینگونه مدارها درنظرگرفته شدهاست که این انتخاب و انعطاف را به ما بدهد که درمواقع لزوم و برحسب کارایی بتوانیم مدار موردنظر را طراحیکنیم. اگر توجهکردهباشید امروزه تقریبا تمامی مداراتی که ما با آنها برخورد میکنیم مدارات ترتیبی هستند، و کمتر پروژهای را میبینیم که حداقل نوعیاز حافظه، که خود نشانگر ترتیبیبودن مدار میباشد در آن بهکار نرفتهباشد. ما نیز از این قاعده مستثنی نخواهیم بود و درنهایت همه مداراتی که پیادهسازی میکنیم ازنوع ترتیبی، و البته ترتیبی سنکرون خواهند بود. اما برای اینکه از اول شروع این مجموعه قرار بر این بود که از سطح مبتدی و از پایه مطالب بیانگردد، و تاحد امکان تمامی سرفصلها آموزش دادهشوند، ابتدا با مدارهای ترکیبی و نحوه پیادهسازی آنها آشنا خواهیمشد ولی درنهایت ما تقریبا در هیچ یک از پیادهسازیها یک مدار مطلقا ترکیبی نخواهیمداشت. همانطورکه در بالا اشارهشد مدارهای نهایی ما از نوع ترتیبی سنکرون هستند. ترتیبی سنکرون چیست؟
مدارهای ترتیبی سنکرون تمامی مشخصات مدارات ترتیبی که ذکرکردیم را دارا میباشند. علاوهبراین، اینگونه مدارها برخلاف مدارات آسنکرون، با یک عامل منظم به اسم کلاک نیز هماهنگ هستند.
الگو و ساختارکد در زبان VHDL
الگوی کلی یک کد بهصورت مختصر در بالا نمایشداده شدهاست. تصویربالا بهخوبی محیطهای مختلف و کاربرد آنها را نشان میدهد، اما بهصورت کاملتر و دقیقتر در زیر به توضیح هرکدام خواهیمپرداخت:
اسم فایل: محلی که ما باید یک اسم دلخواه برای فایل VHDL (نه اسم پروژه) تعریفکنیم و دقیقا همان نام را در دو مکاندیگر، که در تصویر مشخصکردیم دوباره بنویسیم. البته اگر از Wizard استفادهکردهباشیم اینکار بهصورتخودکار انجامخواهدگرفت.
محل تعریف پورتها: در این محل ما باید ورودی-خروجیهایی را که درنهایت قرار است به پینهای FPGA متصلشوند تعریف میکنیم.
محل تعریف سیگنالها: در این محل ما باید عواملی را تعریفکنیم که قرار است بعدا تبدیلبه سیم یا رجیستر(حافظه) شوند. به محل تعریف سیگنالها دقتکنید، محل تعریف دقیقا قبلاز begin مربوط به architecture میباشد.
حالاینکه سیگنالها چهموقع تبدیلبه سیم و چهموقع تبدیلبه رجیستر میشوند را طلبکار ما باشید تا بهش برسیم.
توجهکنید که برخلاف پورتها، سیگنالها عوامل داخلی هستند و قرارنیست که درنهایت مشخصا خودشان پورت ورودی-خروجی باشند. ولی میتوانند به پورتها ارجاعدادهشوند که اتفاقا ما درادامه همینکار را خواهیمکرد.
لیست حساسیت: عواملی هستند که با تغییر آنها process فعال خواهد شد، درواقع میتوان گفت بدونتغییر روی لیست حساسیت، process عملا هیچکاری انجام نمیدهد.
محیط Concurrent: محلی که ما برای توصیف مدارترکیبی از آن استفاده میکنیم. کدهایی که ما در این محل مینویسیم درنهایت تبدیلبه یک سختافزار ترکیبی خواهند شد. دقتکنید که محیط Concurrent دقیقا بعداز begin مربوط به architecture میباشد.
محیط Sequential: محلی که ما برای توصیف مدارترتیبی از آن استفاده میکنیم. این محیط نیز دقیقا بعداز begin مربوطبه process میباشد. فرضکنید در لیست حساسیت، ما فقط کلاک را قرار دادیم و با تغییر کلاک، process فعال میشود و یکسری اعمال منطقی صورت میپذیرد، اگر کمی با مدارمنطقی آشناباشید میدانید که همین موضوع توصیف یک مدارترتیبی خواهدبود.
درواقع محیط ترتیبی تعریفکردن process در دل محیط ترکیبی خواهد بود.
برای آشناشدن بیشتر با محیط ترکیبی به کدزیر توجهکنید:
A <= B AND C; D <= C;
قبلاز هرچیزی توجهکنید که ما بااستفادهاز “=>” سمت راست را به سمت چپ ارجاع میدهیم.
ارجاعات زمانی صورت میپذیرند که مقادیر سمت راست ارجاع تغییر کنند، یا اصطلاحا میگویند که Event رخدادهاست. پس در محیط ترکیبی، مقادیر سمت چپ ارجاع زمانی تغییرخواهندکرد که روی مقادیر سمت راست ارجاع Event رخ بدهد. البته یکباردیگر نیز ارجاعات صورت میگیرند بدوناینکه در سمت راست ارجاع Event رخ داده باشد، و آن زمان، زمان روشنشدن اولیه مدار میباشد.
اولویت
اگر مطالب قبلی را بهخوبی دنبالکردهباشید، حتما این نکته را میدانید که هیچگونه اولویتی وجود ندارد و این دو خط کد اولویت یکسانی دارند و ارجاع تنها با تغییر مقادیر سمت راستی صورت میپذیرد. یعنی اگر مقدار C تغییر کند خط اول و دوم ارجاعاتشان همزمان خواهد بود.
پس طبق تعریفهای بالا میتوان گفت که کد زیر دقیقا معادل با کدبالا خواهدبود:
D <= C; A <= B AND C;
Half Adder (نیمجمعکننده)
قصد داریم مدارساده نیمجمعکننده را در FPGA پیادهسازی کنیم، اما قبلاز آن با خود مدار و منطق مدار آشنا خواهیمشد که بعد بتوانیم همین منطق را پیادهسازی کنیم.
تصویربالا بهخوبی مدار نیمجمعکننده را توصیف میکند، ما فقط باتوجهبه جدولدرستی مقادیر توابع خروجی را استخراج میکنیم، که بهصورتزیر خواهند بود:
S = x ⊕ y
C = x . y
الان فقط کافیست همین دوخط بالا را به زبان VHDL، در محیط Concurrent بنویسیم، کل کد ما بهصورتزیر خواهد بود:
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 که شاید بعضا توضیحدادهنشوند توجهخاص کنند.
در قسمتپنجم درمورد پورتها، سیگنالها و اینکه چگونه یک ماژول را به ماژول دیگر اضافهکنیم، صحبتخواهیمکرد، پس با ما همراه باشید.
منبع: سیسوگ