Индекс массива VHDL вне границы - PullRequest
0 голосов
/ 15 мая 2018

У меня проблема с синтезом моей программы VHDL (конечный автомат);ошибка:

[Synth 8-97] индекс массива 'номер' вне границы

но я почти уверен, что мой индекс никогда не достигнет этого "числа"(точно 255).Кроме того, работает поведенческое моделирование.

Вот часть моего кода (где возникает ошибка):

K := 0;
 while (K < var_col) loop --var_col is set to 24
   if (array_col(K) = '1') then  --the error is here
      tot_col := tot_col + 1 + num_zero;
      num_zero := 0;
   else
      tot_rows := tot_rows;
      if (tot_col > 0) then
         num_zero := num_zero + 1;
      else
         num_zero := 0;
      end if;
   end if;
   K := K + 1;
 end loop

Я объявил массив таким образом

architecture Behavioral of A is
   subtype my_array is std_logic;
   type my_array0 is array (0 to 254) of my_array;
--other signals declaration

begin
state_comb: process(sensitivity list)
    variable array_col : my_array0 := (others => '0');

Какя могу решить свою проблему?

Я использую Vivado 2017.3

1 Ответ

0 голосов
/ 18 мая 2018

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

Сказав это, бывают ситуации, в которых переменные имеют смысл. Например, есть функции, которые можно легко вычислить за несколько итераций, но вы не можете вычислить их в одной строке. В этом случае можно также использовать операторы generate, но это становится менее читабельным. Однако я бы инкапсулировал такой код в функции и использовал сигналы где-либо еще.

В любом случае, после выполнения вашей функции, я получил то же сообщение об ошибке, что и вы. Проблема заключается в том, что инструмент синтеза, по-видимому, не способен выяснить, что диапазон var_col ограничен. Решение простое: сообщите инструменту синтеза, какой диапазон, добавив, например, range 0 to 24 к объявлению переменной. Вот мой код:

library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  use IEEE.NUMERIC_STD.ALL;

entity A is
   port
   (
     ival  : in  std_logic_vector(254 downto 0);
     iters : in  std_logic_vector(4 downto 0);
     oval  : out std_logic_vector(9 downto 0)
   );
end A;

architecture Behavioral of A is
   subtype my_array is std_logic;
   type my_array0 is array (0 to 254) of my_array;

begin
  state_comb: process(ival)
    variable array_col: my_array0 := (others => '0');
    variable K:         integer;
    variable var_col:   integer range 0 to 24;
    variable tot_col:   integer;
    variable num_zero:  integer;
    variable tot_rows:  integer;
  begin
    for i in 0 to 254
    loop
      array_col(i) := ival(i);
    end loop;

    K := 0;
    var_col := to_integer(unsigned(iters));
    while (K < var_col) loop --var_col is set to 24
     if (array_col(K) = '1') then  --the error is here
        tot_col := tot_col + 1 + num_zero;
        num_zero := 0;
     else
        tot_rows := tot_rows;
        if (tot_col > 0) then
           num_zero := num_zero + 1;
        else
           num_zero := 0;
        end if;
     end if;
     K := K + 1;
   end loop;

   oval <= std_logic_vector(to_unsigned(tot_col, 10));
  end process;
end Behavioral;

Кстати, присваивать tot_rows tot_rows не имеет смысла.

Более того, вы утверждаете, что ваш процесс является синхронным, но вы называете его state_comb. Если comb не относится к комбинационному, это не имеет смысла.

...