2013-03-14 3 views
0

Как преобразовать вектор std_logic, bit_vector или любой другой вектор в строку?vhdl: преобразовать вектор в строку

Signal a,b   : UNSIGNED(7 DOWNTO 0); 
SIGNAL x,y,z : BIT_VECTOR(7 DOWNTO 0); 

... 

report "value: " & BIT_VECTOR'Image(x) severity note; 
report "and this one: " & to_string(a) severity note; 

Это не работает, так как я могу преобразовать вектор в строку?

ответ

3

Как вы обнаружили, возвращается атрибут изображения объявляется только для скалярных типов, а не массивы или записи: обычный подход заключается в создании собственной библиотеки тестовых утилит, включая to_string или image функций в пакет в начать дизайн и использовать его повсюду.

Было бы вполне возможно стандартизировать библиотеку из них, и вы, вероятно, найдете много потенциальных пакетов «тестовой утилиты», но ни один из них не поймал достаточно хорошо, чтобы заслужить стандартное.

При этом вы можете найти следующий пакет полезной отправной точкой.

Он инкапсулирует несколько пользовательских типов данных с операциями над ними. Нет дженериков, но благодаря перегрузке вы можете использовать пакет, как если бы его функции были универсальными. (Вы заметите, что тела функций неполны, хотя!) Расширение и добавление типов легко разрезано & паста по большей части; и он держит много загромождения из основного дизайна.

Может быть лучше выделить тип declns и функции (testbench only) в два отдельных пакета; Types и Types_Test_Utils. Затем Типы используются во всем дизайне, в то время как тестовые утилиты доступны только на тестовом стенде.

library IEEE; 
use IEEE.numeric_std.all; 

package Types is 
    subtype SmallNum is UNSIGNED(7 DOWNTO 0); 
    subtype BiggerNum is UNSIGNED(19 DOWNTO 0); 
    subtype Bits is BIT_VECTOR(7 DOWNTO 0); 

    -- and operations on these types 
    -- Simulate generic procedures using overloading 

    function to_string(N : Unsigned) return String; 
    function to_string(N : Bits) return String; 

    procedure eq_checker (name : string; sig,should : SmallNum; at : time); 
    procedure eq_checker (name : string; sig,should : Bits; at : time); 

end Types; 

package body Types is 

function to_string(N : Unsigned) return String is 
variable temp : string(1 to (N'length + 3)/4) := (others => 'x'); 
begin 
    -- not finished! 
    return temp; 
end to_string; 

function to_string(N : Bits) return String is 
begin 
    return "hello"; 
end to_string; 

procedure eq_checker(name : string; sig,should : SmallNum; at : time) is 
begin 
    if (at = now) then 
    if sig = should then 
     report to_string(sig) & "has same value" severity note; 
    else 
     report to_string(sig) & "has not same value as " & to_string(should) severity note; 
    end if; 
    end if; 
end procedure eq_checker; 

procedure eq_checker(name : string; sig,should : Bits; at : time) is 
begin 
    null; 
end procedure eq_checker; 

end Types; 

И простой тестер для него ...

use Work.Types.all; 

    ENTITY tester IS 
    END tester; 

    ARCHITECTURE behavior OF tester IS 

    Signal a,b  : SmallNum := X"AA"; 
    Signal c  : BiggerNum := X"ABCDE"; 
    SIGNAL x,y  : Bits := X"BB"; 

    BEGIN 

    process(a,x) is 
    begin 
    report "value: " & to_string(X) severity note; 
    report "and this one: " & to_string(a) severity note; 
    report "this one too: " & to_string(c) severity note; 
    end process; 

    END; 
0
package package_x is 
    subtype any_type is UNSIGNED(7 DOWNTO 0); 

... 
end package_x; 

package body package_x is 

    procedure someprocedure (signal sig: in any_type) is 

    VARIABLE li : line; 
    file output : text open write_mode is "output"; 

    begin 
    write(li, std_logic_vector(sig)); 
    writeline(output, li); 
    end; 
end package_x; 
+0

+1 для начала использования подтипов ... –

+1

ОП попросил преобразование в строка. Это, с другой стороны, запись/запись. См. Сообщение Брайана для преобразования в строку –

+1

Ну, 'строка' просто определяется как тип доступа к' string'. Таким образом, можно преобразовать это в функцию и вернуть 'li.all'. – PlayDough

1
function slv_to_string (a: std_logic_vector) return string is 
    variable b : string (a'length-1 downto 1) := (others => NUL); 
begin 
     for i in a'length-1 downto 1 loop 
     b(i) := std_logic'image(a((i-1)))(2); 
     end loop; 
    return b; 
end function; 

:)

3

VHDL-2008 стандарт определяет to_string для std_logic_vector и std_ulogic_vector, а также различных другие типы. Проще всего использовать режим VHDL-2008 (большинство симуляторов поддерживают 2008 год).

4

Вот решение, где диапазон переменного типа std_logic_vector не влияет на возвращаемом значении:

function to_string (a: std_logic_vector) return string is 
variable b : string (1 to a'length) := (others => NUL); 
variable stri : integer := 1; 
begin 
    for i in a'range loop 
     b(stri) := std_logic'image(a((i)))(2); 
    stri := stri+1; 
    end loop; 
return b; 
end function; 
Смежные вопросы