Как преобразовать тип VHDL с фиксированной точкой обратно в float?

Я использую пакет фиксированной точки IEEE в VHDL.

Это работает хорошо, но теперь я столкнулся с проблемой, связанной с их строковым представлением на тестовом стенде: я хотел бы сбросить их в текстовый файл.

Я обнаружил, что действительно можно напрямую написать ufixed или sfixed, используя:

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

Но затем я получаю такие значения, как 11110001.10101 (для фиксированного представления 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