اگر تجربه کار با اعداد fixed-point در FPGA را داشته باشید، به احتمال زیاد با این موضوع برخورد کردهاید که گاهی اوقات نیاز است که محل نقطه کسری را تغییر دهید.
اما چرا محل نقطه کسری، باید تغییر کند؟
تغییر محل نقطه کسری چه کاربردهایی دارد؟
بنا به دلایل مختلفی، ما نیاز داریم که محل نقطه کسری تغییر کند، اما اینکه چرا، چگونه و به چه روشهایی محل نقطه کسری قابل تغییر است، موضوعی است که در این مقاله میخواهیم در مورد آن صحبت کنیم.
More...
مثلا، در مقاله "چگونه یک مدل Fixed Point را کوانتیزه کنیم؟"، میخواستیم دو عدد fixed-point را با هم جمع کنیم، ولی چون نقطه کسری این دو عدد زیر همدیگر قرار نداشتند، مجبور شدیم که نقطه کسری یکی از اعداد را تغییر دهیم، تا دقیقا زیر نقطه کسری عدد دیگر قرار گیرد و بتوانیم دو عدد را با هم جمع کنیم.
مورد بالا یکی از کاربردهای تغییر نقطه کسری است، در کاربردی دیگر، بدون اینکه نیاز باشد به صورت فیزیکی کاری انجام دهید، یعنی مثلا مداری را پیادهسازی کنید، یک عملیات ریاضی انجام خواهد شد.
حتما تعجب کردهاید که چگونه بدون پیادهسازی یک مدار در FPGA، یک عملیات ریاضی انجام میشود!
برای پاسخ به این سوال، و سوالات دیگر، اجازه دهید با تعریف scaling، این مقاله را ادامه دهیم.
Scaling چیست؟
به تغییر محل نقطه کسری، scaling گفته میشود.
سیستمی که ما برای نمایش اعداد از آن استفاده میکنیم، سیستم fixed point است.
همانطور که میدانید در این سیستم نمایش، محل نقطه کسری ثابت است، اما گاهی اوقات مجبور میشویم که آن را جابجا کنیم.
اجازه دهید مثال مقاله "چگونه یک مدل Fixed Point را کوانتیزه کنیم؟" را با هم مرور کنیم:
همانطور که در تصویر بالا میبینید، وقتی S.3.17 را به S.3.13 تغییر میدهیم، در واقع محل نقطه کسری آن را تغییر میدهیم، و این تغییر نقطه کسری، یعنی scaling.
به طور کلی، scaling به دو روش واقعی و مجازی انجام میشود.
Scaling واقعی
اگر مقدار رجیستر، همزمان با تغییر محل نقطه کسری شیفت پیدا کند، به آن scaling واقعی گفته میشود.
به مثال زیر توجه کنید:
در مثال بالا، ابتدا ما یک رجیستر هفت بیتی داریم، که نقطه کسری آن در بیت سوم، از سمت راست قرار دارد. یعنی سه بیت کسری داریم.
اکنون میخواهیم این رجیستر را به نحوی Scale کنیم، که تعداد بیتهای کسری تبدیل به دو بیت شود.
به عبارتی دیگر، میخواهیم محل نقطه باینری را عوض کرده، و آن را یک واحد به سمت راست منتقل کنیم.
همانطور که در قسمت پایینِ تصویر بالا میبیند، همزمان با اینکه محل نقطه کسری را تغییر دادیم، محتوای سیگنال را نیز جابهجا کردیم.
یعنی، نقطه کسری را به اندازهی یک بیت جابهجا کردهایم؛ همزمان با تغییر نقطه کسری، محتوا را نیز به اندازه یک بیت جابهجا کردهایم.
به این مدل scaling ،scaling واقعی گفته میشود و بیشترین کاربرد را هم همین scaling واقعی دارد.
در مثالی که خروجی ضربکننده را از S.3.17 به S.3.13 تغییر دادیم، هم از همین scaling واقعی استفاده کردیم.
Scaling مجازی
اگر فقط نقطه کسری تغییر کند، به این scaling ،scaling مجازی گفته میشود.
به مثال زیر توجه کنید:
در مثال بالا، دوباره همان رجیستر هفت بیتی قبلی را داریم، نقطه کسری هم در بیت سوم، از سمت راست قرار دارد.
اکنون میخواهیم این رجیستر را به نحوی Scale کنیم، که تعداد بیتهای کسری تبدیل به دو بیت شود.
اما این بار، فقط نقطه کسری را تغییر میدهیم و بر روی محتوای رجیستر هیچ تغییری اعمال نمیکنیم.
شاید برایتان سوال پیش آمده باشد که وقتی محتوای رجیستر هیچ تغییری نمیکند، این نوع scaling، چه کاربردی میتواند داشته باشد؟
برای پاسخ به این سوال ابتدا باید با مفاهیم عملیات ذهنی و فیزیکی در scaling آشنا شویم.
بر خلاف scaling واقعی، که هم عملیات ذهنی و هم عملیات فیزیکی داشتیم، در scaling مجازی، فقط عملیات ذهنی داریم.
برای اینکه تفاوت عملیات ذهنی و فیزیکی را بهتر متوجه شویم، یک بار دیگر، کارهایی که در در scaling واقعی انجام دادیم را با هم مرور میکنیم.
در scaling واقعی، علاوه بر اینکه به صورت ذهنی نقطه کسری را تغییر میدهیم، باید یک عمل فیزیکی هم انجام دهیم.
عمل فیزیکی همان انتقال یک واحدی محتوای رجیستر، به سمت چپ بود.
اما عمل فیزیکی و عمل ذهنی یعنی چه؟
عمل فیزیکی، عملی است که در نهایت باید درون FPGA، به صورت فیزیکی تغییراتی انجام شود، اما عمل ذهنی، عملی است که درون FPGA، هیچ تغییرات فیزیکی انجام نمیشود.
در واقع عمل ذهنی، همان محاسبات و آنالیزهایی هستند که در ذهن ما انجام میگیرند و هیچگونه نمود فیزیکی درون FPGA ندارند.
اکنون که با مفاهیم عملیات ذهنی و فیزیکی در scaling آشنا شدیم، وقت آن است که به کاربرد scaling مجازی بپردازیم.
کاربرد scaling مجازی، همان کاربردی است که در ابتدای مقاله به آن اشاره کردیم و گفتیم در این کاربرد، بدون اینکه نیاز باشد به صورت فیزیکی کاری انجام دهید، یک عملیات ریاضی انجام خواهد شد.
فرض کنید در جایی از الگوریتمتان نیاز است که یک سیگنال را در عدد ۲ ضرب کنید.
یک راه این است که این سیگنال را با استفاده از یک ضربکننده در عدد ۲ ضرب کنید.
یعنی برای این عمل ضرب، به صورت فیزیکی، از یک سختافزار استفاده کردهاید.
راه دیگر استفاده از scaling مجازی است، یعنی، بدون هیچ عمل فیزیکی و با استفاده از همان محاسبات و آنالیزهای ذهنی، عمل ضربدر ۲ رخ دهد.
برای درک بیشتر موضوع، دوباره به مثال بالا توجه کنید:
در این مثال، ابتدا سه بیت کسری داریم و مقدار دهدهی رجیستر برابر با عدد ۳.۲۵ است.
در قسمت پایین تصویر، با یک واحد انتقال نقطه کسری به سمت راست (به صورت ذهنی)، عدد ۳.۲۵، ضربدر عدد ۲ شده و برابر با عدد ۶.۵ میشود.
همانطور که مشهود است، جابهجایی این نقطه کسری هیچ ربطی به سختافزار ندارد و فقط یک محاسبات ذهنی است.
فراتر از این مثال و کاربرد آن، بهتر است به عنوان یک نکته کلی بدانید که جایگاه نقطه کسری، همیشه در ذهن ما است و هیچ ارتباطی با سختافزار ندارد.
بنابراین، ما میتوانیم با تغییر نقطه کسری در ذهن خود، بعضی از عملیاتهای ریاضی را انجام دهیم.
همچنین، توجه داشته باشید که با تغییر محل نقطه کسری، فقط میتوان ضرب یا تقسیم بر عدد ۲ یا مضربهای عدد ۲ را انجام داد.
قاعده این کار اینگونه است که به ازای هر یک واحد انتقال محل نقطه کسری به سمت راست، عدد مورد نظر ضربدر عدد ۲، و به ازای هر یک واحد انتقال محل نقطه کسری به سمت چپ، عدد مورد نظر تقسیم بر عدد ۲ میشود.
امیدوارم که نکات جالب و در عین حال، کمتر شناخته شدهای که در این مقاله بیان شد، برای شما هم جذاب باشند و بتوانید در پروژه های خودتان از آنها استفاده کنید.
لطفا این مورد روبا ذکر مثال در برنامه نشان دهید