VHDL - Flip Flop infiriendo en una señal

Tengo que diseñar un circuito para contar hasta un número y volver a cero. Debe tener una señal de acarreo (que nombré a_oen mi circuito) como bandera para mostrar que se ha alcanzado el número máximo del contador. El circuito funciona bien, pero está infiriendo un Flip-Flop en la a_oseñal de que no quiero estar allí. He comprobado todas las razones por las que puede aparecer un flip-flop inesperado pero sigo sin solucionar el problema.

Muchas gracias de antemano

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity ej11 is 

    generic (N : positive := 4;
                M : positive := 10);
    port (
            e_i :   in std_logic;
            nmr_i : in std_logic;
            clk_i   :   in std_logic;
            a_o :   out std_logic;
            q_o :   out std_logic_vector (N-1 downto 0));
end entity ej11;

architecture Comportamiento of ej11 is

    signal aux  :   unsigned (N-1 downto 0);
    signal acarreo : std_logic;

begin
    Cuenta:
    process (clk_i, nmr_i)
    begin
        if nmr_i='0' then
            aux <= (others => '0');
            acarreo <= '0';
        elsif rising_edge (clk_i) then
            if e_i = '1' then
                if aux < M-1 then
                    aux <= aux + 1;
                else
                    aux <= (others => '0');
                end if;

                if aux = M-2 then
                    acarreo <= '1';
                else
                    acarreo <= '0';
                end if;
            end if;
        end if;
    end process Cuenta;
    q_o <= std_logic_vector (aux);
    a_o <= acarreo;
end architecture Comportamiento;

Respuestas (2)

Elimine el acarreo del proceso (su declaración tampoco es necesaria a menos que accarreose lea en otro proceso o declaración concurrente):

architecture Comportamiento of ej11 is

    signal aux  :   unsigned (N-1 downto 0);
    -- signal acarreo : std_logic;

begin
    Cuenta:
    process (clk_i, nmr_i)
    begin
        if nmr_i='0' then
            aux <= (others => '0');
            -- acarreo <= '0';
        elsif rising_edge (clk_i) then
            if e_i = '1' then
                if aux < M-1 then
                    aux <= aux + 1;
                else
                    aux <= (others => '0');
                end if;

                -- if aux = M-2 then
                --    acarreo <= '1';
                -- else
                --    acarreo <= '0';
                -- end if;
            end if;
        end if;
    end process Cuenta;
    q_o <= std_logic_vector (aux);
    -- a_o <= acarreo;
end architecture Comportamiento;

Agregue una asignación concurrente o un nuevo proceso con una asignación a a_o(se muestra una asignación concurrente condicional):

    a_o <= '1' when aux = M-2 else
           '0';

Incluir la asignación al accareointerior de la declaración if es inferir lógica secuencial inferir el flip flop.

Un proceso sería algo como:

Acarreo:
    process (aux)
    begin
        if aux = M-2 then
            a_o <= '1';
        else
            a_o <= '0';
        end if;
    end process Acarreo;

¿Ayuda si agrega una elsecondición correspondiente a la if e_i = '1' thenlínea?

Parece que acarreo (y aux) no están asignados si e_ies 0. Supongo que el flip-flop está asociado con a_0 porque es esencialmente solo una versión amortiguada de acarreo y pueden optimizarse a una sola señal.

Aquello podría funcionar. e_i es una señal de habilitación, si es '0' el contador no debería modificar su valor ni siquiera en un flanco ascendente. ¿Cómo puedo escribir eso? a_o <= a_o no parece lógico.
no trabajé Pongo acarreo y aux a cero cuando e_o es '0' pero el Flip-Flop sigue ahí