-- See the file "LICENSE" for the full license governing this code. --
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

LIBRARY work;
USE work.lt16soc_peripherals.ALL;

ENTITY scrolling_controller_tb IS
END ENTITY;

ARCHITECTURE sim OF scrolling_controller_tb IS

    constant CLK_PERIOD : time := 10 ns;

    signal rst : std_logic;
    signal clk : std_logic := '0';

    signal on_off : std_logic := '0';
    signal cnt_start : std_logic := '0';
    signal cnt_done : std_logic := '0';
    signal next_char : std_logic := '0';
    signal hex_char : std_logic_vector(4 downto 0) := (others => '0');
    signal seg_data : std_logic_vector(3 downto 0) := (others => '0');
    signal seg_off : std_logic := '0';
    signal seg_shift : std_logic := '0';
    signal seg_write : std_logic := '0';
    signal seg_clear : std_logic := '0';

    component scrolling_controller
        port(
            clk : in std_logic;
            rst : in std_logic;
            on_off : in std_logic;
            cnt_start : out std_logic;
            cnt_done : in std_logic;
            next_char : out std_logic;
            hex_char : in std_logic_vector(4 downto 0);
            seg_data : out std_logic_vector(3 downto 0);
            seg_off : out std_logic;
            seg_shift : out std_logic;
            seg_write : out std_logic;
            seg_clear : out std_logic
        );
    end component;
BEGIN

	controller: scrolling_controller
        port map(
			clk => clk,
            rst => rst,
            on_off => on_off,
            cnt_start => cnt_start,
            cnt_done => cnt_done,
            next_char => next_char,
            hex_char => hex_char,
            seg_data => seg_data,
            seg_off => seg_off,
            seg_shift => seg_shift,
            seg_write => seg_write,
            seg_clear => seg_clear
    );

    clk_gen: process
	begin
		clk	<= not clk;
		wait for CLK_PERIOD/2;
	end process clk_gen;

	stimuli: process
	begin
        rst <= '1';
        wait for CLK_PERIOD;

        rst <= '0';
        wait for CLK_PERIOD;

        hex_char <= "01010";

        wait for CLK_PERIOD * 2;
        on_off <= '1';

        wait for CLK_PERIOD;
        on_off <= '0';

        wait for CLK_PERIOD*3;
        hex_char <= "00101";
        cnt_done <= '1';

        wait for CLK_PERIOD;
        cnt_done <= '0';

        wait for CLK_PERIOD * 3;
        on_off <= '1';
        hex_char <= "01111";

        wait for CLK_PERIOD * 5;

		assert false report "Simulation terminated!" severity failure;
	end process stimuli;

END ARCHITECTURE;
