我的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
答案 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
不是指组合,否则没有意义。