مقدمه
یکی از مهترین ویژگیهای تراشههای FPGA قابلیتهای آنها در پیادهسازی انواع توابع ریاضی است. توابع ریاضی ممکن است گاهاً بسیار ساده و ترکیبی از چند عمل ضرب و جمع باشند. بعضاً نیز ممکن است شامل عملگرهای غیرخطی همچون لگاریتم یا توابع مثلثاتی باشند. اگر مدتهاست با تراشه های FPGA کار میکنید، مطمئناً میدانید که برای پیادهسازی تابع لگاریتم IP Core آماده وجود ندارد. پس در صورتی که نیار به پیاده سازی تابع لگاریتم در یک الگوریتم داشته باشید باید خودتان آستینها را بالا بزنید و کار را شروع کنید.
شاید برای شما مفید باشد: آموزش FPGA
اولین راه حلی که ممکن است به ذهن طراح برسد، استفاده از یک حافظه ROM است. در این روش مقدار تابع لگاریتم (x)log به ازای مقادیر مختلف ورودی x در نرم افزار Matlab محاسبه میشود و سپس این مقادیر درون حافظههای FPGA ذخیره میشوند. در عمل به ازای مقادیر مختلف x یک آدرس از حافظه انتخاب میشود، و محتوای ذخیره شده در آن آدرس مقدار تابع (x)log است.
با وجود این در بسیاری از موارد ممکن است استفاده از حافظه ROM بهترین و سادهترین گزینه باشد. اما سوأل اینجاست، اگر این کار امکان پذیر نبود چه باید کرد؟ لازم نیست نگران باشید. با چند تکنیک ساده این مسأله قابل حل است. با توجه به اینکه محاسبه لگاریتم در چه مبنایی مورد نیاز است، ممکن است میزان محاسبات مورد نیاز برای دستیابی به پاسخ مطلوب متفاوت باشد. در این آموزش ما کار را با محاسبه عبارت (x)log2 شروع میکنیم. سپس بحث را گسترش میدهیم و محاسبه لگاریتم در سایر مبناها و یکسری از شرایط خاص را نیز پوشش میدهیم. برای درک بهتر مسأله توضیحات همراه با مثال ارائه شده است.
اگر با FPGA آشنایی ندارید اول مقاله FPGA چیست؟ را مطالعه نمایید.
لگاریتم در مبنای ۲
در حالت کلی پیادهسازی عبارت (x)log2 در FPGA به ازای هر مقدار x دارای یک بخش صحیح و یک بخش اعشاری است. به عنوان مثال برای عدد ۵۳ خواهیم داشت.
مقدار 5 نشان دهنده مقدار صحیح و مقدار 0.7279 بیانگر مقدار اعشاری است. به صورت پیش فرض برای محاسبه (x)log2 یک در آن x یک عدد N بیتی است، ابتدا مقدار صحیح و سپس مقدار اعشاری پاسخ را محاسبه میکنیم.
محاسبه بخش صحیح که از این پس آن را با نماد S نمایش می دهیم، یک کار نسبتا آسان است. فقط کافی است موقعیت اولین بیت با ارزشی را که مقدار آن ‘1’
است، پیدا کنیم. در مثال عدد ۵۳ در یک نمایش ۸ بیتی به صورت زیر، موقعیت اولین بیت ‘1’
با ۵ است. برای پیدا کردن اولین ‘1’
میتوان از تابعی تحت عنوان LeadOneDetector استفاده کرد.
در ادامه M بیت بعد از اولین ‘1’
را انتخاب میکنیم. ما از این M بیت برای تعیین بخش اعشاری (x)log2 استفاده میکنیم.