Como otros lo han señalado en los comentarios, debe usar un proceso síncrono (cronometrado) para un contador. El hecho de que su mensaje haga referencia a count_reg
me lleva a creer que no ha incluido todo el código relevante.
Cualquier proceso asíncrono como el descrito por su código deducirá un bloqueo para una señal que no tiene una asignación en cada rama de ese proceso. En su ejemplo, la señal count
no está asignada en la segunda rama ( elsif control = "000" ...
).
En algunos casos, puede haber solo una rama que asigne un valor distinto de 'no confirmado', generalmente '0'
. En estos casos, en lugar de abarrotar cada rama con asignaciones a '0'
, puede realizar esta asignación al inicio del proceso (antes del primer if
), que servirá como "predeterminado", a menos que se contradiga en uno de las ramas.
El proceso de tu contador debería tener un aspecto más convencional:
process (clk)
variable count : std_logic_vector (3 downto 0) := (others => '0');
begin
if (rising_edge(clk)) then
if control = "001" or control = "010" then
address <= count;
count := count + "0001";
elsif control = "000" or control = "011" then
address <= count;
--count := count;
else
count := (others => '0');
address <= count;
end if;
end if;
end process;
También está claro que está utilizando el paquete std_logic_arith
. Este paquete no estándar no debe utilizarse. En su lugar, use numeric_std
y declare que su count
tenga el tipo unsigned
.