VHDL: registro sencillo de 8 bits

VHDL registro sencillo de 8 bits.

Traigo de nuevo otro code-kata, ahora se trata de un registro sencillo. Los registros son circuitos sencillos, en donde se depositan ciertos valores de un dado número de bits, al son del tic tac del reloj. Se usan para direccionar la memoria, llevar la cuenta de dónde está un programa ejecutándose, almacenar un valor, y un largo etcétera.

Es decir, es un circuito sencillo en donde simplemente se le deja poner un valor de entrada, que a la vez se puede resetear.

Al grano, el código de un sencillo registro de 8 bits

Simplemente muestra el valor de entrada en la salida, o si está la señal de reset se pone a cero, al son del tic tac del reloj:

library IEEE;
use IEEE.std_logic_1164.all;

entity eightBitsRegister is
    port (
        valueOut : out std_logic_vector (7 downto 0);
        valueIn : in std_logic_vector (7 downto 0);
        reset, clock : in std_logic
    );
end entity;

architecture arch_eightBitsRegister of eightBitsRegister is
begin

    identifier : process (clock)
    begin
        if (rising_edge(clock)) then
            if reset = '1' then
                valueOut <= "00000000"; 
            else
                valueOut <= valueIn;
            end if;
        end if;
    end process;

end architecture;

El banco de pruebas del registro de 8 bits

Simplemente, unas pocas pruebas para simularlo:

library IEEE;
use IEEE.std_logic_1164.all;

entity eightBitsRegister_tb is
end entity;

architecture arch_eightBitsRegister_tb of eightBitsRegister_tb is

    component eightBitsRegister is
        port (
            valueOut : out std_logic_vector (7 downto 0);
            valueIn : in std_logic_vector (7 downto 0);
            reset, clock : in std_logic
        );
    end component;

    signal testReset, testClock : std_logic := '0';
    signal testValueOut, testValueIn : std_logic_vector (7 downto 0);
    signal tics : integer := 0;

begin

    testing_unit: eightBitsRegister port map (
        valueOut => testValueOut,
        valueIn => testValueIn,
        reset => testReset,
        clock => testClock
    );

    generate_100Mhzs_clock : process
    begin

        report "Tic tac..";
        testClock <= not testClock;
        wait for 5 ns; -- Tiempo de espera en un flanco de reloj.

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

    end process;

    generate_signals : process
    begin

        wait for 5 ns;
        testReset <= '1'; wait for 10 ns;
        testReset <= '0'; wait for 10 ns;

        testValueIn <= "00000101"; wait for 10 ns;
        testValueIn <= "00000110"; wait for 10 ns;
        testValueIn <= "00000111"; wait for 10 ns;

        testReset <= '1'; wait for 10 ns;
        testReset <= '0'; wait for 10 ns;

        wait;

    end process;

end architecture;

Si todo ha ido bien, se tiene que mostrar una imagen como la del principio.

Compartir..

Dejar un comentario

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