Получите представление одинарной точности IEEE-754 действительного числа в VHDL

Я хочу преобразовать действительное число в его битовое представление с полями знака, экспоненты и мантиссы в VHDL TB для целей тестирования (как STD_LOGIC_VECTOR из 32 бит). Есть ли способ преобразовать действительное число в это представление непосредственно в VHDL?

Я знаю, что в C для этого можно использовать структуру, но я не знаю, возможно ли это в VHDL.

Спасибо.

Редактировать:

Я нашел это решение:

https://www.edaplayground.com/x/gQiN

Но синтезатор выдает эту ошибку:

[XSIM 43-4187] Файл "/proj/xbuilds/2021.2_INT_0504_1926/installs/all_platforms/Vivado/2021.2/data/vhdl/src/ieee_2008/float_pkg.vhdl", строка 45: "Объявление создания пакета Vhdl 2008" не поддерживается. еще для симуляции.

Тогда я думаю, что лучшим решением будет создание функции VHDL, которая преобразует действительное число в его битовое представление IEEE-754.

С середины 2000-х годов все симуляторы, включая Xilinx ISIM/Vivado Simulator, имеют 64-битную версию. Поддержка Vivado Sim лагает. См. Пакеты с фиксированной и плавающей запятой. Симулятор использует пакеты из библиотеки ieee_proposed. Рассмотрите возможность использования другого симулятора. Xilinx Synthesis (UG901) поддерживает пакеты версии -2008, не прыгая через обручи.

user16145658 23.12.2022 15:58

Исходный код и документация для библиотеки ieee_proposed для симуляторов, изначально не поддерживающих достаточно стандарта -2008 (экземпляры пакетов), можно найти на github . Исходный код VHDL для пакетов IEEE-2008 доступен для скачивания здесь.

user16145658 23.12.2022 16:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В главе 5.2.5.2 стандарта VHDL-2008 говорится:

Единственным предопределенным типом с плавающей запятой является тип REAL. Диапазон REAL зависит от хоста, но он гарантированно будет максимальным, разрешенным выбранным представлением.

Однако функции пакета IEEE.float_pkg описаны в главе G.5.4.3 и включают следующие функции:

To_slv Входы: arg (с плавающей запятой). Преобразует число с плавающей запятой в std_logic_vector той же длины.

To_std_logic_vector Псевдоним to_slv.

To_stdlogicvector Псевдоним to_slv.

To_sulv Входы: arg (с плавающей запятой). Преобразует число с плавающей запятой в std_ulogic_vector той же длины.

To_std_ulogic_vector Псевдоним для to_sulv.

To_stdulogicvector Псевдоним для to_sulv.

Спасибо! Я только что опубликовал возможное решение, использующее IEEE.float_pkg. Но выдает мне ошибку. Я собираюсь исследовать, как это исправить.

Diego Ruiz 23.12.2022 15:41

Пожалуйста, посмотрите мою правку, я отвлекся на НАСТОЯЩЕЕ...

the busybee 23.12.2022 15:48
Ответ принят как подходящий

В конце я создал эту функцию VHDL, которая преобразует действительное число в его целочисленное представление IEEE-754:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
use ieee.math_real.all;

package Help is

    type t_vector is array (natural range <>) of integer;
    type data_t   is array (natural range <>, natural range <>) of real;
    
    function float_2_slv 
    (
        num : real := 0.0
    )
    return std_logic_vector;
    
end package Help;

package body Help is
    ----------------------------------------------------------------------------------------------------
    function  float_2_slv 
    (
        num : real := 0.0
    ) 
    return std_logic_vector is
    
        constant bits_exponent : integer := 8;
        constant bits_mantissa : integer := 23;
        
        variable abs_num : real;
        variable sign : std_logic;
        variable exponent : real;
        variable exponent_norm : std_logic_vector(bits_exponent-1 downto 0);
        variable mantissa : real;
        variable mantissa_norm : std_logic_vector(bits_mantissa - 1 downto 0);
        variable quotient : real;
        
        variable slv  : std_logic_vector(31 downto 0);
        
    begin
        
        sign := '0';
        abs_num := abs(num);
        if num < 0.0 then
            sign := '1';
        end if;
        
        exponent := floor(log2(abs_num));
        quotient := 2.0 ** exponent;
        mantissa := abs_num / quotient;
        
        exponent_norm := std_logic_vector(to_unsigned(natural(127.0+exponent), bits_exponent));
        mantissa_norm := std_logic_vector(to_signed(natural(round(mantissa*(2.0**(bits_mantissa)))), bits_mantissa));
    
        slv := sign & exponent_norm & mantissa_norm;
    
        return slv;
    end;

end package body Help;

Если требуется преобразование из числа с плавающей запятой в целое число IEEE-754 в Vitis, то это можно сделать, как в C:

uint32_t get_IEEE754(float d)
{
    uint32_t bits;
    memcpy(&bits, &d, sizeof(d));
    return bits;
}

Другие вопросы по теме