VHDL - Flip Flop, das auf ein Signal schlussfolgert

Ich muss eine Schaltung entwerfen, um bis zu einer Zahl zu zählen und zu Null zurückzukehren. Es muss ein Übertragssignal (das ich a_oin meiner Schaltung benannt habe) als Flag haben, um anzuzeigen, dass die maximale Anzahl des Zählers erreicht wurde. Die Schaltung funktioniert gut, aber sie schließt ein Flip-Flop im a_oSignal, dass ich nicht dort sein möchte. Ich habe alle Gründe überprüft, warum ein unerwartetes Flip-Flop auftreten kann, aber ich kann das Problem immer noch nicht lösen.

Vielen Dank im Voraus

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;

Antworten (2)

Entfernen Sie den Übertrag aus dem Prozess (seine Deklaration ist ebenfalls nicht erforderlich, es sei denn, accarreoer wird in einem anderen Prozess oder einer gleichzeitigen Anweisung gelesen):

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;

Fügen Sie entweder eine gleichzeitige Zuweisung oder einen neuen Prozess mit einer Zuweisung an hinzu a_o(bedingte gleichzeitige Zuweisung angezeigt):

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

Das Einschließen der Zuweisung in accareodie if-Anweisung leitet die sequentielle Logik vom Flip-Flop ab.

Ein Prozess würde in etwa so aussehen:

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

Hilft es, wenn Sie elseder if e_i = '1' thenZeile eine entsprechende Bedingung hinzufügen?

Es sieht so aus, als wären acarreo (und aux) nicht zugewiesen, wenn e_i0 ist. Ich nehme an, dass das Flip-Flop mit a_0 verknüpft ist, weil es im Wesentlichen nur eine gepufferte Version von acarreo ist und sie möglicherweise auf ein einzelnes Signal optimiert sind.

Das könnte funktionieren. e_i ist ein Freigabesignal, wenn es '0' ist, sollte der Zähler seinen Wert auch bei einer steigenden Flanke nicht ändern. Wie kann ich das aufschreiben? a_o <= a_o erscheint nicht logisch.
Ich habe nicht gearbeitet. Ich setze acarreo und aux auf Null, wenn e_o '0' ist, aber das Flip-Flop ist immer noch da