Там нет стандартной библиотеки но например, наш PoC-Libary имеет несколько функций форматирования в PoC.Strings пакет. Кроме того, у нас есть функция to_string(...)
, которая принимает символ формата, такой как h
для шестнадцатеричных выходов.
Как записать такое целое число в шестнадцатеричное преобразование?
- Преобразования целочисленного в двоичное представление
- Group двоичного значения в 4-битовых группы
- перевести каждую группу в целом/альфа в диапазоне 0..F
- препенда
0x
, если желает
Так вот обертка для преобразования целого числа в двоичном представлении:
-- format a natural as HEX string
function raw_format_nat_hex(Value : NATURAL) return STRING is
begin
return raw_format_slv_hex(std_logic_vector(to_unsigned(Value, log2ceil(Value+1))));
end function;
А теперь группировка и преобразование
-- format a std_logic_vector as HEX string
function raw_format_slv_hex(slv : STD_LOGIC_VECTOR) return STRING is
variable Value : STD_LOGIC_VECTOR(4*div_ceil(slv'length, 4) - 1 downto 0);
variable Digit : STD_LOGIC_VECTOR(3 downto 0);
variable Result : STRING(1 to div_ceil(slv'length, 4));
variable j : NATURAL;
begin
Value := resize(slv, Value'length);
j := 0;
for i in Result'reverse_range loop
Digit := Value((j * 4) + 3 downto (j * 4));
Result(i) := to_HexChar(unsigned(Digit));
j := j + 1;
end loop;
return Result;
end function;
-- convert an unsigned value(4 bit) to a HEX digit (0-F)
function to_HexChar(Value : UNSIGNED) return CHARACTER is
constant HEX : STRING := "ABCDEF";
begin
if (Value < 16) then
return HEX(to_integer(Value)+1);
else
return 'X';
end if;
end function;
-- return TRUE, if input is a power of 2
function div_ceil(a : NATURAL; b : POSITIVE) return NATURAL is -- calculates: ceil(a/b)
begin
return (a + (b - 1))/b;
end function;
-- return log2; always rounded up
function log2ceil(arg : positive) return natural is
variable tmp : positive;
variable log : natural;
begin
if arg = 1 then return 0; end if;
tmp := 1;
log := 0;
while arg > tmp loop
tmp := tmp * 2;
log := log + 1;
end loop;
return log;
end function;
Примечание: Эти функции не предварять 0x
.
@downvoters: Объясните, пожалуйста, так что я могу научиться и улучшить ;-) –
[Каждая шестнадцатеричная цифра представляет четыре двоичных цифр (битов)] (https://en.wikipedia.org/wiki/Hexadecimal»). Целочисленный скаляр является дискретным типом с позицией, которая является целочисленным значением (IEEE Std 1076-2008, 5.2 Scalar types) - и интегратор не имеет битов. Вы можете написать функцию для преобразования целочисленного значения в base16 amenable (15.5.3) или преобразовать целочисленное значение в тип, который представляет собой бинарные биты численно, а строковое представление имеет эквивалент битовой строки (15.8). – user1155120