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.