你能用VHDL制作一个类型数组吗? Vivado Simulation无法支持具有签名组件的无约束类型。

你能用VHDL制作一个类型数组吗? Vivado Simulation无法支持具有签名组件的无约束类型。,vhdl,vivado,Vhdl,Vivado,i、 e 当我使用A型时,泛型的许多变体控制它们,例如4个宽数组,16个字长和其他变体(通常由for-generate循环控制) 对于0中的i到\u generate\u语句-1 generate的长度\u 信号示例信号:A(0到3)(stage_wordlength_generic+i-1向下到0); 开始 终端生成; 这类代码将允许我从架构的连续部分中获得比特增长,例如,从一个加法中 现在。。。着手解决手头的问题。 我可以绕过这个问题,而不是用一个永远变化的generate语句启动一个信号

i、 e

当我使用A型时,泛型的许多变体控制它们,例如4个宽数组,16个字长和其他变体(通常由for-generate循环控制)

对于0中的i到\u generate\u语句-1 generate的长度\u
信号示例信号:A(0到3)(stage_wordlength_generic+i-1向下到0);
开始
终端生成;
这类代码将允许我从架构的连续部分中获得比特增长,例如,从一个加法中

现在。。。着手解决手头的问题。 我可以绕过这个问题,而不是用一个永远变化的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;
type my_arr_of_types是类型的数组(0到长度\u of_array-1);
对于0中的i,生成长度为\u数组-1的\u

my_arr_类型(i)使用二维数组作为解决方案:

包裹
许多类似这样的帮助器函数已在in软件包中实现。

提供了一个问题的解决方案,您提供的标题Vivado Simulation无法支持具有签名组件的无约束类型。这里的“签名组件”是什么意思?类型numeric_std.signed是2的补码表示,不会从我的体系结构的连续部分(例如,从加法)获得比特增长。
。您似乎正在寻求解决方案,但没有明确说明。您是否启用了VHDL-2008支持?VHDL-2008支持非常弱,不要期望太多…
A
不是一个类型,它是一个信号(端口),因此不能用于声明新信号,如
example\u signal
。如果要声明来自对象的信号,请使用属性
'subtype
类似
信号示例:a(0)子类型
。是的,这就是@Paebbels我2008年的语法,但我刚刚发现Vivado不支持登录模拟的数组(自然范围),所以我不得不完全改变我的设计/考虑必须硬编码一切。。。非常模糊,它在IEEE 2008标准中是可接受的,但Xilinx实施起来太慢,这就是Xilinx产品的工作原理。。。即使xSim会支持它,也不意味着Vivado synth也会支持它!你能做什么?例如,可以使用二维数组。
port (
inputdata : A(0 to number_of_parallel_generic-1)(stage_wordlength_generic-1 downto 0)
);
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;
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;
library ieee;
use     ieee.numeric_std.all;

package utilities is
  type T_SLM is array(natural range <>, natural range <>) of std_logic;
end package;
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;