VHDL - Flip Flop inferiendo una señal

3

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_o en mi circuito) como indicador para mostrar que se ha alcanzado el número máximo de contador. El circuito funciona bien, pero está inferiendo un Flip-Flop en la señal a_o de que no quiero estar allí. He comprobado todas las razones por las que puede aparecer un flip-flop inesperado pero todavía no puedo resolver 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;
    
pregunta cventu

2 respuestas

3

Elimine el acarreo del proceso (su declaración también es innecesaria a menos que se lea accarreo 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 simultánea o un nuevo proceso con una asignación a a_o (se muestra la asignación concurrente condicional):

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

Al incluir la asignación a accareo dentro de la instrucción if, se infiere lógica secuencial deducida el flip flop.

Un proceso se vería algo así como:

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

¿Ayuda si agrega una condición else correspondiente a la línea if e_i = '1' then ?

Parece que el acarreo (y aux) no se asignan si e_i es 0. Supongo que el flip-flop está asociado con a_0 porque es esencialmente una versión del acarreo con amortiguador y pueden optimizarse para una sola señal .

    
respondido por el Justin

Lea otras preguntas en las etiquetas