پیاده‌سازی اعداد مختلط در FPGA

پیاده‌سازی اعداد مختلط در FPGA

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

More...

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

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

برای آشنایی با زبان VHDL این برنامه ویدئویی را ببینید…

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

برای آشنایی با روش‌های افزایش سرعت مدارات دیجیتال، این برنامه ویدئویی را ببینید…

ویدئو یا متن؟

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

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

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

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

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

اعداد مختلط

همان‌‌طور که می‌‌دانیم، هر عدد مختلط شامل دو بخش حقیقی (Real) و موهومی (Imaginary) است. به عنوان مثال، عدد مختلط X، به ‌صورت زیر نمایش داده می‌‌شود:

X = xr + j xi

که در آن،​ xr، بخش حقیقی و xi، بخش موهومی ​X است.

کلیات ضرب دو عدد مختلط در FPGA

اکنون فرض کنید که می‌‌خواهیم ضرب دو عدد مختلط X و Y را در FPGA پیاده‌‌سازی کنیم. پس، همانند شکل زیر، دو ورودی X و Y، و یک خروجی F خواهیم داشت:

نمایش بلوک دیاگرام حاصل‌‌ضرب دو عدد در FPGA

​بلوک دیاگرام حاصل‌‌ضرب دو عدد در FPGA

اما برای اینکه پورت­‌های مختلط ورودی و خروجی را در FPGA نشان دهیم چه راه‌­حلی داریم؟

ساده‌سازی ضرب دو عدد مختلط روی کاغذ

ابتدا اجازه دهید، ضرب این دو عدد را روی کاغذ انجام دهیم و آن را ساده کنیم؛ برای حاصل‌ضرب X و Y رابطه‌ی زیر را خواهیم داشت:

پس، خروجی F، ​از یک بخش حقیقی Fr و یک بخش موهومی Fi تشکیل شده است.

بنابراین، با​ محاسبه‌­ی ساده‌­ای که روی کاغذ انجام دادیم، تکلیف ما برای پیاده­‌سازی مشخص شد؛ بدین ترتیب که با داشتن بخش‌‌های حقیقی (​fr) و موهومی (fi) از سیگنال F، حاصل‌ضرب X و Y را خواهیم داشت. حالا کافی است تا​ دو عبارت fr و fi را در FPGA و به کمک کد VHDL پیاده‌‌سازی کنیم.

پیاده‌سازی ضرب دو عدد مختلط در FPGA

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

نمایش ​بلوک دیاگرام حاصل‌‌ضرب دو عدد مختلط در FPGA

​بلوک دیاگرام حاصل‌‌ضرب دو عدد مختلط در FPGA

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

با توجه به رابطه‌ای که روی کاغذ به دست آوردیم، بخش‌های حقیقی و موهومی خروجی به صورت زیر هستند:

​fr = xr yr – xi yi

​fi = xr yi + xi yr

بنابراین، برای پیاده‌سازی این ضرب در FPGA، باید به کمک​ روابط بالا و به زبان VHDL، هر کدام از پورت‌های خروجی را، بر حسب پورت‌­های ورودی بنویسیم.

در زیر، کد VHDL‌ای که این ضرب­‌کننده را پیاده­‌سازی می­‌کند می‌بینید:

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

entity Multiplier_Top is
    Port ( 
			  Clock 	: in   STD_LOGIC;
           X_Real : in   signed (7 downto 0);
           X_Imag : in   signed (7 downto 0);
           Y_Real : in   signed (7 downto 0);
           Y_Imag : in   signed (7 downto 0);
           F_Real : out  signed (15 downto 0);
           F_Imag : out  signed (15 downto 0)
			  );
end Multiplier_Top;

architecture Behavioral of Multiplier_Top is

	signal X_Real_Int		signed (7 downto 0)	:=(others=>'0');
	signal X_Imag_Int		signed (7 downto 0)	:=(others=>'0');
	signal Y_Real_Int		signed (7 downto 0)	:=(others=>'0');
	signal Y_Imag_Int		signed (7 downto 0)	:=(others=>'0');
	signal F_Real_Int		signed (15 downto 0)	:=(others=>'0');
	signal F_Imag_Int		signed (15 downto 0)	:=(others=>'0');

begin
	F_Real		<= F_Real_Int;
	F_Imag		<= F_Imag_Int;
	
		if rising_edge(Clock) then
		
			X_Real_Int	<= X_Real;
			X_Imag_Int	<= X_Imag;
			Y_Real_Int	<= Y_Real;
			Y_Imag_Int	<= Y_Imag;
			
			F_Real_Int	<= X_Real_Int * Y_Real_Int - X_Imag_Int * Y_Imag_Int;
			F_Imag_Int	<= X_Real_Int * Y_Imag_Int + X_Imag_Int * Y_Real_Int;
			
		end if;
	
	end process;

end Behavioral;

تحلیل کد پیاده‌سازی ضرب دو عدد مختلط در FPGA

اکنون این کد را با هم بررسی می‌کنیم تا این موضوع بهتر روشن شود.

هدف این است که دو عدد مختلط X  و Y را در هم ضرب کنیم و حاصل را در خروجی مختلط F  قرار دهیم.

با توجه به اینکه این اعداد، مختلط هستند، به ازای هرکدام، دو پورت تعریف می‌کنیم؛ یک پورت، بخش Real و پورت دیگر، بخش Imaginary سیگنال را در خود قرار می‌‌دهد (خط هشتم تا ۱۳اُم).

همان‌‌طور که در خط‌های هشتم و نهم کد می‌‌بینید، برای X، دو پورت Xr و Xi را تعریف کرده‌ایم. این پورت‌ها را به صورت ورودی و از نوع علامت‌‌دار تعریف کرده‌ایم. در این مثال، پورت‌های ورودی را هشت بیتی در نظر گرفته‌ام که شما می‌‌توانید عرض بیت پورت‌ها را بر مبنای کاربرد‌تان تغییر دهید. برای پورت ورودی Y نیز به همین ترتیب عمل می‌کنیم (خط ۱۰ و ۱۱).

نوع خروجی F را نیز به صورت Signed (علامت‌دار) در نظر گرفته‌ایم (خط ۱۲ و ۱۳). عرض بیت خروجی، ۱۶ بیت در نظر گرفته شده است؛ چون در خروجی، ضرب ورودی‌‌ها را داریم و وقتی دو عدد هشت بیتی را در هم ضرب می‌کنیم، حاصل، ۱۶ بیتی خواهد بود.

سپس، ​بر اساس​ الگوی استاندار کدنویسی، به ازای هر پورت ورودی و خروجی، یک سیگنال داخلی تعریف می‌‌کنیم؛ اصطلاحاً تمامی پورت‌‌ها را بافر می‌‌کنیم (خط ۱۹ تا ۲۴). سپس در محل‌‌های مناسب، پورت‌‌ها را به سیگنال‌‌های داخلی متناظرشان ارجاع می‌‌دهیم.

پس‌ از آن، همان‌طور که در خط‌های ۳۷اُم و ۳۸اُم از کد می‌بینید، بر اساس فرمولی که روی کاغذ به دست آورده بودیم، به بخش‌های Real و Imaginary خروجی F، عبارت‌های متناظر​ را اعمال می‌‌کنیم. بدین ترتیب،  موفق به پیاده‌سازی ضرب مختلط این دو عدد در FPGA می‌‌شویم.

F_Real_Int	<= X_Real_Int * Y_Real_Int - X_Imag_Int * Y_Imag_Int;
F_Imag_Int	<= X_Real_Int * Y_Imag_Int + X_Imag_Int * Y_Real_Int;

اگر پس از پیاده‌‌سازی این مدار، فرکانس مدار، از آنچه دلخواه شماست کمتر شد، می‌‌توانید با پیاده کردن تکنیک پایپ لاین، روی دو خط ​۳۷اُم و ۳۸اُم از کد، سرعت مدار را افزایش دهید.

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

آیا برنامه ویدئویی پیاده‌سازی اعداد مختلط در FPGA برای شما مفید بود؟

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

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

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

  • علی گفت:

    سلام
    من fpga کار نمیکنم اما این ویدئو رو دیدم و از نحوه اموزش روان شما بسیار لذت بردم امید که جسارت شروع تحصیل این مدل رو به دست بیارم و از تجربیات ارزشمند شما استفاده بیشتر کنم .با آرزوی درخشش بیشتر شما موفق باشید .

  • پ م گفت:

    با سلام و خسته نباشید واقعا زیبا و کامل بود آموزشتون عالی بود
    با سپاس فراوان