Advertencia de Inferring Latches en VHDL

0

He intentado muchas maneras pero en vano. Sigue teniendo esta advertencia: inferir el latch para la variable 'count_reg'.

    begin
process (control)
   variable count : std_logic_vector (3 downto 0) := "0000"; 
    begin
        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 process;
    
pregunta Bolo

1 respuesta

1

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 .

    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas