VHDL: el biestable flip flop SR

VHDL flip flop SR
VHDL simulando el flip flop SR con GTKWave y GHDL.

Aquí vengo de nuevo con más code-katas, ahora con un flip flop SR. Un flip flop es un biestable, un circuito multivibrador que permanece en dos estados, mientras las señales de entrada no cambian. Se suelen usar mucho en electrónica para almacenar bits.

El flip flop SR es un biestable que con sus dos entradas se pone a 0 o a 1. Con la entrada R se pone a cero, y con la S a 1. Simple y llanamente este es el funcionamiento. Si recibe tanto R como S a cero, entonces permanece en el estado que tenga. Y si recibe R y S a 1, está prohibido, con lo que entra en un estado inestable.

Más información sobre los biestables aquí:
https://es.wikipedia.org/wiki/Biestable

El código fuente del flip flop SR

library IEEE;
use IEEE.std_logic_1164.all;

entity flipFlopSR is
    port (
        status, notStatus : out std_logic;
        clock, s, r : in std_logic
    );
end entity;

architecture arch_flipFlopSR of flipFlopSR is

    signal internalQ : std_logic;
    signal internalSR : std_logic_vector (1 downto 0);

begin

    status <= internalQ;
    notStatus <= not internalQ;

    main_process : process (clock)
    begin

        internalSR <= s & r;
        if rising_edge (clock) then
            report "Procesando tic tac.. clock=" & std_logic'image(clock);
            report "    s=" & std_logic'image(s);
            report "    r=" & std_logic'image(r);

            if internalSR = "00" then
                --internalQ <= internalQ;
            elsif internalSR = "01" then
                internalQ <= '0';
            elsif internalSR = "10" then
                internalQ <= '1';
            else -- internalSR is "11"
                -- Esto no está permitido, queda en estado inestable.
                internalQ <= 'Z';
            end if;
        end if;

    end process;

end architecture;

El código fuente del banco de pruebas del flip flop SR

library IEEE;
use IEEE.std_logic_1164.all;

entity flipFlopSR_tb is
end entity;

architecture arch_flipFlopSR_tb of flipFlopSR_tb is

    component flipFlopSR is
        port (
            status, notStatus : out std_logic;
            clock, s, r : in std_logic
        );
    end component;

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

begin

    testing_unit: flipFlopSR port map (
        status => testStatus,
        notStatus => testNotStatus,
        clock => testClock,
        s => testS,
        r => testR
    );

    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;

        -- Reset inicial
        testS <= '0'; testR <= '1'; wait for 20 ns;

        testS <= '0'; testR <= '0'; wait for 20 ns;
        testS <= '0'; testR <= '1'; wait for 20 ns;
        testS <= '1'; testR <= '0'; wait for 20 ns;
        --testS <= '1'; testR <= '1'; wait for 20 ns;

        testS <= '0'; testR <= '0'; wait for 20 ns;
        testS <= '0'; testR <= '1'; wait for 20 ns;
        testS <= '1'; testR <= '0'; wait for 20 ns;
        --testS <= '1'; testR <= '1'; wait for 20 ns;

        testS <= '0'; testR <= '0'; wait for 20 ns;
        testS <= '0'; testR <= '1'; wait for 20 ns;
        testS <= '1'; testR <= '0'; wait for 20 ns;
        --testS <= '1'; testR <= '1'; wait for 20 ns;
        wait;

    end process;

end architecture;
Compartir..

Dejar un comentario

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