Как написать в консоль пользовательский тип массива - PullRequest
0 голосов
/ 05 июня 2019

Я довольно новичок в VHDL, и я запускаю некоторые фрагменты кода, который мне дали, чтобы посмотреть, что он делает. Существует специальный тип массива, который я хочу видеть в консоли, но я получаю сообщение об ошибке при попытке его записать.

entity hello_world is 
end entity hello_world;

library STD;                          
library IEEE;                        
use IEEE.std_logic_1164.all;           
use STD.textio.all;                  
use IEEE.std_logic_textio.all;         
use IEEE.numeric_std.all;                                    

architecture test of hello_world is 

    type row_type is array(0 to 2)  of std_logic_vector(3 downto 0);
    type new_type is array(0 to 1)  of row_type;
    signal  max_new : new_type := (others => (others => (others => '0')));

    begin
    my_print :  process is                  
        variable my_line : line;    
        begin
            write(my_line, string'("Value of max_new"));      
            write(my_line, max_new);    
            writeline(output, my_line);            
            wait;
    end process my_print;
end architecture test;

Ошибка, которую я получаю во время симуляции:
Ошибка: ошибка типа около 'max_new': ожидаемый тип 'std_ulogic'. Ошибка: формальное 'l' режима inout должно иметь фактическую привязку. Ошибка: формальное значение не имеет фактического значения или значения по умолчанию. Ошибка: префикс индексированного имени типа 'void' не является типом массива enter image description here

Если я правильно понял, тип строки - это массив размера 3, в каждой позиции у меня есть вектор из 4 битов. new_type - это массив размера 2, в каждой позиции у меня есть row_type, который является массивом размера 3 с вектором 4 бита в каждой позиции. Это правильно? Поскольку он инициализирован в 0, я ожидаю увидеть только это.

Я использую Vivado 2018.3 для симуляции.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вы также можете создать свою собственную процедуру записи:

entity hello_world is
end entity hello_world;

-- library STD;
library IEEE;
use IEEE.std_logic_1164.all;
use STD.textio.all;
use IEEE.std_logic_textio.all;
-- use IEEE.numeric_std.all;

architecture test of hello_world is

    type row_type is array(0 to 2)  of std_logic_vector(3 downto 0);
    type new_type is array(0 to 1)  of row_type;
    signal  max_new : new_type := (others => (others => (others => '0')));
    procedure write (l: inout line; new_type_val: in new_type)  is
    begin
        write (l, string'("("));
        for i in new_type'range loop
            write (l, string'("("));
            for j in row_type'range loop
                write (l, string'(""""));
                write(l, new_type_val(i)(j));
                write (l, string'(""""));
                if j /= row_type'right then
                    write(l, string'(","));
                end if;
            end loop;
            write (l, string'(")"));
            if i /= new_type'right then
                write(l, string'(","));
            end if;
        end loop;
        write (l, string'(")"));
    end procedure;

    begin
my_print:
    process is
        variable my_line: line;
    begin
        write(my_line, string'("Value of max_new = "));
        write(my_line, max_new);
        writeline(output, my_line);
        wait;
    end process my_print;
end architecture test;
ghdl -r  hello_world
Value of max_new = (("0000","0000","0000"),("0000","0000","0000"))

, используя перегрузку существующей процедуры записи в качестве строительных блоков.

0 голосов
/ 05 июня 2019

Функция write из std.textio может принимать в качестве значения следующие аргументы (https://www.hdlworks.com/hdl_corner/vhdl_ref/VHDLContents/TEXTIOPackage.htm):

  • bit
  • bit_vector
  • логический
  • символ
  • целое число
  • действительное
  • строка
  • время

IEEE.std_logic_textio добавить std_logic и его производные к этому списку, но массив не обрабатывается write .

Вы можете напечатать свой массив следующим образом:

my_print :  process is                  
  variable my_line : line;    
begin
  write(my_line, string'("Value of max_new"));
  for I in 0 to 1 loop
    for J in 0 to 2 loop 
      write(my_line, max_new(I)(J));
    end loop;
  end loop;    
  writeline(output, my_line);            
  wait;
end process my_print;
...