VHDL数组索引超出范围

时间:2018-05-15 11:48:43

标签: vhdl synthesis vivado

我的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 :(得分:0)

首先,通常不建议使用变量。如果可能的话,用于信号。

话虽如此,有些情况下变量才有意义。例如,有许多函数可以在多次迭代中轻松计算,但您无法在一行中计算它们。在这种情况下,人们也可以使用生成语句,但这会变得不那么可读。但是,我会将这些代码封装到函数中,并在其他地方使用信号。

无论如何,在完成您的功能后,我获得了与您相同的错误消息。问题是合成工具显然无法确定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不是指组合,否则没有意义。