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

22 تیر, 1395

پیاده‌سازی عملی

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

More...

به طور خلاصه، برای پیاده‌سازی یک مدار به کمک FPGA باید مراحل زیر را به کمک نرم‌افزار پیاده‌سازی انجام دهید. در مثال این برنامه، از نرم‌افزار ISE که محصول شرکت Xilinx است استفاده کرده‌ام.

  • ورود طرح
  • شبیه‌سازی
  • سنتز
  • جانمایی
  • مسیریابی
  • ساخت فایل پیکره‌بندی
  • پیکره‌بندی یا پروگرام کردن FPGA

برای آشنایی با نرم‌افزار ISE این برنامه ویدئویی را ببینید…


برای پیاده‌سازی عملی، به جز فایل مربوط به کد توصیف سخت‌افزاری، به فایل دیگری به نام فایل قیود کاربر یا User Constraints File که به اختصار به آن فایل UCF می‌گوییم نیاز دارید.

برای آشنایی با فایل UCF، این برنامه ویدئویی را ببینید…


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

در برنامه ویدئویی بعدی که منتشر خواهم کرد، تمام این مراحل را به کمک یک برد آموزشی و به صورت عملی به شما نشان خواهم داد.

ویدئو یا متن؟

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

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

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

بنابراین، می‌توان گفت اکنون آمادگی ورود به مرحله‌ی نهایی کار (پیاده‌‌سازی عملی روی FPGA) را دارید. در این مقاله، قصد دارم یک‌بار دیگر، موارد مربوط به پیاده‌‌سازی را برای شما مرورکنم. پس از آن، یک تمرین، برای کار‌های عملی که قرار است با هم انجام دهیم، معرفی می‌کنم و مراحل کار را تا قبل از پیاده‌‌سازی روی بُرد، با هم مرور می‌کنیم.

در مقاله‌ی بعدی که منتشر خواهم کرد، این پروژه را به صورت عملی روی یک بُرد آموزشی پیاده‌‌سازی خواهیم کرد. شما می‌‌توانید در آن مقاله، مراحل کار را روی بُرد و به صورت کاملاً عملی ملاحظه کنید.

مروری بر روند طراحی دیجیتال با FPGA

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

اولین مرحله‌ی پیاده‌‌سازی و طراحی دیجیتال با FPGA، ورود طرح است؛ یعنی شما به کمک یک زبان توصیف سخت‌افزاری مانند VHDL یا Verilog، طرح‌تان را وارد می‌‌کنید؛ که در این مرحله، می‌‌توانید از یک ویرایشگر متن استفاده کنید. اگر از نرم‌افزار ISE استفاده می‌کنید، این نرم‌افزار، یک ویرایشگر متنی دارد که شما می‌‌توانید طرح‌تان را در آن وارد کنید.

مرحله‌ی دوم، شبیه‌‌سازی طرح است؛ معمولاً پس از ورود طرح، شبیه‌‌سازی Functional یا Behavioral را انجام می‌‌دهید، تا مطمئن شوید که طرح‌تان از لحاظ منطقی درست است و مشکلی ندارد.

مرحله سوم، مرحله‌ی سنتز است.

همان‌‌طور که در یکی از مقاله‌های قبلی گفتم، سنتز به این معناست که طرحی که به کمک زبان توصیف سخت‌افزاری پیاده‌‌سازی کرده‌اید، به کمک منابع دیجیتالی موجود در FPGA، پیاده‌‌سازی می‌شود؛ بنابراین، در این مرحله، حتماً باید برای نرم‌افزار سنتز -که در مورد مثال ما همان نرم‌افزار ISE است- مشخص کنید که شما قرار است طرح‌تان را روی چه FPGA‌ای پیاده‌سازی کنید.

نرم‌افزار ISE، اطلاعات مربوط به منابع دیجیتالی تمام FPGA‌های شرکت XILINX را در خود دارد. مثلاً، وقتی شما به این نرم‌افزار بگویید که می‌‌خواهید طرح‌تان را روی FPGA SPARTAN 6 LX9 پیاده‌‌سازی کنید، نرم‌افزار از منابع دیجیتالی موجود در این FPGA کاملاً مطلع است و طرحی که شما به کمک زبان توصیف سخت‌افزاری توصیف کرده‌اید را بررسی می‌کند و پس از آن، به کمک منابع دیجیتالی موجود در تراشه‌ی FPGA انتخابی شما، طرح را پیاده‌‌سازی می‌‌کند.

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

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

مرحلهی بعدی، ایجاد فایل پیکره‌‌بندی یا فایل Configuration است که در اصطلاح به آن بیت-فایل نیز می‌‌گوییم.

پسوند این فایل bit. است. در فایل پیکره‌‌بندی، نتایج تمام مراحل سنتز، جانمایی و مسیریابی وجود دارد. بعداً، این بیت-فایل به FPGA منتقل می‌شود تا درون تراشه‌ی FPGA شما، تبدیل به سخت‌افزاری شود که آن را در مرحله‌ی اول، به کمک زبان توصیف سخت‌افزاری طراحی کرده بودید.

در مرحله‌ی آخر، که مرحله‌ی پیکره‌‌بندی FPGA است، شما به وسیله‌ی یک پروگرامر، بیت-فایلی که در مرحله‌ی ششم تولید کرده بودید را، وارد FPGA می‌‌کنید تا FPGA، تبدیل به مدار مورد نظر شما شود.

بررسی یک تمرین عملی

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

در این تمرین ساده، می‌‌خواهیم اعداد باینری چهار رقمی را به کمک چهار LED روی بُرد، شمارش کنیم. قرار است این اعداد یکی پس از دیگری اضافه شوند و روی LED‌ها نمایش داده شوند.

برای اینکه چشم ما بتواند این شمارش را ببیند، باید بین هر دو شماره، تاخیری را در نظر گرفت.

مثلاً تاخیر ۵۰۰ میلی‌‌ثانیه، که معمولاً برای فاصله‌‌ی بین شمارش‌ها در نظر می‌‌گیریم، تاخیر مناسبی است و چشم به راحتی می‌‌تواند شماره‌های متوالی را از هم تشخیص دهد.

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

در زیر، کدی که برای این پروژه نوشته‌ام را می‌بینید:

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

entity Farad1_Top is
		Port ( 
				Clock 				:	in		std_logic;
				LED 					: out 	unsigned (03 downto 0);
				Push_Button		: in		std_logic				
			);
end Farad1_Top;

architecture Behavioral of Farad1_Top is

	signal	Push_Button_Int		:	std_logic								:=	'0';
	signal	Push_Button_Prev	:	std_logic								:=	'0';
	signal	LED_Int						:	unsigned	(3 downto 0)	:=	(others=>'0');
	signal	Count_Direction		:	std_logic								:=	'0';
	signal	Delay_Counter			:	unsigned	(24 downto 0)	:=	(others=>'0');
	
begin

	LED									<=	LED_Int;
	
	process(Clock)
	begin
	
		if rising_edge(Clock) then
			
			Push_Button_Int			<=	Push_Button;
			Push_Button_Prev		<=	Push_Button_Int;
			Delay_Counter				<=	Delay_Counter + 1;
			
			if (Delay_Counter = to_unsigned(25000000,25)) then

				LED_Int					<=	LED_Int + 1;
				Delay_Counter	  <= (others=>'0');
				
				if (Count_Direction = '1') then	
					LED_Int				<=	LED_Int - 1;		
				end if;

			end if;
							
			if (Push_Button_Int = '0' and Push_Button_Prev = '1') then
				Count_Direction		<=	not Count_Direction;
			end if;

		end if;
	
	end process;

end Behavioral;

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

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

همان‌‌طور که می‌‌بینید، در Entity این کد، ورودی کلاک و ورودی Push Button -که همان دکمه‌ی روی بُرد است- را داریم. همچنین، یک خروجی چهار بیتی به نام LED داریم که همان چهار LED‌ای است که قرار است، شمارش را روی آن‌ها نشان دهیم.

مراحل پیاده‌‌سازی کد

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

مرحله‌ی اول؛ نوشتن کد

مرحله‌ی اول، نوشتن این کد بوده که مطابق شکل زیر، من قبلاً آن را در محیط ویرایشگر ISE نوشته‌ام.

نمایش کد در ویرایشگر نرم‌افزار ISE

نمایش کد در ویرایشگر نرم‌افزار ISE

همان‌‌طور که در مقاله‌ی قبل گفتم، در کنار این کد VHDL، فایل دیگر‌‌ی به نام فایل ucf باید وجود داشته باشد که در آن مشخص می‌‌کنیم، پورت‌هایی را که در Entity مدارمان تعریف کرده‌ایم، به کدام یک از پین‌های FPGA متصل شوند.

محتویات فایل ucf این کد را در زیر می‌بینیم:

NET	"Clock" 						LOC = p85;
NET	"Push_Button"				LOC = p87;
NET	"LED[0]" 					LOC = p105;
NET	"LED[1]" 					LOC = p104;
NET	"LED[2]" 					LOC = p102;
NET	"LED[3]" 					LOC = p101;

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

مثلاً در بُردی که من استفاده می‌‌کنم، اسیلاتور روی بُرد، به پین شماره‌ی ۸۵ متصل شده است.

بنابراین، من در خط اول، پورت کلاک را به پین شماره‌ی ۸۵ وصل می‌‌کنم و باید به همین ترتیب، دکمه و LED‌ها را به پین‌هایی که روی FPGA قرار دارند، متصل کنیم.

مرحله‌ی دوم؛ سنتز، جانمایی و مسیریابی

مطابق شکل زیر، در مرحله‌ی بعد، کد را سنتز می‌کنیم و سپس مراحل place و route را انجام می‌دهیم.

و در نهایت، بیت-فایل را ایجاد می‌کنیم.

سنتز، جانمایی و مسیریابی

سنتز، جانمایی و مسیریابی

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

انجام مراحل سنتز، جانمایی، مسیریابی و ساخت بیت-فایل در نرم‌افزار ISE

انجام مراحل سنتز، جانمایی، مسیریابی و ساخت بیت-فایل در نرم‌افزار ISE

با توجه به اینکه کد کوچکی داشتیم، این مراحل به سرعت انجام می‌گیرد.

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

فایل بیتی ساخته شده در فولدر پروژه‌‌ ذخیره می‌شود.

مرحله‌ی سوم؛ پروگرام کردن FPGA

برای پروگرام کردن FPGA، باید از نرم‌افزار مخصوص پروگرامر مجموعه‌ی ISE استفاده کنیم؛ نام این نرم‌افزار iMPAC است.

برای اجرای این نرم‌افزار، دو را وجود دارد؛ می‌‌توانید مستقیماً از منوی start، بخش مجموعه نرم‌افزار ISE این کار را انجام دهید. همچنین می‌توانید آن را از دل نرم‌افزار ISE اجرا کنید.

مطابق شکل زیر، روی علامت مثبت کنار گزینه‌ی Configure Target Device کلیک کنید تا باز شود. سپس، گزینه‌ی Manage Configuration Project را انتخاب کنید.

اجرای نرم‌افزار iMPAC از دل نرم‌افزار ISE

اجرای نرم‌افزار iMPAC از دل نرم‌افزار ISE

در این مرحله، شما باید بُردتان را روشن کرده و از طریق پروگرامر به کامپیوترتان متصل کرده باشید.

سپس، مطابق شکل زیر، روی گزینه‌ی Boundary Scan کلیک کنید.

انتخاب گزینه‌ی Boundary Scan در نرم‌افزار iMPAC

انتخاب گزینه‌ی Boundary Scan در نرم‌افزار iMPAC

پس از آن، دکمه‌ی Initialize Chain را فشار دهید تا نرم‌افزار از طریق پروگرامر، با بُرد ارتباط برقرار کند.

برقراری ارتباط نرم‌افزار با بُرد از طریق پروگرامر On-Board

برقراری ارتباط نرم‌افزار با بُرد از طریق پروگرامر On-Board

همان‌طور که می‌بینید، نرم‌افزار، FPGA روی بُرد را می‌شناسد.

شناخت FPGA توسط نرم‌افزار iMPAC

شناخت FPGA توسط نرم‌افزار iMPAC

روی بُرد ما، تراشه‌ی FPGA SPARTAN6 از نوع LX9 وجود دارد.

با چند بار فشار دادن دکمه‌ی ESC روی Keyboard کامپیوتر، از پیام‌هایی که ظاهر می‌شوند عبور کنید.

حالا باید آن بیت-فایلی که ساخته بودید را از  فولدر پروژه انتخاب کرده و به این FPGA، اِعمال کنید. سپس، FPGA را پروگرام کنید.

برای این کار، مطابق شکل زیر، روی FPGA کلیک راست کنید و گزینه‌ی Assign New Configuration File را انتخاب کنید.

نحوه‌ی اعمال بیت-فایل به FPGA

نحوه‌ی اعمال بیت-فایل به FPGA

پس از آن، فولدر پروژه‌‌ای که در آن بیت-فایل را درست کرده‌اید، باز کنید و بیت-فایل را انتخاب کنید.

انتخاب بیت-فایل برای پروگرام کردن FPGA

انتخاب بیت-فایل برای پروگرام کردن FPGA

اکنون دوباره چند بار دکمه‌ی ESC روی صفحه کلید کامپیوتر را، فشار دهید تا از پیام‌های ظاهر شده عبور کنید.

حالا همان‌طور که می‌‌بینید، بیت فایل به این FPGA اِعمال شده و نام بیت-فایل در پایین تراشه نوشته شده است.

اعمال بیت-فایل به FPGA توسط نرم‌افزار iMPAC

اعمال بیت-فایل به FPGA توسط نرم‌افزار iMPAC

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

نحوه‌ی پروگرام کردن FPGA

نحوه‌ی پروگرام کردن FPGA

این‌ها مراحلی بود که باید برای پیاده‌‌سازی روی بُرد انجام می‌‌دادید.

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

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

آیا برنامه ویدئویی یک قدم مانده به پیاده‌سازی عملی برای شما مفید بود؟

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

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

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

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

احمد ثقفی

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

  • بسیار گویا و روان بود سپاس استاد …
    امیدوارم بتوانیم پیاده سازی مدارات سنگین و پردازشی رو پابه پای شما یاد بگیریم …
    پیشنهاد : اگر ممکن است یک بخشی از ویدیوی هر هفته را هم به معرفی منابع مختلف آموزشی زبان اصلی و نحوه استفاده از آن ها اختصاص بدهید تا کسانی که تشنه FPGA هستند بتوانند راهشان را پیدا کنند از بین این منابع اطلاعاتی …

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

      همانطور که حتما می‌دانید، در کانال بخشی به اسم معرفی کتاب داریم که در آن ضمن معرفی و توضیح در مورد منابع خوب FPGA، فایل کتاب رو هم قرار میدیم.

      در عین حال، سایت Xilinx به عنوان مهمترین تولید کننده FPGA هم منابع بسیار عالی برای یادگیری دارد که می‌توانید از آنها استفاده کنید.

      معمولا در مقالات و پست‌هایی که در سایت قرار می‌دهم، به این مطالب هم ارجاع می‌دهم.

      موفق باشید.

  • سلام باتشکر
    برای قابل لمس بودن FPGA در یک رمینه (برای مثال کنترل دما یک دستگاه) طراحی لازم انجام و نمایش داده و بر روی برد اجرار شود این کار باعث می شود تا نظر بیننده نسبت طراحی دیجیتال روشن تر بشه
    وبهتر تصمیم بگیرد وقابل فهم باشد تشکر

  • ا سلام
    ابتدا میخواستم از آموزش های خیلی خوبتون تشکر کنم
    من به خاطر برنامه نویسی fpga با سایت شما آشنا شدم و خیلی از اطلاعات این سایت استفاده کردم بسیار مفید و کاربردی بود

    در ادامه سوالی داشتم
    میخواستم از fpga به عنوان simulator در یک پروزه بزرگتر استفاده کنم تا سیگنال های مانند سیگنال پالس خروجی سنسور سرعت سنج رو شبیه سازی کنم.
    از اونجایی که میخوام خروجی این سیگنال رو به ecu ماشین وصل کنم نیاز دارم تا خروجی قابلیت ساپورت CAN را داشته باشد

    من برنامه اون رو تو نرم افزار ISE نوشتم اما نمیدونم چه بردی باید انتخاب کنم
    تو انتخاب برد مشکل دارم

    ممنون میشم راهنمایی ام کنید

    • سلام،

      ممنون از نظر مثبت شما.

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

      موفق باشید.

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

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

    >