یک سوالی که از شما دارم اینه که چطور میتونم اعداد اعشاری را در FPGA نمایش بدم؟
بحث اعداد اعشاری و نمایش و پیادهسازی دیجیتال آن در FPGA یکی از موضوعات بسیار مهم و البته مفصل در زمینه پیادهسازی الگوریتمهای پردازش سیگنال دیجیتال است.
به طور کلی، اعداد ممیزدار را در دیجیتال به دو صورت fixed-point و floating-point نمایش میدهند. نمایش floating-point اعداد را با دقت بسیار بیشتری نسبت به fixed-point نمایش میدهد، اما در عین حال از نظر پیادهسازی، مقدار بیشتری منابع دیجیتالی مصرف میکند و سرعت مدار را کاهش میدهد.
در عمل و در بیشتر سیستمهای پردازشی که با FPGA پیادهسازی میشوند، خصوصا وقتی سرعت مهم باشد و منابع محدود، از روش fixed-point استفاده میشود.
پیشنهاد میکنم برنامه ویدئویی زیر را که اخیرا در سایت منتشر کردم مشاهده کنید تا بیشتر با سیستم نمایش fixed-point آشنا شوید:
پیادهسازی محاسبات اعشاری در FPGA
همچنین دو کتاب زیر را در مورد پیادهسازی الگوریتمهای پردازش سیگنال که قبلا هم در کانال معرفی کرده بودم مطالعه کنید تا با جزئیات بیشتری در این زمینه آشنا شوید:
دانلود کتاب DIGITAL SIGNAL PROCESSING WITH FPGA
دانلود کتاب FPGA-BASED IMPLEMENTATION OF SIGNAL
آشنایی با سیستم نمایش fixed-point و نحوه پیادهسازی محاسبات اعشاری در FPGA به کمک این سیستم میتواند نقطه شروع بسیار عالی برای شما در مسیر یادگیری پردازش سیگنال با FPGA باشد.
ممنون میشم اگه این سوال و منو جواب بدیدهنگامی که من از کتابخانهtextio داخل تست بنچ استفاده میکنم با چه دستوری ورودی های علامت دار اعشاری که از فایل متلب میخونم رو به std_logic_vector 16 بیتی تبدیل کنم…با تشکر از توجه شما استاد محترم و گرام
سلام،
مقادیری که در فایل وجود دارند نباید اعشاری باشند و قبلا شما باید آنها را بر مبنای تعداد بیت کسری لازم در عددی ضرب کرده و روند کرده باشید. یعنی حتما باید مقادیر صحیح باشند. برای تبدیل هم در صورتی که از نوع signed و unsigned در کدنویسی استفاده کرده باشید که توصیه میشود همین کار را بکنید، باید از تبدیل to_signed یا to_unsigned استفاده کنید.
موفق باشید.
سلام .دوتا سوال داشتم .سوال اول من یه طرحی دارم که طول تمام رجیسترای داخل طرحم را ثابت در نظر گرفته .بعد برای نمایش اعداد اومده از نمایش ممیز ثایت استفاده کرده .جایی از طرح من میاد دو تا عدد رو توهم ضرب میکنه .من تا حدودی با جمع دو تا عدد ممیز ثابت اشنایی دارم و از نظر منطق من درست در میاد .ولی در مورد ضرب به فرم ممیز ثابت کمی برام گنگه .از طرفی چون حاصلضرب باید تو یه رجیستر با طول ثابت ریخته شه این مفهوم با دانش من مغایرت داره .رفرنس طرح من گفته باید حاصل رو روند کنی .من این مفهوم را نمیتونم به زبان verilog بنویسم.
سوال دوم .من میخوام در طرحم برای نمایش اعداد از فرم ممیز ثابت برای اعداد علامت دار استفاده کنم .برای نوشتن کدش به زبان verilog ایا من باید سینتکس خاصی را رعایت کنم .ممنون میشم جواب بدین
سلام،
سادهترین راه این هست که به تعداد لازم، بیت از سمت راست حاصلضرب حذف کنید.
در مورد سوال دومتون، نقطه کسری در نمایش ممیز ثابت در ذهن پیادهساز است و تحقق فیزیکی در مدار ندارد. البته با توجه به محل نقطه کسری، مواردی را باید در پیادهسازی در نظر بگیرید که بحث آن بسیار طولانی است.
پیشنهاد میکنم برنامه ویدئویی که در پستهای قبلی همین صفحه به آن اشاره کردم را ببینید.
موفق باشید.
سلام .من میخوام یه ضرب علامت دار به زبان وری لاگ تعریف کنم .چند فرض وجود داره برام :
۱- اینکه من باید سیگنالام را به شکل signed-unsigned تعریف کنم .
۲- توی تست بنچم باید وردودیهای تستم را به فرمت 'sb وارد کنم .
ولی وقتی شبیه سازی میکنم خروجی مدارم اشتباه در میاد.به نظر شما چه کاری باید من انجام میدادم که ندادم.
من رشته تحصیلی ام طراحی مدارات در سطح Cmos هست با دانش من و با یک فرض دیگه وقتی من از علامت * ضرب تو کدم استفاده میکنم از چه روشی ضرب منا پیاده سازی میکنه .با اینکه میدونیم مدار ضرب علامت دار با بدون علامت متفاوته .پس صرفا تعریف سیگنالها به شکل علامت دار یا بدون علامت اکتفا نمیکند.ایا حرفایی که من زدم درسته .
۳- من اگه بخوام صرفا یه الگوریتم ضرب (به عنوان بوث مرتبه ۳) را پیاده سازی کنم باید کدنویسی کنم درسته ؟
سلام،
در مورد Verilog مطمئن نیستم اما در VHDL همین که شما نوع یک سیگنال را signed تعریف کنید، محاسبات روی آن سیگنال اعم از جمع و ضرب به صورت علامتدار و به روش مکمل دو انجام میشود.
موفق باشید.
سلام من نهایتا به سفارش یکی از دوستان با نوشتن کد یک ضرب کننده علامت دار مشکلم را حل کردم .
سلام دوتا سوال دیگه دارم من میخوام بدون از بلوک های رم و ضرب کننده موجود در بردم استفاده کنم .یعنی برا ضرب و ساختن حافظه به جای استفاده از LUT ها از بلوک های سخت افزاری اماده استفاده کنم .البته نمیخوامم از core های نرم موجود استفاده کنم .ایا در کدم باید سینتکس خاصی را لحاظ کنم .یا هنگام پیاده سازی باید نکته خاصی را رعایت کنم .
سوال دوم : من میخوام تو یک کلاک چندین ادرس از حافظه ام را بخونم و از دیتاهاش استفاده کنم .تا جایی که اطلاعات من میگه اینه حافظه ها پورتهای خروجی محدودی دارن .( ایا این جمله من درسته ) .کل داده هایی که من میخوام ذخیره نزدیک ۲ کیلو بیت هست .پس اینکه من بیام چندین بلوک حافظه را مصرف کنم ایا درسته .به نظر شما درست اینه که من از LUT ها برا ساخت حافظه های کوچکتر استفاده کنم تا توان مصرفی مدارم پایین تر بیاد
سلام اگه منظور از "بلوک های سخت افزاری" ، IC خاصی هست که نیاز به خوندن دیتا شیت و درایو کردن اون IC دارین در غیر این صورت از منابع FPGA بهترین کاره .
شما اگه 2kbit دیتا دارین بهترین راه استفاده از Block Ram ها هست ، به صورت همزمان نمیشه دیتاهای چند آدرس مختلف از Ram ها رو خوند ولی اگه اشتباه نکنم شما می تونین در spartan6 ، هر خانه از حافظتون رو حول و حوش 4000bit تعریف کنین که در این صورت به راحتی اون 2kbit که مد نظر شما هست رو میشه در یک کلاک خوند . هر چند انتخاب هر خانه از حافظه به طول 2kbit باعث میشه تعداد زیادی از block ram هاتون مصرف بشه و به همین دلیل حجم زیادی از حافظه waste میشه !
از distributed ram ها فقط زمانی استفاده کنید که مقدار بسیار کمی حافظه نیاز دارید ، اولویت استفاده شما باید Block Ram ها باشه مگر اینکه دیگه Block ram برای استفاده باقی نمونده باشه