222 lines
4.1 KiB
VHDL
222 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;
|
|
H_EN: 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;
|
|
H_EN: 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,
|
|
H_EN => '1',
|
|
D => D_FF_D,
|
|
nRst => D_FF_Rst,
|
|
Q => D_FF_Q
|
|
);
|
|
|
|
U1 : D_FF_BANK
|
|
PORT MAP(
|
|
H => CLK,
|
|
H_EN => '1',
|
|
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; |