Vhdl: неограниченные массивы и создание экземпляров размера - PullRequest
0 голосов
/ 07 августа 2020

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

[Synth 8-561] выражение диапазона не может быть разрешено в constant [/UnconArray.vhd":39 visible

Мне интересно, есть ли способ сделать это. Кроме того, если неограниченный массив должен быть определен как константа, тогда в чем смысл?

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;

1 Ответ

1 голос
/ 07 августа 2020

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

Если вы хотите использовать этот код, вам придется использовать generi c (который является локальной константой ), чтобы объявить размер вектора. Фактически вы уже прокомментировали это в своем коде, но он должен выглядеть так:

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
    );

Однако, если вы не установите при глубине generi c до 3 вы по-прежнему будете получать ошибки, поскольку при назначении данных вы обрабатываете его как фиксированный размер. Вы также используете только элемент 0, так что остальная часть массива будет удалена во время минимизации синтеза. необходимо объявить.

Например, предположим, что вы хотите использовать в своем коде 2 разных целочисленных массива с разным количеством элементов в них. Вы можете объявить 2 типа ограниченных массивов с разными размерами или 1 неограниченный массив.

...