Как да преобразувам VHDL тип с фиксирана точка обратно в плаващ?

Използвам IEEE пакет с фиксирана точка във VHDL.

Работи добре, но сега се сблъсквам с проблем относно тяхното представяне на низове в тестов стенд: бих искал да ги изхвърля в текстов файл.

Открих, че наистина е възможно директно да напиша ufixed или sfixed с помощта на:

write(buf, to_string(x)); --where x is either sfixed or ufixed (and buf : line)

Но след това получавам стойности като 11110001.10101 (за sfixed q8.5 представяне).

И така, въпросът ми: как да конвертирам обратно тези числа с фиксирана запетая в реални (и след това в низ)?


person JCLL    schedule 01.05.2013    source източник
comment
И така, в примера по-горе искате 11110001.10101 да бъде записано във вашия текстов файл като 241.6563?   -  person Jotorious    schedule 01.05.2013
comment
От гугъл изглежда, че има функция to_real(), която можете да използвате.   -  person Jotorious    schedule 01.05.2013
comment
Опитвали ли сте нещо като: write(buf, to_string(to_real((x)));   -  person Jotorious    schedule 01.05.2013
comment
да, пробвал съм това. на GHDL получавам: префиксът не е нито име на функция, нито може да бъде нарязан или индексиран   -  person JCLL    schedule 01.05.2013
comment
Фиксираният общ пакет (fixed_generic_pkg.vhdl, fixed_generic_pkg-body.vhdl) е достъпен от страницата с допълнителни материали на IEEE за IEEE Std 1076-2008 (zip файлът). Този пакет съдържа посочените функции to_real за sfixed и ufixed. Може или не може да се натъкнете на изграждане на зависимости за ghdl и трябва да се консултирате и с ръководството за потребителя на ghdl. Двете функции в тялото на пакета могат да се използват като вдъхновение за локално преобразуване.   -  person    schedule 02.05.2013
comment
GHDL (в момента) подвеждащо дава съобщението prefix is neither a function name nor can it be sliced or indexed, когато не може да намери претоварена подпрограма, която точно съответства на вашето извикване (често защото типът на един от параметрите е грешен). Случайно изпратих корекция миналата седмица, за да (наред с други неща) подобря това съобщение - вижте gna.org/bugs /?20769 : Точният ред и точното съобщение за грешка биха могли да посочат грешката по-точно.   -  person user_1818839    schedule 05.05.2013


Отговори (1)


Променливата трябва да бъде разделена на две части на std-logic-vector, целочислената част може да бъде преобразувана в низ чрез стандартно преобразуване, но за дробната част преобразуването на низ е малко по-различно. За целочислената част трябва да използвате цикъл и да разделите на 10 и да преобразувате модулния остатък в ascii символ, като изграждате от по-малката цифра към по-високата цифра. За дробната част също се нуждае от цикъл, но човек трябва да умножи по 10, вземете думата и изолирайте тази цифра, за да получите съответния знак, след което това цяло число се използва за изваждане от дробното число и т.н. Това е концепцията, работи в MATLAB за тестване и създаване на vhdl версия, която ще споделя скоро. Бях изненадан, че никъде не намирам такава полезна функция. Разбира се, форматът с фиксирана запетая може да варира Q(N,M) N и M могат да имат всякакви стойности, докато за плаваща запетая той е стандартизиран.

person bhamadicharef    schedule 23.02.2017