مدارات ترتیبی
در قسمت هفتم از مجموعه آموزشی FPGA ساختار ارجاع انتخابی را تشریح، و بااستفادهاز آن یک مالتیپلکسر ۴ به ۱ را توصیف کردیم. در همان قسمت بحث مربوط به مدارات ترکیبی را به پایان رساندیم و همچنین هرآنچه درمورد کلیات و مفهوم مدارات ترکیبی نیاز بود، را به شما آموزشدادیم.
در این قسمت با پایهایترین عناصر سازنده مدارات ترتیبی و اینکه چگونه میتوانیم منطق یک مدار ترتیبی را بااستفادهاز زبان VHDL توصیفکنیم آشناخواهیمشد. درنهایت، در این قسمت برای درک منطق و فلسفه مدارات ترتیبی، یک کد خیلیساده خواهیمنوشت و مقادیر ارجاعات در لحظات مختلف را بررسیخواهیمکرد.
قابلتوجهاست که در ابتدای کار ما قواعدی را بهکار خواهیمبرد که درنهایت خودمان این قواعد را بنابه دلایلی نقد و حتی نقض خواهیمکرد. گرچه دربسیاریاز دورههای آموزشی، که غالبا پول هنگفتی از این بابت از شما دریافت میشود و همچنین بسیاریاز کتابها، اعماز داخلی و خارجی این قواعد رعایت نمیشود. بعضا رعایتنکردن این قواعد مداری را خلق میکند که خلاف منطق و فلسفه مدارات ترتیبی است، یا حداقل مدار خلقشده غیربهینه خواهدبود.
مدارات ترتیبی
در قسمت چهارم توضیحات مختصری را در رابطه با این مدارات بیانکردیم، و همانطورکه شما میدانید در اینگونه مدارات ما برای داشتن خروجی، علاوهبر داشتن ورودیهای مدار درهمانلحظه، به ورودیهای لحظات قبلتر مدار نیز نیاز داریم. اما چگونه؟
در مدارات ترتیبی عناصر پایهای به اسم حافظه وجود دارند که درمواقعلزوم، ما برای داشتن دادهای از لحظات قبلتر، از مقادیر این عناصر حافظه استفاده خواهیم کرد.
کوچکترین عنصر حافظه فلیپفلاپ میباشد، که میتواند کوچکترین واحد دادههای دیجیتال، یعنی همان بیت را در خود نگه دارد.
فلیپفلاپها انواع مختلفی دارند که شما میتوانید برای آشنایی بیشتر با انواع فلیپفلاپها به کتابهای مرجع همانند کتاب مدار منطقی موریس مانو مراجعه کنید.
آشنایی با فلیپفلاپهای بهکاررفته در FPGAهای شرکت Xilinx میتواند به ما دیدی بدهد که کد VHDL را طوری بنویسیم که مدار بهینهتری پیادهسازی شود. ولی همانطورکه قبلا ذکرکردیم در ابتدای کار این اصول را رعایت نمیکنیم تا بعدا که بهصورت اصولی کدنویسی کردیم بتوانیم مقایسهای بین این دو انجامبدهیم تا ارزش کدنویسی اصولی مشخصشود و همچنین شما پساز اینکه این موارد بیان گردید، حتی اگر بخواهید غیراصولی کد بنویسید، دیگر نتوانید.
مدارات ترتیبی در محیط Sequential
محیطی به اسم محیط Sequential در دل محیط Concurrent نهفتهاست که ما برای توصیف مدارات ترتیبی از این محیط استفاده میکنیم. اگر برگردید به قسمت چهارم در تصویر الگو و ساختار کد در زبان VHDL، الگویکلی این محیط ترتیبی را مشاهده میکنید. محیط Sequential، با کلمه کلیدی process شروع میشود و با کلمه کلیدی end process به پایان میرسد.
همانطورکه مشاهده میکنید در جلوی عبارت process، لیستی وجود دارد به اسم لیست حساسیت. اما این لیست حساسیت چیست؟
در لیست حساسیت سیگنالهایی قرار میگیرند که اگر تغییری روی هریک از این سیگنالها رخ بدهد، process فعال میشود و ارجاعات درون process صورت میگیرند.
اما ارجاعات درون process چگونه رخ میدهند؟ وقتی تغییری روی یکی از سیگنالهای لیست حساسیت رخ بدهد، همانطور که گفتیم process فعال میشود و تازه قرار است که ارجاعات انجام شوند، و تا به این لحظه هیچکدام از ارجاعها بهصورت تکی رخندادهاست. باتوجهبه اینکه سمت راست ارجاع چه عبارتی نوشتهشدهباشد، این ارجاع میتواند سریعتر یا دیرتر از سایر ارجاعات به پایان برسد. یعنی درون FPGA، یک ارجاع باتوجهبه عبارت سمت راستش سریعتر یا دیرتر از سایر ارجاعات شروع و به پایان میرسد؟ خیر، اینگونه نیست. در زبان VHDL و درون FPGA همه ارجاعات باهم شروع میشوند، اما اجازه بدهید در رابطه با زمان پایان یافتنشان با همدیگر بحثکنیم. ما بیانکردیم که ارجاعات باتوجهبه عبارت سمت راستشان میتوانند سریعتر یا دیرتر به پایان برسند نه اینکه هر ارجاع برای خودش در زمان خاصی شروع شود و به پایان برسد.
در بالا در رابطه با ارجاعات مختلف دو مورد را بیان کردیم. مورد اول گفتیم که زمان پایان یافتن هر ارجاع باتوجهبه عبارت سمت راستش میتواند متفاوت باشد. و مورد دوم اینکه در زبان VHDL و درون FPGA تمامی ارجاعات باهم و همزمان شروع میشوند. ظاهرا این دو اصل باهم ناسازگاری دارند و برقرارشدن این دو اصل باهم غیرممکن است! خیر اینگونه نیست، بلکه بهنحوی این دو اصل سازگاری کامل باهم دارند و درنهایت مدار توصیفشده نیز عملکرد صحیحی خواهد داشت. برای روشنشدن هرچه بیشتر موضوع با ما همراه باشید.
در ادامه برای شما دو راهحل ارائه خواهیم داد که راهحل اول بی مورد و حتی با فرضیات مسئله که گفتیم زمان پایان یافتن ارجاعات متفاوت است هم سازگاری ندارد (چون در راهحل پیشرو فرض میکنیم که زمان پایان یافتن ارجاعات مانند زمان شروعشان، همزمان با یکدیگر است) و اصولا اسم راهحل گذاشتن روی این مورد خود اشتباه است. اما برای درک هرچه بیشتر موضوع، شما حتما این راهحل اشتباه را بخوانید و از ما خرده نگیرید.
اما این دو راهحل چیست؟ راهحل اول این است که ارجاعی که عبارت سمت راستش نیازبه محاسبات بیشتری دارد همزمان با ارجاعی که عبارت سمت راستش نیازبه محاسبات کمتری دارد به اتمام برسد، و در لحظه بعد دوباره ارجاعات شروعشوند. اما این راهحل اشتباه است، چرا؟ چونکه هنوز یکیاز ارجاعات محاسباتش تمام نشده است ولی ارجاعات همزمان به پایان رسیدهاند و تازه قرار است که دوباره ارجاعات شروع شوند، پس در خروجی ارجاعی که عبارت سمت راستش نیازبه محاسباتبیشتری دارد، مقدار یا دیتای غیرصحیحی خواهیمداشت. پس این راهحل، راهحلی اشتباه است.
اما راهحل دوم، ارجاعی که عبارت سمت راستش نیازبه محاسبات کمتری دارد، وقتی محاسباتش تمامشد حق ندارد دوباره استارت بخورد، بلکه صبر میکند تا ارجاع دیگر نیز محاسباتش تکمیل و به پایان برسد و در این لحظه هردو باهم دوباره استارت میخورند و ارجاعات همزمان با یکدیگر شروع میشوند. که این عملکرد، عملکردصحیحی میباشد و تنها راهحل صحیح نیز همین میباشد.
پس بهصورتخلاصه میتوان گفت که در زبان VHDL و درون FPGA شروع ارجاعات همزمان با یکدیگر است ولی پایان ارجاعات باتوجهبه عبارت سمت راستشان میتواند متفاوتباشد.
اولین سوالی که شاید ذهنتان را درگیر خود کند، این است که راهحل دوم که راهحلی صحیح میباشد، به چهنحوی در زبان VHDL نوشته میشود و چگونه در FPGA پیادهسازی میشود، و یکیاز ارجاعات چگونه میتواند منتظر ارجاع دیگر بماند؟
فرضکنید در لیست حساسیت، فقط کلاک قرار دارد و همهی ارجاعات با تغییر کلاک موردنظر رخ میدهند. همچنین ما این انعطاف را داریم که سرعت کلاک را متناسب با عملیات انتخابکنیم. راهحل این است که سرعت کلاک را دقیقا متناسب با ارجاعی که سمت راستش پیچیدهترین عبارت قرار دارد انتخابکنیم. با رعایتکردن همین نکته خودبهخود بحث منتظرماندن ارجاعات، برای سایر ارجاعاتی که ممکناست محاسباتشان نیازبه زمانبیشتری داشتهباشد حل میشود و تضمین میشود که سایر ارجاعات نیز بهطور کاملا صحیحی انجام میشوند. حالا فکرنکنید که ما باید بشینیم تکبه تک این ارجاعات را چککنیم و تازه بعداز کلی محاسبات متوجهبشیم که فرکانس کلاک اعمالی باید فلان مقدار باشد. خبرخوب اینکه تمامی این کارها و محاسبات را خود نرمافزار انجام میدهد و درنهایت گزارشهایی را در اختیارما قرار میدهد که حداکثر سرعت کلاک اعمالی نیز در این گزارشها قرار دارد. در قسمتهای آتی این گزارشها را بیشتر بررسی خواهیمکرد.
اگر برای اولینبار است که با توضیحاتبالا آشنا میشوید بهاحتمال زیاد این توضیحات کمی برایتان گنگ خواهد بود. برای درک هرچه بیشتر موضوع میتوانید به مقاله “با مفهوم Pipeline بهتر آشنا شوید” مراجعهکنید. گرچه کلیت این مقاله درمورد موضوع دیگری است، ولی تمامی مواردی که در بالا ذکرکردیم را نیز پوشش میدهد و به تعدادی از سوالاتی که برایتان پیشآمدهاست پاسخ میدهد. درنهایت اگر سوالی داشتید میتوانید با ما به اشتراک بگذارید تا به آنها پاسخدهیم.
اگر خاطرتان باشد در قسمت اول خدمتتان عرضکردیم که FPGA موازی کار میکند و در قسمتهای بعدتر از آن نیز درباره عملکرد موازی این تراشهها توضیحاتی دادیم و به شما قولدادیم که در روند این آموزش هرچه بیشتر با این عملکرد آشنا خواهید شد. در این قسمت هم مشاهدهکردیم که تمامی ارجاعات باهم و همزمان با یکدیگر انجام میشوند که این موضوع خود مفهوم موازیبودن را میرساند.
با تمامی این تفاسیر و توصیحات مفصلی که هم وجود دارد و هم ما خدممتان عرض کردیم، به گوشمان رسیدهاست که بعضیاز افراد عادی که نه، بلکه بعضیاز افراد به اصطلاح استاد در آموزشگاهها یا موسسات مختلف به شاگردان خود آموزش میدهند که در محیط ترتیبی ارجاعات یکی پساز دیگری بهترتیب اجرا میشوند! خودتان را ناراحت نکنید، در جواب این اساتید عزیز فقط بگویید پس فرق زبان VHDL با زبانهای برنامهنویسی در چیست؟ یا در مقابل میکروکنترلرها چرا FPGA ها هم وجود دارند؟
کلمه Sequential یا معادل فارسی آن که همان “ترتیبی” میشود، به این دلیل برای محیط ذکرشده انتخابشدهاست که این محیط برای توصیف مدارات ترتیبی مورداستفاده قرارمیگیرد، نهاینکه ارجاعات بهترتیب و یکی پساز دیگری انجامشوند.
منحصرا این قسمت را اختصاصدادیم به توضیحاتی درمورد محیط Sequential، و قصد نداریم در این قسمت مثال خاصی ارائه بدهیم چون اگر شما متوجهشوید که پشت پرده کد VHDL و در درون FPGA چه اتفاقاتی میافتد، خودتان قادرخواهیدبود هر کد و مثالی را بنویسید.
در بخش پایانی یک کد ساده که از سه ارجاع تشکیلشدهاست، در زیر برایشما آوردهشدهاست.
process(x,y) begin B <= A; C <= B; A <= B; end process;
مقادیر هر سه ارجاع در لحظات مختلف، در جدول بالا نمایشداده شدهاست که شما بهراحتی میتوانید تحلیلکنید که چرا این مقادیر بهدست آمدند. فقط یادتانباشد که همهی این ارجاعات همزمان با یکدیگر رخ میدهند و با زبان برنامهنویسی فرقدارد.
در قسمت نهم عناصر حافظه را توصیف خواهیمکرد و بااستفادهاز چندینمثال درمورد ساختارهای شرطی در محیط Sequential صحبت خواهیمکرد.
منبع: سیسوگ