Можете ли вы сделать массив типов в VHDL? - PullRequest
0 голосов
/ 20 января 2019

Vivado Simulation не может поддерживать неограниченные типы, имеющие подписанный компонент.

т.е.

type A is array (natural range <>) of signed;

Я использовал это в проекте, где тип A используется в объявлениях портов, так как я хотел бы иметь параллельный дизайн, которым я управляю через общий, а также длину слова текущего этапа, например,

port (
inputdata : A(0 to number_of_parallel_generic-1)(stage_wordlength_generic-1 downto 0)
);

Поскольку я использую тип A со многими вариантами управляющих ими дженериков, например 4 широких массива с 16 длинами слов и другими вариациями (часто контролируются с помощью цикла for)

for i in 0 to length_of_generate_statement-1 generate
    signal example_signal : A(0 to 3)(stage_wordlength_generic + i - 1 downto 0);
begin
    <functional code>
end generate;

Этот вид кода позволил бы мне получить дополнительный рост от последовательных разделов моей архетектуры - например, из дополнения.

Теперь ... приступим к вопросу.

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

Дайте мне ваши глаза, это написано не совсем VHDL-образом, но, надеюсь, вы сможете увидеть, что я пытаюсь сделать.

type my_arr_of_types is array(0 to length_of_array-1) of type;

for i in 0 to length_of_array-1 generate
    my_arr_of_types(i) <= <type declaration with some dependance on i>;
end generate;

Надеюсь, вы увидите, что я пытаюсь сделать.

Это позволит вам затем вызвать элемент my_arr_of_types, который сам по себе является типом, который затем назначается сигналу / переменной.

т.е. сигнал my_sig: my_arr_of_types (n);

* Где n - любой допустимый индекс массива.

Очевидно, что это не разрешено в VHDL или любом другом инструменте моделирования. Но кто-нибудь может увидеть потенциальное решение моей проблемы?

Помните, я использую большинство этих типов в операторах портов, поэтому любое решение должно соответствовать ограничениям объявлений портов.

1 Ответ

0 голосов
/ 21 января 2019

Использование двумерных массивов в качестве решения:

пакет

library ieee;
use     ieee.numeric_std.all;

package utilities is
  type T_SLM is array(natural range <>, natural range <>) of std_logic;
end package;

Entity

Теперь вы можете использовать этот тип в объявлении порта вместе с двумя общими параметрами. Поскольку размеры теперь известны в архитектуре, вы можете создать используемый вами определенный тип значений со знаком и использовать для генерации операторов или функцию для преобразования из типа T_SLM в myArray.

library ieee;
use     ieee.numeric_std.all;

library myLib;
use     myLib.utilities.all;

entity foo is
  generic (
    number_of_parallel : natural;
    stage_wordlength   : natural
  );
  port (
    Input : T_SLM(0 to number_of_parallel - 1, stage_wordlength - 1 downto 0)
  );
end entity;

architecture a of foo is
  type myArray is array (natural range <>) of signed(Input'range(2));

  function convert(matrix : T_SLM) return myArray is
    variable result : myArray(matrix'range(1));
  begin
    for i in matrix'range(1) loop
      for k in matrix'range(2) loop
        result(i)(j) := matrix(i, j);
      end loop;
    end loop;
    return result;
  end function;

  signal InputData1 : myArray(Input'range(1));
  signal InputData2 : myArray(Input'range(1));
begin
  genInput: for i in Input'range(1) generate
    genInput: for j in Input'range(2) generate
      InputData1(i)(j) <= Input(i, j);
    end generate;
  end generate;

  InputData2 <= convert(Input);
end architecture;

Многие вспомогательные функции, подобные этой, были реализованы в PoC Library в пакете PoC.vectors .

...