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

0
98
ساختار شرطی case
ساختار شرطی case

مقدمه

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

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

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

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

msb to lsb
msb to lsb

 

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

ساختارشرطی case

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;


entity MSB_LSB is
Port ( 
I : in unsigned (2 downto 0);
O : out unsigned (2 downto 0)
);
end MSB_LSB;

architecture Behavioral of MSB_LSB is

begin

process(I)
begin

case I is

when "000" =>
O <= "000";

when "001" =>
O <= "100";

when "010" =>
O <= "010"; 

when "011" =>
O <= "110"; 

when "100" =>
O <= "001"; 

when "101" =>
O <= "101"; 

when "110" =>
O <= "011"; 

when others =>
O <= "111";

end case;
end process;

end Behavioral;

 

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

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

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

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

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

  • 1
  • 0
  • z

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

در مثال ما چون ورودی ۳بیتی است، پس ۷۲۹حالت متفاوت می‌تواند وجود داشته‌باشد، از بین تمامی این حالات ۲۷حالت قابلیت پیاده‌سازی را دارند. اکنون اگر حالت‌هایی که حداقل یکی‌از بیت‌ها شامل z می‌شود را درنظرنگیریم؛ جمعا ۸حالت باقی می‌ماند. ۷حالت از این ۸حالت را در شرط‌های متوالی بااستفاده‌از کلمه کلیدی 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 پیاده‌سازی شد، نیاز باشد با کلاک ۱۰۰M کار کند تا خواسته مسئله برآورده شود، یا به‌عبارتی‌دیگر محاسبات الگوریتم به‌درستی انجام‌شود. حال فرض‌کنید حداکثر کلاکی که ما مجاز هستیم به مدار اعمال کنیم(حداکثر کلاک قابل اعمال به مدار در نرم‌افزار قابل‌مشاهده است که در قسمت‌های آتی در این‌مورد صحبت‌خواهیم‌کرد) مقداری کمتر از ۱۰۰M است و اگر ما این کلاک را به مدار اعمال کنیم، محاسبات الگوریتم به‌درستی انجام نمی‌شود. یک راه‌حل این است که کد را بهینه‌تر بنویسیم تا به کلاک موردنظر برسیم، و یکی از این راه‌های بهینه‌شدن کد این است که تاجاییکه می‌توانیم به جای if، از case استفاده کنیم. پس‌از اینکه تغییرات لازم را انجام‌دادیم این احتمال وجود دارد که به کلاک موردنظر برسیم.

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

جمع‌بندی

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

توصیه‌ها

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

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

 

منبع: سیسوگ

برای این مقاله نظر بگذارید:

لطفا دیدگاه خود را بنویسید
لطفا نام خود را وارد کنید