Vhdl:无约束数组和大小实例化

Vhdl: unconstrained arrays and size instaniation

我正在尝试将数组大小(整数 ArraySize)从顶级文件传递到组件,但出现错误:

[Synth 8-561] 范围表达式无法解析为常数 [/UnconArray.vhd":39]

我想知道是否有办法做到这一点。另外,如果非约束数组必须定义为常量,那有什么意义呢?

UnconstrainedTest.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity UnconstrainedTest is
  Port ( clk  : in std_logic;
         reset: in std_logic;
         LED0 : out std_logic := '0';
         LED1 : out std_logic := '0'
        );

end UnconstrainedTest;

architecture Behavioral of UnconstrainedTest is

 component UnconArray is
 port( clk_1 : in std_logic; 
          ArraySize : in integer;
          LED_0 : out std_logic
      ); 

 end component;

begin

 A1: UnconArray port map (
                  clk_1 => clk,
                  ArraySize => 12,
                  LED_0 => LED0
                  );

 A2: UnconArray port map (
                  clk_1 => clk,
                  ArraySize => 8,
                  LED_0 => LED1
                  );
                  
end Behavioral;

组件UnconArray.vhd

begin

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity UnconArray is

--  generic (depth : integer := 2);

  Port ( clk_1     : in std_logic;
         ArraySize : in integer;
         LED_0     : out std_logic
        );
end UnconArray;

architecture Behavioral of UnconArray is

 type Array_type is array (integer range <>) of integer;
 signal MyUnconArray : Array_type (0 to ArraySize);
-- type Array_type is array (0 to ArraySize) of integer;
-- signal MyUnconArray : Array_type;

begin

MyUnconArray <= (1, 2, 3); 

    process (clk_1)
      begin
       if rising_edge(clk_1) then   
          if ( MyUnconArray(0) = 1 )then
              LED_0 <= '1';
           else
              LED_0 <= '0';
           end if;
       end if;
    end process;


end Behavioral;

在用 VHDL 编写实际硬件模型时,您必须为数组使用恒定大小。信号就像电路板上的电线 - 您不能动态添加或删除它们。

如果您想使用此代码,则必须使用泛型(这是一个局部常量)来声明向量的大小。您实际上已经在代码中对此进行了注释,但它应该如下所示:

entity UnconArray is
    generic (
        depth : integer := 2
    );
    port ( 
        clk_1 : in std_logic;
        LED_0 : out std_logic
    );
end UnconArray;

architecture Behavioral of UnconArray is

    type Array_type is array (integer range <>) of integer;
    signal MyUnconArray : Array_type (0 to depth);

    ...

然后当你实例化组件时:

A1: UnconArray 
    generic map (
        depth => 2    
    )
    port map (
        clk_1 => clk,
        LED_0 => LED0
    );

但是,如果您不将通用深度设置为 3,您仍然会遇到错误,因为您在分配数据时将其视为固定大小。您也只使用元素 0,因此在综合最小化期间​​将删除数组的其余部分。

无约束数组的要点是您可以在声明信号时设置它们的大小,这可能会减少您需要声明的类型数量。

例如,假设您想在代码中使用 2 个不同的整数数组,其中包含不同数量的元素。您可以声明 2 个不同大小的约束数组类型或 1 个无约束数组。