سلام 

**

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

**

 

http://www.klabs.org/mapld05/presento/189_lewis_p.pdf

تو این پست میخوام یکی از قابلیتای جالب VHDL رو براتون بگم که تو سیگنال پروسسینگ خیلی کار رو ساده میکنه.

برای شروع، اگه میخواستیم که عدد اعشاری رو به صورت فیکسد پوینت بنویسیم تو باینری اینجوری میشد دیگه:

(12.375)_10=(110.011)_2

درسته؟

یعنی اعداد سمت راست ممیز 0.5 و 0.25 و 0.125 و . میشن

حالا دو تا عدد رو میخوایم دو هم ضرب کنیم، میشه خیلی ساده مثل دو تا وکتور باینری باهاشون برخورد کرد و مثلا اگه جفتشون 3 تا ممیز دارن، برای این که نتیجه هم سه تا ممیز داشته باشه، وکتور نهایی که 6 تا ممیز داره رو 3 تاش رو ترانکیت میکنیم که خروجی عدد با مفهومی بشه.

ولی خب همه ی این کارا و بررسی این که این وسط overflow شده و این که حواسمون به ممیز ها باشه، خیلی کار اذیت کننده ایه. چیز نشدنی ای نیست ولی آزار دهندس.

مثال:

12.5x23.7 = 1100.100 x 10111.101

اول این که با سه تا ممیز نمیشه 23.7 رو نشون داد و نتیجه دقیق نیستش. 

برای این که این ضرب رو بتونیم بکنیم میایم عددا رو تو 2^3 ضرب میکنیم، که ممیزشون بپره

= 1100100 x 10111101 = 100 1001 1101 0100

بعدش میایم 3 تا بیت رو از سمت راست حذف میکنیم چون محاسباتمون fixed point هست و باید تعداد ممیز ها ثابت باشه

= 1001 0011 1010

که چون میدونیم 3 تا ممیز داریم عدد واقعی هست :

= 1 0010 0111.010 = 295.25

عدد درست 296.25 هست. حالا چون تعداد ممیز ها کم بود یکم دقت پایین بود ولی بالاخره تو FPGA چیزی که خدا زیاد گذاشته بیته. 

 

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

من راجع به fixed point ها مینویسم. float قطعا دقت بیشتر داره و بهتره ولی خب سنتزش فکر میکنم خیلی سنگین میشه. شایدم نمیشه. نمیدونم.

 

این لایبرری اسمش fixed_pkg هست. 

توی مدل سیم میشه راحت سیمولیت کرد ولی تو کوآرتس سر سنتز گیر میده که نمیشناسه. چون که آقایون توی ورژن prime 15+ فقط گذاشتنش. ولی شما میتونید دستی ادش کنید از همین گیتهاب آقای بیشاپ 

https://github.com/FPHDL/fphdl

 

همچنین تو کوآرتس نمیتونید توی بلوک دیاگرام باس های fixed point و . رو نمیتونید داشته باشید فقط تو کد میتونید. پس باید مثلا به وکتور تبدیلش کنید اگه تو شماتیک میاریدش. 

برای استفاده از کدا باید اول کتابخونه رو ادد کنید.

use IEEE.fixed_float_types.all;
use ieee.fixed_pkg.all;

ببخشید رنگ نداره!

بعد سیگنالاتون رو اینجوری تعریف میکنید:

 

signal a1 : sfixed(10 downto -20);

 

اول این که sfixed میگه که عدد سایند هست و ufixed هم داریم. دوم این که 10 یعنی 10 تا سمت چپ ممیز و منفی 20 یعنی 20 تا راست ممیز داره. که اگه با تایپ های نرمالی که قبلا دیده بودیم مقایسه بکنیم یکم جالبه.

حالا مثلا دو تا عدد sfixed اینجوری با هم جمع میشن

 

signal a,b : sfixed(5 downto -6);

signal c : sfixed(6 downto -6);

 

a<= sfixed(2.32,a); -- Size of the sfixed number must be determined here

b<= sfixed(1.55,5,-6); -- either this way or you can just do it like the previous line

c <= a+b;

 

دقت کنید عدد قبل ممیز نتیجه رو 6 بیتی گرفتم. اگه چیز دیگه ای بزارید اررور میده و کار نمیکنه چون جمع اینا که 5 بیتی هستن باید 6 بیتی باشه. من خودم 2 روز فکر کنم گیر این بودم چرا کار نمیکنه.

 

 حالا فرض کنید میدونید که میخواید نتیجه رو تو یه چیز 5 بیتی بریزید. از دیزاین خودتون آگاهید به قولی

signal c : sfixed(5,-6);

c <= resize(arg => a+b, size_res => c, overflow_style => fixed_saturate, round_style => fixed_round);

 

میخواستم یه کد برای فیلتر IIR بزارم ولی کده تو لپتاپمه و میدونید قضیه لپتاپ رو (آب و ) خلاصه که نشد. ولی چیزی نداره خودتون میتونید بزنید. فقط عکسی که از خروجیش گرفته بودم رو میزارم

 

 

 

مشخصات

آخرین جستجو ها