ساختار شرطی if
در قسمت هشتم از مجموعه آموزشی FPGA با مدارات ترتیبی در محیط Sequential آشناشدیم. عناصر پایه سازنده مدارات ترتیبی را شناختیم و بهطورمفصل بررسیکردیم که در محیط ترتیبی، ارجاعات چگونه انجام میگیرند.
در این قسمت با ساختارشرطیif در محیط ترتیبی آشنا خواهیم شد، و به دو روش مختلف یک مالتیپلکسر 2 به 1 را توصیف خواهیم کرد. در همین حین نکات زیادی را در رابطه با محیط ترتیبی و نحوه کدنویسی فرا خواهیم گرفت.
توجه داشته باشید که مالتیپلکسر ذاتا یک مدار ترکیبی است، و شاید با خودتان بگویید چرا مداری که ذاتا ترکیبی است را در محیط ترتیبی توصیف میکنیم؟ بله، اصولا نباید مداری که ذاتا ترکیبی است را در محیط ترتیبی توصیف کرد، ولی ما برای آشنایی هرچه بیشتر با محیط ترتیبی، در ابتدا بعضیاز مدارات ترکیبی که قبلا توصیفکردهبودیم را در این محیط توصیف میکنیم. اما درنهایت کاری که ما خواهیمکرد، هر مداری را در جای خود توصیفکرده و تا حدامکان به پیشنهاد شرکت زایلینکس، تمامی مدارات را از نوع ترتیبی سنکرون طراحی میکنیم.
در قسمت هفتم تعریفی از مالتیپلکسر ارائه دادیم و شما بهخوبی با عملکرد و ساختار این مدار آشنا هستید. اگر بهخاطر داشتهباشید در آنجا، مالتیپلکسر را بااستفادهاز ساختار ارجاع انتخابی در محیط ترکیبی، توصیفکردیم. اما در این قسمت میخواهیم همان عملکرد را بااستفادهاز ساختارشرطی if توصیفکنیم. ساختارشرطی if، پرکاربردترین و قابلانعطافترین ساختارشرطی زبان VHDL میباشد. در قسمتهای آتی با توجه به نحوه پیادهسازی ساختارهای شرطی درون FPGA و همچنین مقایسهای که برای این ساختارها ارائه خواهیمداد، شما متوجهخواهیدشد که چرا ساختارشرطی if، پرکاربردترین و قابلانعطافترین ساختارشرطی میباشد.
قبلا، در قسمت ششم گفتیم که در ساختار ارجاع شرطی در محیط Concurrent، شرطها بهصورت ذاتی و از لحاظ ساختاری، اولویتدار هستند. ساختار if نیز از همین قاعده پیروی میکند و شرطها دارای اولویت هستند، بدینصورت که شرطها بهترتیب قرار گرفتن در این ساختار موردبررسی قرار میگیرند و اگر یکیاز شرطها برقرار شد، از شرطهای دیگر صرفنظر میشود و این شرطها موردبررسی قرار نمیگیرند.
به توصیف مالتیپلکسر۲ به ۱ بااستفادهاز ساختارشرطی if در کد توجهکنید:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity MUX is Port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; S : in STD_LOGIC; Y : out STD_LOGIC ); end MUX; architecture Behavioral of MUX is begin process(I0,I1,S) begin if(S = '0') then Y <= I0; else Y <= I1; end if; end process; end Behavioral;
در لیست حساسیت سیگنالهای ورودی و همچنین سیگنال خط فرمان قرار میگیرند، که با تغییر هرکدام از آنها process فعال، و ارجاعات انجام میشوند. درادامه ساختارشرطی if را بهکار بردهایم، به اینصورت که هرگاه خط فرمان مقدارش ‘۰’ باشد ورودی اول به خروجی منتقل میشود در غیر اینصورت، ورودی دوم به خروجی منتقل خواهد شد.
اما روشیدیگر برای توصیف همین کد نیز وجود دارد که معمولا کدنویسان حرفهای به این سبک کد مینویسند. به کد زیر توجهکنید:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity MUX is Port ( I0 : in STD_LOGIC; I1 : in STD_LOGIC; S : in STD_LOGIC; Y : out STD_LOGIC ); end MUX; architecture Behavioral of MUX is begin process(I0,I1,S) begin Y <= I1; if(S = '0') then Y <= I0; end if; end process; end Behavioral;
قبلاز هر توضیحی، به این نکته توجهکنید که هر دو کد نوشتهشده دقیقا یک عملکرد را توصیف میکنند و درنهایت نیز هر دو کد، یک سختافزار واحد را در درون FPGA میسازند. پس تنها تفاوت این دو کد در ظاهر میباشد و هیچ تفاوت دیگری ندارند.
اگر توجهکنید در کد دوم، عبارت ارجاعی که بعد از else در کد اول آورده شد را برداشتیم و به قبلاز if انتقالدادیم، و همانطورکه گفتیم با این تغییر خطوط، عملکرد یکسان است. نحوهی کار به این صورت است که میگوییم تحت هرشرایطی I1 به Y ارجاع داده شود، مگر اینکه S برابر با ‘۰’ باشد. و این دقیقا همان عملکرد کد اول را دارد. شما به اینصورت درنظربگیرید، تازمانیکه میتوانیم کدمان را بهصورت if_then بنویسیم، هیچ لزومی ندارد که از if_then_else استفادهکنیم.
بهصورتکلی در زبان VHDL جابهجایی خطوط در محیط Sequential هیچ تاثیر و تغییری در عملکرد کد ایجاد نخواهد کرد، چون تمامی ارجاعات همزمان باهم رخ میدهند و منطقا اینکه کدام خط ارجاع را اول بنویسیم، هیچتاثیری در عملکرد نخواهد داشت.
اما حالتهایی وجود دارند که از این قاعده مستثنا هستند و تغییر یا جابهجایی خطوط باعث تغییر عملکرد خواهند شد. زمانیکه خودم درحال یادگیری FPGA بودم و هنوز کدنویسی اصولی را نمیدانستم و همچنین فرق زبان برنامهنویسی با زبان توصیف سختافزار را بهخوبی تشخیص نمیدادم به حالتهایی برخورد کردم که جابهجایی خطوط میتواند باعث تغییرعملکرد شود. در زیر به دو حالت از این حالتها اشارهخواهیمکرد:
- جابهجایی خطوطِ ساختارهای شرطی
- جابهجایی دو یا چندین خط ارجاع، وقتی که در همهی این ارجاعات سیگنالهای مختلفی به یک سیگنال واحد ارجاع داده شوند (بهعبارتیدیگر در سمتچپ همهی ارجاعات یک سیگنال واحد وجودداشتهباشد)
خب همانطورکه میدانید در ساختارهای شرطی، چون شرطها داری اولویت هستند پس جابهجایی خطوط میتواند عملکرد را تغییر بدهد. البته ما بعضیاوقات باتوجهبه همین عملکرد اولویتدار بودن شرطها، مداراتی که واقعا در ذات خود دارای اولویت هستند را بهنحو خوبی توصیف میکنیم. در دیجیتال مداراتی وجود دارند که با دریافت ورودیهای نامعتبر، عملکرد مدار صحیح نمیباشد و به احتمال زیاد در خروجی دیتای موردنظر را دریافتنکنیم، البته منطقیاست که خروجی نامعتبر و ناشناختهای دریافتکنیم چون ورودی پیشبینی نشدهای به مدار اعمال کردیم. همهی این کارها نیز با زبان VHDL قابلانجام است، در قسمتهای بعد مثالهایی خواهیم داشت که این موضوع را بهخوبی پوشش میدهد.
ما قبلا گفتیم که جابهجایی ارجاعات در زبان VHDL تغییری در عملکرد ندارد، چون همهی ارجاعات همزمان باهم انجام میشوند. اما حالتی استثنا وجود دارد. برای درک بیشتر موضوع ابتدا به کد زیر توجهکنید:
A <= B; A <= C;
فرضکنید کدبالا در محیط ترتیبی نوشتهشد، و طبق اصولی که تا الان بیانکردیم، میدانیم که هر دو ارجاع باید همزمان باهم انجامشوند. حال اگر قرار باشد هر دو ارجاع همزمان رخ بدهند، مقدار B یا C به A ارجاع داده میشود؟ چون سیگنال A در یک لحظه نمیتواند هم مقدار B و هم مقدار C را بهخود بگیرد!
این دقیقا همان حالت استثنا است و در جواب میتوان گفت که در زبان VHDL اگر دو یا چندین ارجاع مختلف به یک سیگنال داشتهباشیم (در کد بالا دو ارجاع به سیگنال A) همیشه آخرین ارجاع درنظرگرفته میشود.
اکنون کد زیر را درنظر بگیرید:
A <= C; A <= B;
اگر شما کد اول را در محیط ترتیبی بنویسید، ارجاع A <= C انجام خواهد گرفت، و اگر کد دوم را در محیط ترتیبی بنویسید، ارجاع A <= B انجام خواهد گرفت. پس نتیجه بسیارمتفاوت خواهد بود که شما وقتی به یک سیگنال واحد چندین ارجاع مختلف دارید کدام حالت را انتخابکنید.
شاید از خودتان بپرسید وقتی فقط آخرین ارجاع درنظرگرفته میشود، پس تکلیف بقیه ارجاعات چیست؟ بقیه ارجاعات قبلاز مرحله سنتز توسط نرمافزار حذف میشوند و از دید نرمافزار بیاثر هستند.
البته این توضیحات دادهشدهاست تا شما مفاهیم را بهخوبی درک کنید، وگرنه شما هم پساز مدتی کدنویسی درکخواهیدکرد که چرا چندین ارجاع مختلف در محیط ترتیبی به یک سیگنال، بدوناستفادهاز ساختارهای شرطی، با ذات سختافزار در تناقض خواهد بود.
در قسمت دهم انکودرهای اولویتدار را بااستفادهاز اولویتدار بودن شرطها، در ساختارهای شرطی توصیفخواهیمکرد.
منبع:سیسوگ