توسط احمد ثقفی 

13 اردیبهشت, 1395

آموزش زبان VHDL

در قسمت اول و قسمت دوم از برنامه آموزش زبان VHDL با مفاهیم اولیه و ساختار زبان VHDL آشنا شدید. در این دو برنامه، آموختید که هر کد VHDL از دو بخش اصلی Entity و Architecture تشکیل شده است.

More...

در بخش Entity، پورت‌های ورودی و خروجی مدار را معرفی می‌کنید و در بخش Architecture که عمده کد شما را تشکیل می‌دهد، مدار را توصیف می‌کنید.

بخش Architecture خود به دو بخش Concurrent و Sequential تقسیم می‌شود. در محیط Concurrent می‌توانید مدارت ترکیبی را طراحی کنید و در بخش Sequential می‌توانید هم مدارات ترکیبی و هم مدارات ترتیبی را طراحی کنید.

در قسمت دوم برنامه آموزش VHDL با ساختار ارجاع انتخابی برای توصیف مدارات ترکیبی در محیط Concurrent آشنا شدید.

در این قسمت، شما را با پرکاربردترین ساختار ارجاع در محیط Cocurrent که ارجاع شرطی نام دارد آشنا می‌کنم. به کمک دو مثال از مدارات ترکیبی معروف مالتی‌پلکسر و انکدر اولویت‌دار، با نحوه به‌کارگیری این ساختار بیشتر آشنا خواهید شد.

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

آموزش زبان VHDL – قسمت اول

آموزش زبان VHDL – قسمت دوم

ویدئو یا متن؟

محتوای این برنامه آموزشی، به دو صورت ویدئو و متن آماده شده است. اگر علاقمند به یادگیری این مطلب به صورت ویدئویی هستید، ویدئوی زیر را ببینید و اگر ترجیح می‌دهید آن را به صورت متن مطالعه کنید، ادامه این مطلب را بخوانید.

برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:

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

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

پیاده‌سازی مالتی‌‌پلکسر به کمک عبارت ارجاع شرطی در FPGA

احتمالاً قطعه‌ی مالتی‌‌پلکسر را از درس مدار منطقی و یا از مقاله‌‌ی قبلی به یاد دارید؛ این قطعه، یکی از قطعات پرکاربرد و معروف ترکیبی است و مطابق شکل زیر، دارا‌‌ی تعداد‌‌ی ورود‌‌ی و تعداد‌‌ی خط کنترلی است:

نمایش ​شمای کلی یک MUX چهار به یک

​شمای کلی یک ​مالتی‌پلکسر چهار به یک

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

نمایش ​جدول درستی MUX چهار به یک

اکنون ببینیم که چگونه می‌توانیم این مدار را به کمک ساختار ارجاع شرطی در زبان VHDL پیاده‌‌ساز‌‌ی کنیم.

کد VHDL پیاده‌ساز مالتی‌‌پلکسر به کمک عبارت ارجاع شرطی

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

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity MUX4to1 is

	port (
				w0			:	in		 std_logic;
				w1			:	in		 std_logic;
				w2			:	in		 std_logic;
				w3			:	in		 std_logic;
				S  		  :	in		 std_logic_vector(1 downto 0);
				F			  :	out	  std_logic
			);

end MUX4to1;

architecture Behavioral of MUX4to1 is

begin

		F		<=		w0	 when	 	 s="00" else
						    w1	 when 	 s="01" else
						    w2	 when	 	 s="10" else
						    w3;

end Behavioral; 

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

بنا‌‌بر‌‌این در این کد هم می‌‌بینید که در Entity، چهار ورود‌‌ی تک بیتی w0 تا w3، یک خروجی تک بیتی F و یک ورود‌‌ی کنترل دو بیتی به نام S وجود دار‌د.

همان‌‌طور که در مقاله‌‌ی قبل گفتیم، برای سیگنال‌‌ها و رجیسترهایی که عرض بیت بیشتر از یک داشته باشند به جا‌‌ی تایپ STD_Logic از تایپ STD_Logic_Vector استفاده می‌‌کنیم و در پرانتز بعد از عبارت STD_Logic_Vector، طول آن را مشخص می‌‌کنیم.

در این کد، چون S یک پورت دو بیتی است، آن را به کمک تایپ STD_Logic_Vector تعریف کرد‌‌ه‌ایم و در پرانتز مقابل تایپ سیگنال مشخص کرده‌ایم؛ یعنی طول این پورت‌‌ دو بیت است و با اندیس 1 و 0 ​مشخص می‌شود (خط ۱۱اُم از کد).

اکنون به این موضوع می‌پردازیم که ساختار ارجاع شرطی چگونه می‌تواند مالتی‌‌پلکسر را برای ما تعریف کند.

ساختار ارجاع شرطی را برای پیاده‌‌ساز‌‌ی مالتی‌‌پلکسر چهار به یک در نظر بگیرید (کد بالا).

تعبیر این ساختار به این صورت است:

خط اول این ساختار (خط ۲۱اُم از کد) بیانگر این است که وقتی که ورود‌‌ی کنترلی S مساوی "00" بود، ورود‌‌ی W0 به خروجی F ارجاع شود.

در غیر این صورت (else‌‌)، W1 به خروجی F ارجاع شود، وقتی که S مساوی "01" باشد (خط ۲۲اُم)‌‌.

در غیر این‌‌صورت، W2 به خروجی ارجاع شود‌‌، وقتی S مساوی "10" است و در غیر این‌‌صورت W3 به خروجی ارجاع شود (خط ۲۳اُم و ۲۴اُم).

واضح است که منظور‌‌مان از در غیر این‌‌صورت‌‌ آخر (خط ۲۳اُم)، این است که اگر ورود‌‌ی کنترلی S برابر با "11" باشد.

من شخصاً ساختار ارجاع شرطی را به ارجاع انتخابی ترجیح می‌دهم، چون ساختار واضح‌‌تر‌‌ی دارد و به دلیل خصوصیات آن، کاربرد بیشتر‌‌ی هم می‌تواند داشته باشد.

مثلاً‌‌، ما در ساختار Selected Signal Assignment، یک‌بار سیگنال شرط یا همان S را به‌‌کار می‌‌برد‌‌یم و در دفعات بعد، فقط مقدار‌‌ش را در شرط قرار می‌‌داد‌‌یم.

اما اینجا هر بار شرط را به صورت واضح می‌‌نویسیم و این موضوع برای موقعی که شما می‌خواهید کدی را دوباره بخوانید، خوانا‌‌یی بیشتر‌‌ی دارد.

اجازه دهید بحث پیاده‌‌ساز‌‌ی مدار‌‌ات ترکیبی به کمک عبارت ا​رجاع شرطی را با مثال دیگری پی بگیریم؛ تا مفهوم این عبارت و نوع استفاده و کاربرد‌‌ش بیشتر برای شما مشخص شود.

پیاده‌سازی​ انکدر به کمک عبارت ارجاع شرطی در FPGA

می‌خواهیم در این مثال، یک انکدر اولویت‌‌دار را پیاده‌‌ساز‌‌ی کنیم.

اگر از درس مدار منطقی قطعه‌ی انکدر را به یاد داشته باشید، این قطعه، یکی از بلوک‌‌ها‌‌ی پر کاربرد ترکیبی است:

نمایش ​شمای کلی یک انکدر چهار به دو

​شمای کلی یک انکدر چهار به دو

تعداد ورود‌‌ی‌‌های انکدر برابر است با، دو به توان تعداد خروجی‌‌ها:

​۲(تعداد خروجی‌ها) = تعداد ورودی‌ها

از جدول صحتی که در شکل زیر برای انکدر نوشته‌ایم، می‌‌توانیم عملکرد‌‌ش را مشخص کنیم:

جدول درستی یک انکدر چهار به دو

در عملکرد نرمال یک انکدر، در هر لحظه از زمان، یکی از ورودی‌‌ها‌‌ یک است و بقیه‌‌ی ورود‌‌ی‌‌ها صفر هستند.

برای یک انکدر چهار به دو، خروجی، یک عدد باینری بین صفر تا سه است.

با توجه به اینکه کدامیک از ورود‌‌ی‌‌ها یک باشد، خروجی خواهیم داشت؛ مثلاً اگر W0 برابر با یک باشد، خروجی "00" خواهد بود.

اگر W1 برابر یک باشد، خروجی "01" خواهد بود.

اگر W2 برابر یک باشد، خروجی "10" خواهد بود.

و نهایتاً اگر W3 برابر با یک باشد خروجی برابر با "11" است.

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

اما سوالی که پیش می‌آید این است که اگر بیش از یکی از ورودی‌‌ها‌‌ یک بود، برای خروجی انکدر چه اتفاقی می‌افتد؟

مثلاً فرض کنید که مانند شکل زیر، دو ورود‌‌ی W1 و W3 یک باشند. در این صورت خروجی چه خواهد بود‌‌؟

اگر مقدار دو ورودی از انکدر یک باشد

اگر دو ورودی انکدر، مقدار یک داشته باشند، خروجی چگونه تعیین می‌شود؟

برای حل این مشکل، مفهوم انکدر اولویت‌‌دار مطرح شده است؛ انکدر اولویت‌‌دار می‌تواند اولویت را از سمت بیت سنگین، یعنی W3 یا از سمت بیت سبک، یعنی W0 مشخص کند.

پیاده‌سازی​ انکدر اولویت‌‌دار به کمک عبارت ارجاع شرطی در FPGA

مثلاً فرض کنید که ما می‌خواهیم انکدر اولویت‌‌دار‌‌ی داشته باشیم که از سمت بیت سنگین یعنی W3 اولویت داشته باشد.

انکدر اولویت‌‌دار، بررسی ورود‌‌ی‌‌ها را از سنگین‌‌ترین بیت (W3) شروع می‌‌کند.

همان‌طور که گفته شد، در این مثال، مقدار هر دو ورود‌‌ی W1 و W3 یک است؛ ابتدا این انکدر نگاه می‌‌کند که آیا W3 برابر یک است یا نه‌‌؟ اگر یک است، خروجی را بر مبنای یک بود‌‌ن W3 مشخص می‌‌کند‌‌؛ در واقع، خروجی را برابر "11" قرار می‌دهد.

در این حالت، مقدار سایر ورود‌‌ی‌‌ها (حتی اگر یک باشند)، اهمیتی ندارد.

جدول درستی این انکدر به صورت زیر است:

جدول درستی یک انکدر چهار به دو الویت‌دار از سمت بیت سنگین

در این جدول، مثلاً برای زمانی که W3‌‌ یک است، می‌‌بینیم که ورود‌‌ی‌‌ها‌‌ی بعد‌‌ی به صورت Don't Care مشخص شده‌اند؛ یعنی اگر W3 برابر با یک بود، اهمیتی ندارد که مقادیر W0 تا W2 چه باشند؛ خروجی حتماً برابر با "11" می‌شود.

یا مثلاً اگر ردیف سوم جدول را از سمت چپ بررسی کنیم، اگر W3 برابر با صفر و W2 برابر با یک باشد، مقدار سایر بیت‌ها (W0 و W1) برای ما اهمیتی ندارد و خروجی برابر با "10" خواهد شد.

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

اکنون ببینیم که چگونه می‌‌توانیم مدار این انکدر اولویت‌‌دار را به کمک ارجاع شرطی، در ساختار Concurrent، ​در زبان VHDL پیاده‌‌ساز‌‌ی کنیم.

کد VHDL پیاده‌ساز ​انکدر اولویت‌دار (از سمت بیت سنگین)، به کمک عبارت ارجاع شرطی​

در کد زیر، مدار انکدر اولویت‌‌دار‌‌ی را که به کمک زبان VHDL پیاده‌‌ساز‌‌ی کرده‌ا‌‌یم را می‌بینید:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Encoder is

	port (
				w			:	in		std_logic_vector(3 downto 0);
				y			:	out	std_logic_vector(1 downto 0)
			);

end Encoder;

architecture Behavioral of Encoder is

begin

		y		<=		"11"	 when	 w(3) = '1' else
						"10"	 when  w(2) = '1' else
						"01"   when	 w(1) = '1' else
						"00";

end Behavioral;

در بخش Entity می‌بینید که ورودی w و خروجی y را مشخص کرده‌ا‌‌یم. با توجه به اینکه پورت ورودی w از چهار بیت تشکیل شد‌‌ه بود، از تایپ STD_Logic_Vector استفاده کرد‌‌ه‌ایم و طول آن را در پرانتز نوشته‌ایم؛ یعنی‌‌، از اندیس 3 تا اندیس 0 که برابر با چهار بیت می‌شود.

چون خروجی y نیز دو بیتی است، از تایپ STD_Logic_Vector و از اندیس 1 تا 0 استفاده کرده‌ا‌‌یم.

برای پیاده‌‌ساز‌‌ی می‌خواهیم از ساختار Conditional Signal Assignment استفاده کنیم.

در این ساختار می‌گوییم (خط ۱۷اُم از کد)، وقتی که W3 مساوی با یک بود، مقدار "11" (یعنی مقدار سه) را به خروجی y، اعمال کن. W3، سنگین‌‌ترین بیت ورود‌‌ی است.

سپس در خط ۱۸اُم از کد می‌گوییم، اگر W2 (یعنی بیت بعد‌‌ از W3)، برابر با یک بود، خروجی "10" شود.

خط ۱۹اُم بیانگر این است که اگر W1 برابر با یک بود، خروجی یک شود و در غیر این‌‌صورت‌‌، یعنی وقتی W0 برابر با یک بود، خروجی صفر شود.

حالا سوالی که پیش می‌آید این است که چرا این کد و این روش پیاده‌‌ساز‌‌ی، انکدر اولویت‌‌دار را پیاده‌‌ساز‌‌ی می‌کند؟

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

برای مثال اگر W3 برابر با یک بود، خروجی 3 می‌شود و دیگر سایر شرط‌ها بررسی نمی‌شوند و معیار تعیین خروجی، W3 است. اگر W3 یک نبود (else)، به سراغ شرط‌های دیگر می‌رود.

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

ما می‌‌توانیم این پیاده‌‌ساز‌‌ی را از سمت بیت‌‌ها‌‌ی سبک هم انجام دهیم‌‌؛ یعنی‌‌، انکدر اولویت‌‌دار از سمت بیت سبک داشته باشیم.

حتماً می‌‌توانید حدس بزنید که برای نوشتن این کد، باید جا‌‌ی اندیس‌‌ها را بر عکس کنیم.

کد VHDL پیاده‌ساز ​انکدر اولویت‌دار (از سمت بیت سبک)، به کمک عبارت ارجاع شرطی

کد VHDL زیر، انکدر اولویت‌‌دار از سمت بیت سبک را پیاده‌سازی می‌کند:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Encoder is

	port (
				w			:	in		std_logic_vector(3 downto 0);
				y			:	out	std_logic_vector(1 downto 0)
			);

end Encoder;

architecture Behavioral of Encoder is

begin

		y		<=		"00" 	 when	 w(0) = '1' else
						"01"   when	 w(1) = '1' else
						"10"	 when  w(2) = '1' else
						"11";

end Behavioral;

در کد بالا، اگر W0 برابر با یک باشد، دیگر ورود‌‌ی‌‌ها‌‌ی بعد‌‌ی بررسی نمی‌‌شو‌‌ند؛ پس، ما انکدر اولویت‌‌دار از سمت بیت سبک داریم.

امیدوارم​ از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژه‌‌هایتان استفاده کنید.

آیا قسمت سوم برنامه ویدئویی آموزش زبان VHDL برای شما مفید بود؟

لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمه‌های اشتراک گذاری ابتدای این مطلب و به اشتراک‌گذاری آن در شبکه‌های اجتماعی می‌توانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.

کانال تلگرام آموزش FPGA از صفر

برای عضویت در کانال تلگرام و دسترسی به آموزش‌های بیشتر و اطلاع سریع از زمان انتشار آموزش‌ها و تخفیف‌های ویژه، روی دکمه زیر کلیک کنید:

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

احمد ثقفی

شاید به این موضوعات نیز علاقه داشته باشید:

  • باسلام وعرض ادب و سپاس از محبت شما استا د عزیزم لطفا دانلود نرم افزار رو یاد بدید چون سایتی رو که معرفی کردید هر کاری میکنم نمیتونم دانلود کنم نرم افزار رو اگه بشه تصویری سپاس گذارم

    • سلام، ممنون از شما.

      اگر وارد سایتی که لینکش رو معرفی کرده بودم بشوید، در بخشی با عنوان “لینک‌های دانلود” کل نرم‌افزار ISE رو به ۱۴ تکه تقسیم کرده که شما باید همه را یکی یکی دانلود کنید و در یک فولدر قرار بدید.

      این فایل‌ها به صورت فشرده هستند که باید باز بشن. هنگام باز کردن فایل‌ها از شما پسوردی می‌خواهد که زیر همان بخش “لینک‌های دانلود” مشخص شده است.

      موفق باشید.

  • با سلام و خسته نباشین خدمت استاد ثقفی
    ببخشین میخواستم بدونم برای آموزش زبان vhdl برای کسی ک تازه شروع ب یاد گیری کرده ی کتاب ب زبان ساده و گویا ک به فارسی باشه
    میشه معرفی کنین؟
    خیلی ممنون

  • با عرض سلام و خسته نباشید
    بیان بسیار خوب و گویایی دارید
    من ویدئوی fpga چیست رو دیدم و وقتی به خودم اومدم دیدم همه ی ویدئو های بعدی شمارو هم دیدم
    خدا قوت
    فقط آموزش زبان vhdl فقط تا قسمت ٣ هستش؟:(

  • {"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

    ۷ تکنیک پیشرفته کدنویسی برای FPGA

    >