VHDL: el biestable flip flop T

VHDL simulando el flip flop T con GTKWave y Ghdl.

El flip flop T, es el biestable Toggle, que cambia en inglés. Este es un code-kata con el código fuente en VHDL de este biestable. Simplemente es un dispositivo que almacena memoria de un estado.

Recibe 2 entradas, una señal de reloj, y la entrada T. Entonces, simplemente si la señal T está activa a 1, entonces con el tic tac del reloj va cambiando las salidas. En las salidas sólo tiene 2 pines, que son el estado actual, y el estado actual negado.

Este es otro de los biestables de la familia ampliamente utilizados en electrónica para almacenar en memoria cierta información: el flip flop SR, el T, el D o el JK son los más conocidos. Al grano..

El código fuente del flip flop T

library IEEE;
use IEEE.std_logic_1164.all;

entity flipFlopT is
    port (
        status, notStatus : out std_logic;
        clock, t : in std_logic
    );
end entity;

architecture arch_flipFlopT of flipFlopT is

    signal internalQ : std_logic;

begin

    status <= internalQ;
    notStatus <= not internalQ;

    main_process : process (clock)
    begin

        if rising_edge (clock) then
            report "Procesando tic tac.. clock=" & std_logic'image(clock);
            report "    t=" & std_logic'image(t);

            if internalQ = 'U' then
                internalQ <= t;
            else
                if t = '1' then
                    internalQ <= not internalQ;
                else
                    internalQ <= internalQ;
                end if;
            end if;
        end if;

        report "    internalQ=" & std_logic'image(internalQ);

    end process;

end architecture;

El código fuente del banco de pruebas para el flip flop T

library IEEE;
use IEEE.std_logic_1164.all;

entity flipFlopT_tb is
end entity;

architecture arch_flipFlopT_tb of flipFlopT_tb is

    component flipFlopT is
        port (
            status, notStatus : out std_logic;
            clock, t : in std_logic
        );
    end component;

    signal testStatus, testNotStatus, testT : std_logic;
    signal testClock : std_logic := '0';
    signal tics : integer := 0;

begin

    testing_unit: flipFlopT port map (
        status => testStatus,
        notStatus => testNotStatus,
        clock => testClock,
        t => testT
    );

    generate_100Mhzs_clock : process
    begin

        report "Tic tac.. testClock=" & std_logic'image(testClock);
        testClock <= not testClock;

        if testClock = '1' then tics <= tics + 1; end if;
        if tics >= 20 then wait; end if;

        wait for 5 ns; -- Tiempo de espera en un flanco de reloj.

    end process;

    main_process : process
    begin

        wait for 15 ns;
        testT <= '0'; wait for 20 ns;
        testT <= '1'; wait for 30 ns;
        testT <= '0'; wait for 20 ns;
        testT <= '1'; wait for 30 ns;
        testT <= '0'; 
        wait;

    end process;

end architecture;

Si todo va bien, al simularlo tiene que verse un gráfico como el del principo del post.

Compartir..

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *