2016-06-17 4 views
4

я могу напечатать integer десятичным на стандартный вывод с:Как написать целое число в stdout как шестнадцатеричное в VHDL?

library std; 
use std.textio.all; 

entity min is 
end min; 

architecture behav of min is 
begin 
    process is 
     variable my_line : line; 
    begin 
     write(my_line, 16); 
     writeline(output, my_line); 
     wait; 
    end process; 
end behav; 

, который выводит:

16 

Но как выводить вместо либо:

10 
0x10 
+1

@downvoters: Объясните, пожалуйста, так что я могу научиться и улучшить ;-) –

+0

[Каждая шестнадцатеричная цифра представляет четыре двоичных цифр (битов)] (https://en.wikipedia.org/wiki/Hexadecimal»). Целочисленный скаляр является дискретным типом с позицией, которая является целочисленным значением (IEEE Std 1076-2008, 5.2 Scalar types) - и интегратор не имеет битов. Вы можете написать функцию для преобразования целочисленного значения в base16 amenable (15.5.3) или преобразовать целочисленное значение в тип, который представляет собой бинарные биты численно, а строковое представление имеет эквивалент битовой строки (15.8). – user1155120

ответ

2

Там нет стандартной библиотеки но например, наш PoC-Libary имеет несколько функций форматирования в PoC.Strings пакет. Кроме того, у нас есть функция to_string(...), которая принимает символ формата, такой как h для шестнадцатеричных выходов.

Как записать такое целое число в шестнадцатеричное преобразование?

  1. Преобразования целочисленного в двоичное представление
  2. Group двоичного значения в 4-битовых группы
  3. перевести каждую группу в целом/альфа в диапазоне 0..F
  4. препенда 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.

+0

Что, нет функции div_ceil? – user1155120

8

Предполагая, что целое число i и VHDL-2008, вы можете использовать:

write(output, integer'image(i) & LF); -- Plain integer value 
write(output, "0x" & to_hstring(to_signed(i, 32)) & LF); -- Hexadecimal representation 

Вы должны иметь use std.textio.all; для этой работы. Измените значение 32, чтобы уменьшить длину шестнадцатеричного значения. Я выбрал 32, чтобы он мог представлять любое целочисленное значение в большинстве симуляторов.

Они также будут работать для операторов report, например.

report "i = 0x" & to_hstring(to_signed(i, 32)); 
+0

Можно ли вычислить это '32' из вход? Я знаю об атрибуте «integer'high», но есть ли что-то более прямое? –

+0

Да, вы можете использовать такой ответ, чтобы вычислить требуемую ширину: http://stackoverflow.com/questions/12750007/vhdl-use-the-length-of-an-integer-generic-to-determine-number -Из-Select-лин/12751341 # 12757674 –

3

Вы можете использовать hwrite процедуру в IEEE.std_logic_textio упаковке:

library IEEE;             -- ADDED 
use IEEE.std_logic_1164.all;         -- ADDED 
use IEEE.numeric_std.all;          -- ADDED 
use IEEE.std_logic_textio.all;         -- ADDED 

library std; 
use std.textio.all; 

entity min is 
end min; 

architecture behav of min is 
begin 
    process is 
     variable my_line : line; 
    begin 
     hwrite(my_line, std_logic_vector(to_unsigned(16,8))); -- CHANGED 
     writeline(output, my_line); 
     wait; 
    end process; 
end behav; 

Процедура hwrite записывает std_logic_vector в файл. Таким образом, вам нужно преобразовать integer в std_logic_vector (однако вам также нужно указать количество бит в функции to_unsigned).

http://www.edaplayground.com/x/exs

 Смежные вопросы

  • Нет связанных вопросов^_^