آموزش FPGA : قسمت یازدهم

آموزش FPGA : قسمت یازدهم

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

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

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

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

حال می‌خواهیم عملکرد جدول بالا را با استفاده از ساختار شرطی 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، عبارت 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 را به طور کامل بررسی کردیم و در نهایت مقایسه‌ای تخصصی بین هر دو ساختار انجام دادیم و توصیه‌هایی را برای هرچه بهتر شدن کد و حرفه‌ای شدن شما بیان کردیم. در قسمت دوازدهم مقدماتی از کلاک بیان خواهیم کرد و عناصر پایه‌ای مانند لچ و فلیپ‌فلاپ را توصیف خواهیم کرد، همچنین از قسمت بعد کدنویسی اصولی را شروع خواهیم کرد.

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

نویسنده و طراح الکترونیکا هستم . سوالی داشتید در کامنت ها یا پیج های اینستاگرام و تلگرام سایت بپرسید .