انجام محاسبات اعشاری و پیادهسازی آن در 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 نشان میدهیم.
مثلاً، اگر مانند زیر، یک رجیستر هشت بیتی علامتدار داشته باشیم که میخواهیم نشان دهیم چهار بیت آن اعشاری است، آن را به این صورت نشان میدهیم: (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 برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.