Прежде всего, использование переменных обычно не рекомендуется. Если возможно, используйте для сигналов.
Сказав это, бывают ситуации, в которых переменные имеют смысл. Например, есть функции, которые можно легко вычислить за несколько итераций, но вы не можете вычислить их в одной строке. В этом случае можно также использовать операторы 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
не относится к комбинационному, это не имеет смысла.