Quiero que mi componente reciba datos y los almacene en una matriz, solo si aún no está en la matriz. Debería ser simple ¿verdad?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity repetition is
port(
data_in: in unsigned(6 downto 0);
start : in std_logic;
output : out unsigned(6 downto 0));
end entity;
architecture arh of repetition is
signal i: integer := 0;
type niz is array (6 downto 0) of unsigned(6 downto 0);
signal niz1: niz;
signal repeat: std_logic := '0';
begin
process(start, repeat)
variable ind : std_logic := '0';
begin
if( to_integer(data_in) < 100) then
if (start='0' or repeat = '1') then
for j in 0 to 6 loop
if(j<i) then
if(data_in = niz1(j)) then
ind := '1';
end if;
end if;
end loop;
if (ind = '0') then
niz1(i)<=data_in;
i<=i+1;
output<=data_in;
repeat <= '0';
else
repeat <= '1';
end if;
end if;
end if;
end process;
end arh;
i es un número entero que nos dice cuánto hemos avanzado en una matriz (de longitud 7), repetir está en la lista de sensibilidad del proceso, que se utiliza para reiniciar procesar si un elemento ya está presente en la matriz y salida genera la entrada única más nueva. Cuando ejecuto esto, salida es todo 0s.
Lo que es realmente interesante es si pongo if (ind = '1'), toma la rama siempre, es decir, creo que es de alguna manera una actualización anticipada de i y de array , antes de que finalice el bucle, por lo que siempre encuentra que los datos que verifica están en el array.
¿Cómo corrijo esto?