You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.5 KiB

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity string_sender_tb is
end string_sender_tb;
architecture string_sender_tb_rtl of string_sender_tb is
-- 10 MHz clock
constant c_CLK_PERIOD : time := 100 ns;
signal tb_i_clk : std_logic := '0';
signal tb_i_send_clk : std_logic := '0';
signal tb_i_sent : std_logic := '1';
signal tb_i_reset_n : std_logic := '1';
signal tb_o_send : std_logic := '0';
signal tb_o_char : std_logic_vector(7 downto 0) := (others => '0');
signal tb_done : std_logic := '0';
begin
string_send_0: entity work.string_sender(string_sender_rtl)
port map (
i_clk => tb_i_clk,
i_send_clk => tb_i_send_clk,
i_sent => tb_i_sent,
i_reset_n => tb_i_reset_n,
o_send => tb_o_send,
o_char => tb_o_char
);
-- Generate clock.
p_clock : process is
begin
if (tb_done = '0') then
tb_i_clk <= '0';
wait for c_CLK_PERIOD/2;
tb_i_clk <= '1';
wait for c_CLK_PERIOD/2;
elsif tb_done = '1' then
wait;
end if;
end process p_clock;
-- Generate send clock.
p_sclock : process is
begin
if (tb_done = '0') then
tb_i_send_clk <= '0';
wait for 100 us;
tb_i_send_clk <= '1';
wait for 100 us;
elsif tb_done = '1' then
wait;
end if;
end process p_sclock;
-- Process for stimuli.
p_stimuli : process is
begin
tb_i_reset_n <= '0';
wait for 2*c_CLK_PERIOD;
tb_i_reset_n <= '1';
wait for 1 ms;
tb_done <= '1';
assert false report "end of test" severity note;
wait;
end process p_stimuli;
p_ssp: process(tb_i_clk)
type z_ssp_t is (
idle,
busy,
sending
);
variable v_cnt : integer range 0 to 20 := 0;
variable z_ssp : z_ssp_t := idle;
begin
if rising_edge(tb_i_clk) then
case z_ssp is
when idle =>
if tb_o_send = '1' then
v_cnt := 0;
tb_i_sent <= '1';
z_ssp := busy;
end if;
when busy =>
if v_cnt = 10 then
v_cnt := 0;
tb_i_sent <= '0';
z_ssp := sending;
else
v_cnt := v_cnt + 1;
end if;
when sending =>
if v_cnt = 20 then
v_cnt := 0;
tb_i_sent <= '1';
z_ssp := idle;
else
v_cnt := v_cnt + 1;
end if;
end case;
end if;
end process p_ssp;
end;