Я хочу преобразовать действительное число в его битовое представление с полями знака, экспоненты и мантиссы в 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.
Исходный код и документация для библиотеки ieee_proposed для симуляторов, изначально не поддерживающих достаточно стандарта -2008 (экземпляры пакетов), можно найти на github . Исходный код VHDL для пакетов IEEE-2008 доступен для скачивания здесь.
В главе 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. Но выдает мне ошибку. Я собираюсь исследовать, как это исправить.
Пожалуйста, посмотрите мою правку, я отвлекся на НАСТОЯЩЕЕ...
В конце я создал эту функцию 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;
}
С середины 2000-х годов все симуляторы, включая Xilinx ISIM/Vivado Simulator, имеют 64-битную версию. Поддержка Vivado Sim лагает. См. Пакеты с фиксированной и плавающей запятой. Симулятор использует пакеты из библиотеки ieee_proposed. Рассмотрите возможность использования другого симулятора. Xilinx Synthesis (UG901) поддерживает пакеты версии -2008, не прыгая через обручи.