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

2 آذر, 1395

پیاده‌سازی محاسبات اعشاری در FPGA

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

More...

در برنامه ویدئویی قبلی که در سایت منتشر کردم، شما را با نحوه پیاده‌سازی محاسبات علامتدار در FPGA آشنا کردم و در مورد نمایش اعداد علامتدار به روش مکمل دو یا two’s complement به طور مفصل توضیح دادم. در آن برنامه، همچنین در مورد نحوه پیاده‌سازی محاسبات علامتدار به کمک زبان VHDL صحبت کردم و مثالی را هم در این زمینه بررسی کردم.

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

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

در این برنامه ویدئویی، ابتدا دو روش floating-point و fixed-point را به عنوان راه‌حل‌هایی برای انجام محاسبات اعشاری معرفی خواهم کرد. اما در ادامه، سیستم نمایش fixed-point را به عنوان انتخاب مناسب برای نمایش و پیاده‌سازی محاسبات اعشاری در FPGA شرح خواهم کرد.

بعد از توضیح کامل مفهوم سیستم نمایش fixed-point یک روش کارآمد برای تحلیل سیستم‌های fixed-point ارائه خواهم کرد که به کمک آن می‌توانید سیستم‌های پردازش سیگنال دیجیتال را قبل از پیاده‌سازی و روی کاغذ تحلیل کنید.

در نهایت با ارائه یک مثال در مورد جمع اعداد اعشاری با نمایش fixed-point نکات بیشتری را در این زمینه ارائه خواهم داد.

ویدئو یا متن؟

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

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

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

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

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

روش‌های نمایش اعداد اعشاری در FPGA

به طور کلی، دو روش برای نمایش اعداد اعشاری وجود دارد. روش اول، روش Floating-Point است؛ در این روش، دقت اعشاری اعداد بسیار بالا است.

روش Floating-Point استانداردهایی دارد که توسط سازمان IEEE تهیه شده است. استاندارد ۳۲ بیتی و ۶۴ بیتی می‌تواند اعداد اعشاری را با دقت بسیار بالایی نمایش دهد. اما وقتی می‌‌خواهید یک الگوریتم پردازش سیگنال را در FPGA پیاده‌‌سازی کنید، اگر روش Floating-Point را انتخاب کنید، مشکلاتی را با این نوع نمایش خواهید داشت.

اولین مسئله این است که پیاده‌‌سازی نمایش Floating-Point کمی سخت است. مسئله‌ی بعدی این است که منابع سخت‌‌افزاری زیادی را اشغال می‌‌کند و مسئله‌ی آخر این است که می‌‌تواند سرعت مدار شما، که معمولاً مهمترین معیاری است که به دنبالش هستید را کاهش دهد.

بنابراین، نمایش دیگری به نام نمایش Fixed-Point به وجود آمده است و در بیشتر پیاده‌‌سازی‌‌های الگوریتم‌‌های پردازش سیگنال از این نمایش استفاده می‌‌‌‌کنند.

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

به دلیل این دو مزیتی که روش نمایش Fixed-Point دارد، در اکثر پیاده‌‌سازی‌‌های دیجیتالی در FPGA، ما الگوریتم‌‌ها را به کمک روش Fixed-Point نشان می‌‌دهیم.

روش Fixed-Point برای نمایش اعداد اعشاری در FPGA

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

بررسی مفهوم سیستم نمایش Fixed-Point را با یک سوال شروع می‌کنم؛ به نظر شما عدد باینری نمایش داده شده در زیر، نمایش‌‌دهنده‌ی چه عددی در مبنای دسیمال است؟

یک عدد باینری

احتمالأ همه‌ی شما با توجه به جایگاه‌‌هایی که اعداد باینری دارند (مطابق شکل زیر)، مقدار این عدد را محاسبه می‌‌کنید و به عدد ۷۴ می‌رسید.

یک عدد باینری

ولی اگر من به شما بگویم که این عدد، یک عدد علامت‌‌دار با نمایش two's complement است، چگونه مقدار آن را محاسبه می‌‌کنید؟

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

با توجه به یک بودن بیت سنگین و در نتیجه منفی بودن عدد، یک روش برای محاسبه‌ی مقدار این عدد این است که مقدار two's complement آن را محاسبه کنید و سپس یک منفی در کنارش قرار دهید. بدین ترتیب، این عدد برابر با ۵۴- می‌شود.

یک عدد باینری

پس تا به اینجا، بدون ایجاد تغییر در یک عدد باینری توانستم دو مقدار را برای آن مشخص کنم. مقدار ۷۴ و مقدار ۵۴- دسیمال.

فرض کنید که یک نقطه باینری در محلی که در شکل زیر می‌‌بینید روی عدد قرار دهیم، در آن صورت، مقدار عدد در مبنای ۱۰ چقدر خواهد بود؟

یک عدد باینری

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

یک عدد اعشاری باینری

در سمت چپ نقطه‌‌ی باینری، جایگاه 1، 2، 4 و 8 را داریم و در سمت راست نقطه باینری جایگاه 0.50، 0.25 و 0.125 را داریم.

در این حالت، اگر از شما بپرسم که این عدد، نشان‌‌دهنده چه عددی در مبنای ۱۰ است، می‌‌توانیم محاسبه کنیم که بخش صحیح این عدد نشان دهنده‌ی نُه و بخش اعشار این عدد نشان‌‌دهنده‌ی 0.25 است؛ بنابراین، این عدد برابر با 9.25 است.

یک عدد اعشاری باینری

نکته‌‌‌‌ای که می‌‌خواستم با این مثال به شما نشان دهم، این است که در یک نمایش باینری، این موضوع که عدد باینری، مشخص کننده‌‌ی چه عددی در مبنای ۱۰ است، به تفسیری که از آن عدد می‌‌شود بستگی دارد.

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

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

در سیستم نمایش Floating-Point که می‌تواند به صورت ۳۲ بیتی یا ۶۴ بیتی باشد، نقطه‌ی باینری مکان مشخصی ندارد و مکان نقطه‌ی باینری با توجه به عددی که در آن رجیستر قرار دارد، مشخص می‌‌شود. اما در سیستم Fixed-Point همان‌‌طور که از نامش هم پیداست، نقطه‌ی باینری، از قبل مشخص است و دیگر تغییر نمی‌‌کند.

اما سوالی که شاید در این لحظه در ذهنتان ایجاد شده باشد، این است که آیا ما در FPGA ابزاری برای مشخص کردن نقطه باینری داریم؟

در‌واقع، ما می‌‌دانیم که در FPGA، رجیسترها را داریم و می‌‌توانیم هر عدد دلخواهی را در یک رجیستر بنویسیم؛ اما اینکه نقطه‌ی باینری این رجیستر کجاست، چطور مشخص می‌‌شود؟

آیا یک ابزار یا یک تبلور فیزیکی برای نقطه‌ی باینری وجود دارد؟

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

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

برای اینکه این موضوع بهتر مشخص شود، اجازه دهید روشی را برای تحلیل مدل Fixed-Point، بر روی کاغذ به شما معرفی کنم.

روش s.m.n برای تحلیل محاسبات به روش Fixed-Point در FPGA

یکی از روش‌‌هایی که می‌‌توانید برای تحلیل مدارها و محاسباتی که به روش Fixed-Point هستند، انجام دهید، روشی است که من آن را روش s.m.n می‌‌نامم.

روش s.m.n برای نمایش اعداد اعشاری در FPGA

روش s.m.n برای نمایش اعداد اعشاری در FPGA

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

تعداد بیت‌‌های صحیح را با m نشان می‌‌دهیم و تعداد بیت‌‌های اعشاری را با n نشان می‌‌دهیم.

مثلاً، اگر مانند زیر، یک رجیستر هشت بیتی علامت‌‌دار داشته باشیم که می‌‌خواهیم نشان دهیم چهار بیت آن اعشاری است، آن را به این صورت نشان می‌‌دهیم: (s.3.4)

عدد اعشاری باینری

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

اگر یک رجیستر شش بیتی بدون علامت مانند زیر، داشته باشیم، و بخواهیم برای آن دو رقم اعشار در نظر بگیریم، نحوه‌ی نمایش این رجیستر به روش s.m.n، به این صورت است: (4.2)

عدد اعشاری باینری

که در آن، عدد دو، نشان دهنده‌ی دو بیت اعشار و عدد چهار، نشان دهنده‌ی چهار بیت صحیح است. چون این عدد بدون علامت است، حرف s را نمی‌‌نویسیم.

برای بهتر روشن شدن مفهوم نمایش Fixed-Point، اجازه دهید مثالی برای جمع دو عدد به روش نمایش Fixed-Point بزنیم.

جمع دو عدد اعشاری در FPGA به روش نمایش Fixed-Point

برای اینکه دو عدد اعشاری را با هم جمع کنیم، باید همان روشی که روی کاغذ انجام می‌‌دهید را در پیاده‌‌سازی پیش بگیرید.

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

در پیاده‌‌سازی جمع Fixed-Point در FPGA هم، دقیقاً باید همین کار را انجام دهید؛ یعنی نقطه‌‌های باینری را زیر هم قرار دهید.

مثلاً فرض کنید که می‌‌خواهیم دو رجیستری را که در شکل زیر می‌‌بینید، باهم جمع کنیم:

نمایش جمع دو عدد اعشاری باینری

جمع دو عدد اعشاری باینری در FPGA

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

البته این نقاط باینری در ذهن ما هستند و از نظر پیاده‌‌سازی درون FPGA، چیزی به نام نقطه‌ی باینری وجود ندارد.

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

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

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

جمع دو عدد اعشاری باینری

جمع دو عدد اعشاری باینری در FPGA

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

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

به این ترتیب، شما می‌‌توانید عمل جمع را بدون مشکل انجام دهید و مسئله‌ی نقطه باینری را در جمع دو عدد Fixed-Point رعایت کنید.

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

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

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

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

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

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

احمد ثقفی

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

  • سلام
    با تشکر از ویدیو خوبتون
    ىر ویدیو شما حرفی از محاسبات اعشاری نشد بلکه محاسبات اعداد صحیح بود

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

      در تمام اسلایدهای این ویدئو، در مورد نحوه نمایش و محاسبات fixed-point که روشی برای محاسبات اعشاری است صحبت شد.

      اگر بیشتر توضیح بدید که منظورتون از محاسبات صحیح چیست، احتمالا بهتر بتوانم ابهام شما را برطرف کنم.

      موفق باشید.

  • مرسی استاد …
    عالی بود … ولی جای یک مثال جامع و خوب واقعاً کم بود (مثالی در غالب VHDL )
    خدا توفیقتان بدهد …
    ادامه بدید …

  • ممنون از زحمات شما
    در صورت امکان نحوه محاسبات floating point هم گذاشته شود.

  • با عرض سلام و تشکر بابت ویدیوهای آموزشی که تولید میکنید و به اشتراک میذارید

    این حلسه نسبت به حلسات قبلی چند چیز کم داشت که ممنون میشم توضیح مختصری بدید

    ۱- چطور پیاده سازی این اعداد اعشاری(شناور و ثابت) تو زبان VHDL انجام بدیم؟ چون خودم امتحان کردم بعضا به مشکلاتی بر میخوردم

    ۲- ممیز شناور بر خلاف ممیز ثابت که توضیح داده شد سخنی ازش نبود

    ۳- تو پیاده سازی در FPGA به صورت واقعی چطور متوجه میشه که تو مدل fixed point ممیز رو کجا بذاره؟ از لحاظ باینری منظورم بود

    ببخشید که سرتون رو درد آوردم

    • سلام،

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

      موفق باشید.

  • با تشکر از شما استاد محترم واقعا که کشور ما به داشتن استادایی مثل شما افتخار میکنه خدا توفیقتون بده بابت آموزشهای خوب و کاربردیتون…و اما یه سوال؟هنگامی که من از کتابخانهtextio داخل تست بنچ استفاده میکنم با چه دستوری ورودی های علامت دار اعشاری که از فایل متلب میخونم رو به std_logic_vector 16 بیتی تبدیل کنم…با تشکر از توجه شما استاد محترم

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

      مقادیری که در فایل وجود دارند نباید اعشاری باشند و قبلا شما باید آنها را بر مبنای تعداد بیت کسری لازم در عددی ضرب کرده و روند کرده باشید. یعنی حتما باید مقادیر صحیح باشند. برای تبدیل هم در صورتی که از نوع signed و unsigned در کدنویسی استفاده کرده باشید که توصیه می‌شود همین کار را بکنید، باید از تبدیل to_signed یا to_unsigned استفاده کنید.

      موفق باشید.

  • با عرض سلام و تشکر بابت زحماتی که میکشین. برای رفع ابهام یه سوال میپرسم اگر جواب بدین ممنون میشم.
    برای ذخیزه عدد ۱٫۵ در یک سیگنال به روش ممیز ثابت در vhdl از چه دستوری باید اسنفاده کرد که قابلیت سنتز شدن را نیز داشته باشد؟
    سیگنالی که قرار است عدد ممیز شناور را ذخیره کند از چه نوعی باید تعریف شود؟
    سپاس

    • سلام،

      اول اینکه در زبان VHDL چیزی به اسم دستور وجود ندارد. دوم اینکه، هیچ عبارتی برای این کار وجود ندارد. محل نقطه اعشاری همانطور که اشاره شد، در ذهن طراح است.

      موفق باشید.

  • سلام خسته نباشید
    میخواستم بدونم تو آموزش های که گذاشتید مطلبی هست که برای پیاده سازی مقاله Efficient Fixed/Floating-Point Merged
    Mixed-Precision Multiply-Accumulate Unit for
    Deep Learning Processors
    Hao Zhang
    به من کمک کنه؟
    ممنون میشم راهنمایی کنید

  • درود
    برخلاف تمام آموزشهایی که تا کنون داشته اید و بسیار عالی و کامل بودند ، این آموزش خیلی ناقص و کم محتوا بود و جا داشت که حداقل یه مثال با کدهای VHDL برای آشنایی با استفاده از ممیز قرار میگرفت . به هر حال از آموزشهای عالیتون سپاسگذارم.

    • سلام،

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

      موفق باشید.

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

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

    >