2023-09-25 18:38:01 +02:00

218 lines
4.1 KiB
VHDL

LIBRARY ieee;
USE ieee.std_logic_1164.all;
-- USE ieee.std_logic_arith.all;
use IEEE.NUMERIC_STD.all;
ENTITY stdlib_tb IS
GENERIC(
CLOCK_PERIOD : time := 10 ns
);
END stdlib_tb;
ARCHITECTURE arch of stdlib_tb IS
SIGNAL CLK : std_logic;
SIGNAL D_FF_D : std_logic;
SIGNAL D_FF_Rst : std_logic;
SIGNAL D_FF_Q : std_logic;
SIGNAL D_FFb_D : std_logic_vector(7 downto 0);
SIGNAL D_FFb_Rst : std_logic;
SIGNAL D_FFb_Q : std_logic_vector(7 downto 0);
SIGNAL SR_D : std_logic;
SIGNAL SR_Rst : std_logic;
SIGNAL SR_Q : std_logic_vector(7 downto 0);
SIGNAL CNT_Rst : std_logic;
SIGNAL CNT_INIT : unsigned(2 downto 0);
SIGNAL CNT_LOAD : std_logic;
SIGNAL CNT_max : std_logic;
COMPONENT D_FF
PORT(
H: IN std_logic;
D: IN std_logic;
nRst: IN std_logic;
Q: OUT std_logic
);
END COMPONENT;
COMPONENT D_FF_BANK
PORT(
H: IN std_logic;
D: IN std_logic_vector;
nRst: IN std_logic;
Q: OUT std_logic_vector
);
END COMPONENT;
COMPONENT shift_register
GENERIC(
WIDTH: integer
);
PORT(
H: IN std_logic;
H_EN: IN std_logic;
nRst : IN std_logic;
D: IN std_logic;
Q: OUT std_logic_vector
);
END COMPONENT;
COMPONENT counter
GENERIC(
WIDTH: integer;
MAX_VAL: integer
);
PORT(
H: IN std_logic;
H_EN: IN std_logic;
nRst: IN std_logic;
INIT: IN unsigned(WIDTH-1 downto 0);
LOAD: IN std_logic;
upnDown: IN std_logic;
val: OUT unsigned(WIDTH-1 downto 0);
max: OUT std_logic
);
END COMPONENT;
BEGIN
CLK_gen : PROCESS
BEGIN
CLK <= '0';
WAIT FOR CLOCK_PERIOD/2;
CLK <= '1';
WAIT FOR CLOCK_PERIOD/2;
END PROCESS CLK_gen;
D_FF_test : PROCESS
BEGIN
D_FF_Rst <= '0';
WAIT UNTIL CLK = '1';
D_FF_Rst <= '1';
D_FF_D <= '1';
WAIT UNTIL CLK = '0';
assert D_FF_Q = '0' report "D_FF set before clk" severity error;
WAIT UNTIL CLK = '0';
assert D_FF_Q = '1' report "D_FF not set" severity error;
D_FF_Rst <= '0';
WAIT UNTIL CLK = '0';
assert D_FF_Q = '0' report "D_FF reset error" severity error;
END PROCESS D_FF_test;
D_FFb_test : PROCESS
BEGIN
D_FFb_Rst <= '0';
WAIT UNTIL CLK = '1';
D_FFb_Rst <= '1';
D_FFb_D <= "01010101";
WAIT UNTIL CLK = '0';
assert D_FFb_Q = "00000000" report "D_FF_bank set before clk" severity error;
WAIT UNTIL CLK = '0';
assert D_FFb_Q = "01010101" report "D_FF_bank not set" severity error;
D_FFb_Rst <= '0';
WAIT UNTIL CLK = '0';
assert D_FFb_Q = "00000000" report "D_FF_bank reset error" severity error;
END PROCESS D_FFb_test;
SR_test : PROCESS
BEGIN
SR_Rst <= '0';
SR_D <= '1';
WAIT UNTIL CLK = '1';
SR_Rst <= '1';
for i in SR_Q'RANGE loop
SR_D <= not SR_D;
WAIT UNTIL CLK = '1';
end loop;
WAIT UNTIL CLK = '1';
assert SR_Q = "01010101" report "shift register wrong output" severity error;
SR_Rst <= '0';
WAIT UNTIL CLK = '0';
assert SR_Q = "00000000" report "shft register reset error" severity error;
END PROCESS SR_test;
CNT_test : PROCESS
BEGIN
CNT_Rst <= '0';
CNT_INIT <= to_unsigned(7, 3);
WAIT UNTIL CLK = '1';
CNT_Rst <= '1';
WAIT UNTIL CLK = '1';
assert CNT_max = '1' report "counter reset error" severity error;
CNT_LOAD <= '1';
WAIT UNTIL CLK = '1';
WAIT UNTIL CLK = '0';
CNT_LOAD <= '0';
WAIT UNTIL CLK = '1';
for i in 6 downto 0 loop
assert CNT_max = '0' report "counter count down error" severity error;
WAIT UNTIL CLK = '1';
end loop;
assert CNT_max = '1' report "counter count down to zero error" severity error;
END PROCESS CNT_test;
U0 : D_FF
PORT MAP (
H => CLK,
D => D_FF_D,
nRst => D_FF_Rst,
Q => D_FF_Q
);
U1 : D_FF_BANK
PORT MAP(
H => CLK,
D => D_FFb_D,
nRst => D_FFb_Rst,
Q => D_FFb_Q
);
U2 : shift_register
GENERIC MAP(
WIDTH => SR_Q'LENGTH
)
PORT MAP(
H => CLK,
H_EN => '1',
nRst => SR_Rst,
D => SR_D,
Q => SR_Q
);
U3 : counter
GENERIC MAP(
WIDTH => 3,
MAX_VAL => 0
)
PORT MAP(
H => CLK,
H_EN => '1',
nRst => CNT_Rst,
INIT => CNT_INIT,
LOAD => CNT_LOAD,
upnDown => '0',
val => OPEN,
max => CNT_max
);
END ARCHITECTURE arch;