در این برنامه کوتاه اما کامل ویدئویی، نحوه پیادهسازی اعداد مختلط در 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 نشان دهیم چه راهحلی داریم؟
سادهسازی ضرب دو عدد مختلط روی کاغذ
ابتدا اجازه دهید، ضرب این دو عدد را روی کاغذ انجام دهیم و آن را ساده کنیم؛ برای حاصلضرب X و Y رابطهی زیر را خواهیم داشت:
پس، خروجی F، از یک بخش حقیقی Fr و یک بخش موهومی Fi تشکیل شده است.
بنابراین، با محاسبهی سادهای که روی کاغذ انجام دادیم، تکلیف ما برای پیادهسازی مشخص شد؛ بدین ترتیب که با داشتن بخشهای حقیقی (fr) و موهومی (fi) از سیگنال F، حاصلضرب X و Y را خواهیم داشت. حالا کافی است تا دو عبارت fr و fi را در FPGA و به کمک کد VHDL پیادهسازی کنیم.
پیادهسازی ضرب دو عدد مختلط در 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 وارد میشود با اتصال آن به پایهای از FPGA و انجام pin assignment در فایل ucf میتوانیم روی ولتاژ مذکور اعمال مورد نظرمان را انجام دهیم. ولی وقتی متغیری مثل ولتاژی سینوسی را که میخواهیم از آن تعبیر فازوری و در نتیجه نمایشی مختلط داشته باشیم، به پایهای از FPGA میکنیم، چطور این دو سیگنال را که مربوط به بخش حقیقی و موهومی است، از هم جدا میکنیم؟
در دیجیتال و کلا به طور فیزیکی چیزی به اسم عدد مختلط وجود ندارد. اینها فقط تعابیر ذهنی و ریاضی هستند. شما به عنوان پیادهسازی الگوریتم، این تعابیر را به نحوی در واقعیت ایجاد میکنید. مثلا در مورد تبدیل سینوس به سیگنال فازوری و نهایتا نمایش مختلط، ممکن است که یک راه این باشد که مداری طراحی کنید که فاز و دامنه لحظهای سیگنال دریافتی را استخراج کند و سپس شما آن مقادیر را به عنوان مقادیر حقیقی و موهومی تعبیر کنید و در محاسبات بعدی به کار ببرید.
موفق باشید.
خیلی ممنون مهندس ثقفی عزیز.بی نظیر بود.یک سوال دارم اگر بخواهیم اختلاف فاز این دو عدد مختلط را به کمک جدول look up حساب کنیم، چطوری نوشته میشه کدش؟