您可以在VHDL中创建类型数组吗?

时间:2019-01-20 15:47:27

标签: vhdl vivado

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并控制了许多泛型,例如具有16个字长和其他变化形式的4个宽数组(通常由for generate循环控制)

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;

这种代码可以使我从体系结构的顺序部分中获得一些增长-例如从另外一个。

现在...开始讨论这个问题。

我可以避免这种情况的一种方法,而不是使用永远更改的generate语句来启动信号,实际上可能是在创建“类型数组”。

借我的眼光,这是用不太甚甚于vdl的方式写的,但希望您能看到我正在尝试做的事。

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或任何仿真工具都不允许这样做。但是谁能看到解决我问题的潜在解决方案?

请记住,我在port语句上使用了大多数类型,因此任何解决方案都必须符合port声明的限制。

1 个答案:

答案 0 :(得分:1)

使用二维数组作为解决方案:

包装

library ieee;
use     ieee.numeric_std.all;

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

实体

现在,您可以在端口声明中使用此类型以及两个通用参数。由于体系结构中现已知道大小,因此您可以创建已使用的已定义类型的带符号值,并且可以使用generate语句或函数将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 LibraryPoC.vectors软件包中已实现了许多类似的帮助程序功能。