آموزش, آموزش FPGA, الکترونیک دیجیتال, توصیه شده, مقاله های سیسوگ

ساختار شرطی case در FPGA | آموزش FPGA قسمت یازدهم

آموزش FPGA از مقدماتی تا پیشرفته

در قسمت دهم از آموزش FPGA به طور کامل با ساختار شرطی if آشنا شدیم و همه‌ی قابلیت‌های این ساختار را با استفاده از مثال انکودر اولویت‌دار به طور کامل بررسی کردیم.

در این قسمت قصد داریم ساختار شرطی case را بررسی کنیم، و این ساختار را با ساختار شرطی if مقایسه کنیم. در نهایت مزایا و معایب هر کدام را نسبت به دیگری بیان خواهیم کرد.

در قسمت‌های قبلی مثال‌هایی که بیان کردیم عمدتا مدارات ترکیبی مانند مالتی‌پلکسر، انکودر و … بودند که همه‌ی ما حداقل از دوران دانشگاه تا حدودی با این مدارات آشنا هستیم. در بسیاری از کتاب‌ها نیز سعی می‌شود که اصول اولیه زبان VHDL با استفاده از توصیف همین مدارات آموزش داده شود، ما نیز از این قاعده مستثنی نبودیم و سعی کردیم همین روند را دنبال کنیم. اگرچه همین مدارات ذکر شده، المان‌های پایه و ضروری در طراحی مدارات دیجیتال می‌باشند، اما شاید شما از این روند خسته شده باشید و منتظر مثال‌های متنوع‌تری باشید. نگران نباشید، از این قسمت به بعد کم‌کم مثال‌ها عوض خواهند شد و همچنین با کدنویسی اصولی آشنا خواهید شد.

فرض کنید مداری وجود دارد که وقتی یک ورودی چند بیتی به آن اعمال می‌شود، ترتیب بیت‌ها را به نحوی که ما تعیین می‌کنیم تغییر می‌دهد. برای سادگی در نظر بگیرید که بیت‌ها به نحوی تغییر می‌کنند که کم‌ارزش‌ترین بیت جایش را به باارزش‌ترین بیت می‌دهد، به همین ترتیب بیت‌ها جابه‌جا می‌شوند تا اینکه با ارزش‌ترین بیت جایش را به کم‌ ارزش‌ترین بیت می‌دهد. نحوه‌ی جابه‌جایی بیت‌ها را می‌توانید در تصویر زیر مشاهده کنید.

msb to lsb

حال می‌خواهیم عملکرد جدول بالا را با استفاده از ساختار شرطی case در زبان VHDL توصیف کنیم. ابتدا کد مربوطه را خواهیم نوشت، سپس توضیحاتی در مورد عملکرد و سینتکس کد خواهیم داد.

ساختار شرطی case

همانطور که در کد بالا مشاهده می‌کنید بعد از کلمه کلیدی case، سیگنالی که قرار است روی آن شرط بگذاریم (i) نوشته خواهد شد. پس از سیگنال شرط، کلمه کلیدی is قرار خواهد گرفت. اکنون با استفاده از کلمه کلیدی when، مقادیر مختلف را روی سیگنال شرط قرار خواهیم داد. بعد از اینکه مقادیر مختلف را روی سیگنال شرط قرار دادیم، نوبت آن است که ارجاعات متناظر با شرط موردنظر را بنویسیم. به همین ترتیب ابتدا شرط مربوطه، و سپس ارجاعات متناظر با آن را می‌نویسیم. در نهایت این ساختار با عبارت کلیدی end case به پایان می‌رسد.

اگر توجه کرده باشید در اواخر ساختار شرطی case، عبارت when others را نوشتیم. در ساختار شرطی case حتما باید عبارت when others وجود داشته باشد. این عبارت را در انتهای این ساختار، قبل از end case خواهیم نوشت.

در واقع عبارت when others نه تنها حالت “I=”111 را شامل می‌شود، بلکه به چندین حالت دیگر نیز اشاره می‌کند. اجازه بدهید در ادامه مفصل‌تر در باب این موضوع صحبت کنیم.

در زبان VHDL هر بیت می‌تواند 9 حالت مختلف داشته باشد، که از این 9 حالت فقط 3 حالت، قابلیت پیاده سازی را دارند.

3 حالتی که قابلیت پیاده‌سازی دارند عبارتند از:

  • 1
  • 0
  • z

تا به حال ما دو حالت اول را شناختیم و در مثال‌های مختلف از این حالات استفاده کردیم، در قسمت‌های پیش‌رو مفصلا در مورد حالت z صحبت خواهیم کرد. الان فقط به این حالت اشاره کردیم تا بتوانیم در ادامه توضیحات‌مان را کامل کنیم.

در مثال ما چون ورودی 3 بیتی است، پس 729 حالت متفاوت می‌تواند وجود داشته باشد، از بین تمامی این حالات 27 حالت قابلیت پیاده‌سازی را دارند. اکنون اگر حالت‌هایی که حداقل یکی از بیت‌ها شامل z می‌شود را در نظر نگیریم؛ جمعا 8 حالت باقی می‌ماند. 7 حالت از این 8 حالت را در شرط‌های متوالی با استفاده از کلمه کلیدی when، قبل از عبارت when others پوشش دادیم. تنها یک حالت دیگر باقی می‌ماند، ما همیشه در هر مثالی آخرین حالت موردنظر را در یکی از حالت‌های when others در نظر خواهیم گرفت.

در یک جمع‌بندی کلی می‌توان گفت در مثال بالا when others به 722 حالت اشاره می‌کند که تنها یکی از این حالات مدنظر ما است.

if یا case

هر کدام از دو ساختار شرطی که در محیط ترتیبی شناختیم (یعنی ساختار شرطی if و case) متناسب با سیگنال شرط، می‌توانند مورد استفاده قرار بگیرند. برای اینکه بهتر بدانید چه موقع از کدام یک از این ساختارهای شرطی استفاده کنید به توضیحات زیر توجه کنید.

در ساختار شرطی case، فقط می‌توانیم از حالت مساوی بودن استفاده کنیم، به عبارتی دیگر فقط عملگر مساوی (=) می‌تواند روی سیگنال شرط قرار بگیرد. اما در ساختار شرطی if، هر عملگری می‌تواند روی سیگنال شرط قرار بگیرد، همچنین می‌توانیم ترکیب چندین شرط مختلف را نیز داشته باشیم.

اینطور به نظر می‌رسد که ساختار شرطی if، کامل‌تر و جامع‌تر از ساختار شرطی case است؟ بله ساختار شرطی if کامل‌تر و جامع‌تر است، اگر ما در کدمان فقط از if استفاده کنیم با هیچ محدودیتی روبه‌رو نمی‌شویم و می‌توانیم هر حالتی را در کدمان به خوبی پوشش بدهیم. اما همیشه همه چیز به این خوبی‌ها نیست و گاها مشکلاتی برایمان ایجاد خواهد شد که با رعایت کردن نکاتی که در ادامه خواهیم گفت، این مشکلات برطرف خواهند شد.

اجازه بدهید قبل از اینکه به خود مشکل بپردازیم گذری بر این داشته باشیم که ساختار شرطی if و ساختار شرطی case چگونه در FPGA پیاده‌سازی می‌شوند. در صورتی که شما بدانید این ساختارها چگونه در FPGA پیاده‌سازی می‌شوند، به احتمال زیاد حدس بزنید که چرا با اینکه می‌دانیم ساختار شرطی if قابلیت بیشتری دارد ولی همیشه نباید از این ساختار استفاده کنیم.

وقتی از ساختار شرطی case استفاده می‌کنیم تمامی شرط‌ها همزمان با یکدیگر بررسی می‌شوند و تاخیر در حالت حداقل خود می‌باشد. اما زمانی که از ساختار شرطی if استفاده می‌کنیم، شرط‌ها به ترتیب از بالا به پایین مورد بررسی قرار خواهند گرفت و تاخیر از مقدار حداقلی که در ساختار شرطی case داشتیم، مقداری بیشتر خواهد بود.

مشکل چه زمانی ایجاد خواهد شد؟ ممکن است ما الگوریتمی داشته باشیم که وقتی درون FPGA پیاده‌سازی شد، نیاز باشد با کلاک 100M کار کند تا خواسته مسئله برآورده شود، یا به عبارتی دیگر محاسبات الگوریتم به درستی انجام شود. حال فرض کنید حداکثر کلاکی که ما مجاز هستیم به مدار اعمال کنیم (حداکثر کلاک قابل اعمال به مدار در نرم‌افزار قابل مشاهده است که در قسمت‌های آتی در این مورد صحبت خواهیم کرد) مقداری کمتر از 100M است و اگر ما این کلاک را به مدار اعمال کنیم، محاسبات الگوریتم به درستی انجام نمی‌شود. یک راه‌حل این است که کد را بهینه‌تر بنویسیم تا به کلاک موردنظر برسیم، و یکی از این راه‌های بهینه شدن کد این است که تا جایی که می‌توانیم به جای if، از case استفاده کنیم. پس از اینکه تغییرات لازم را انجام دادیم این احتمال وجود دارد که به کلاک موردنظر برسیم.

نتیجه‌ای که می‌توان گرفت این است که، تا جایی که می‌توانیم باید از ساختار شرطی case استفاده کنیم، مگر اینکه مجبور شویم و شرطمان به گونه‌ای باشد که case جواب‌گوی مسئله نباشد.

جمع‌بندی

  • در ساختار شرطی case، همه‌ی شرط‌ها همزمان با یکدیگر مورد بررسی قرار می‌گیرند
  • در ساختار شرطی case، سیگنال شرطی که استفاده می‌کنیم، فقط می‌تواند مساوی با مقدار خاصی باشد و از حالت‌های بزرگ‌تری، کوچک‌تری و … نمی‌توانیم استفاده کنیم
  • در ساختار شرطی case، حتما باید عبارت when others نوشته شود
  • در ساختار شرطی if، شرط‌ها به ترتیب از بالا به پایین مورد بررسی قرار می‌گیرند
  • در ساختار شرطی if، سیگنال شرطی که استفاده می‌کنیم، می‌تواند مساوی، بزرگ‌تر، کوچک‌تر از هر مقدار خاصی باشد
  • زمانی که فقط یک شرط وجود دارد و قرار است حالت مساوی بودن شرط بررسی گردد، فرقی نمی‌کند که از کدام ساختار استفاده می‌کنید

توصیه‌ها

  • حتی‌الامکان از ساختار شرطی case استفاده کنید
  • از ساختار‌های شرطی تودرتو تا جای ممکن استفاده نکنید
  • عبارت شرط را به ساده‌ترین نحو ممکن بنویسید
در این قسمت ساختار شرطی case را به طور کامل بررسی کردیم و در نهایت مقایسه‌ای تخصصی بین هر دو ساختار انجام دادیم و توصیه‌هایی را برای هرچه بهتر شدن کد و حرفه‌ای شدن شما بیان کردیم. در قسمت دوازدهم مقدماتی از کلاک بیان خواهیم کرد و عناصر پایه‌ای مانند لچ و فلیپ‌فلاپ را توصیف خواهیم کرد، همچنین از قسمت بعد کدنویسی اصولی را شروع خواهیم کرد.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

11 دیدگاه در “ساختار شرطی case در FPGA | آموزش FPGA قسمت یازدهم

  1. Avatar for فاطمه فاطمه گفت:

    سلام ممنون خيلي استفاده بردم ممنون از سايت مفيدتون
    مشكلي كه من داريم اينه كه شرطي كه بايد برسي كنم به سورت وكتور هست و خطا ميده كه بايد در دستور كيس براي آرايه سلكت انجام بشه بنظرتون بايد چكار كنم؟

  2. Avatar for mehrnaz mehrnaz گفت:

    سلام
    با تشکر از آموزش خوبتون.
    ببخشید در جلسه دهم گفته شد که ساختار شرطی if اگر دارای if_then باشد شرط ها بصورت موازی بررسی میشن ولی در جلسه یازدهم گفته شد که “در ساختار شرطی if، شرط‌ها به ترتیب از بالا به پایین مورد بررسی قرار می‌گیرند”
    کدوم درسته؟

    1. Avatar for کامین جلیلی کامین جلیلی گفت:

      سلام مهرناز جان.

      ببینید اگر شما ifها را به صورت جداگانه بنویسید، و هیچ else یا elsif نباشد، در این صورت به صورت موازی بررسی می‌شوند. دلیلش هم این است که شرط‌ها از هم مستقل هستند.

      اما اگر در ساختار شرطی if از else یا elsif استفاده بکنیم، آن موقع بررسی به ترتیب از بالا به پایین است.

      توضیح مختصر و مفیدش این بود، اگر باز جایی مشکل داشتید بپرسید.

      1. Avatar for mehrnaz mehrnaz گفت:

        متوجه شدم
        خیلی ممنون

        1. Avatar for کامین جلیلی کامین جلیلی گفت:

          ???

  3. Avatar for farid farid گفت:

    خیلی ساده و روان . به من که خیلی کمک کرد .
    فقط امیدوارم آموزشتون ادامه داشته باشه و تمام نشه اینجا .

    1. Avatar for Phoenix Phoenix گفت:

      ممنون، نظر لطف شماست فرید عزیز. آموزش FPGA ادامه‌دار خواهد بود و در نهایت به MicroBlaze ،Zynq و HLS ختم خواهد شد.

      1. Avatar for fanooos fanooos گفت:

        با سلام و تشکر بینهایت بابت مطالب اموزشی تون که کاملا مشخصه زمان صرف کردید چون بسیار عالی و قابل فهم نوشته شده . من به اموزش میکرو بلیز به شدت نیاز دارم و بی صبرانه منتظرم که اموزشش رو بذارید و پیشاپیش ممنونم .

        1. Avatar for Kamin Jalili Kamin Jalili گفت:

          سلام دوست عزیز. سپاس از توجه‌تان. میکروبلیز چیز خاصی نداره، لازمش دونستن زبان C و سینتکس‌هایی هست که براش وجود داره و جانمایی اون بر روی FPGA هستش. بقیش می‌شه همون میکروکنترلر دیگه.

  4. Avatar for َAmir َAmir گفت:

    سلام
    مثل همیشه
    عالی
    مفید
    کامل
    منتظر ادامه آموزش ها هستیم

    1. Avatar for Phoenix Phoenix گفت:

      سلام امیر عزیز. خواهش میکنم؛ نظر لطف شماست.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *