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.

82 lines
2.9 KiB

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- Testbenches do not have ports.
entity uart_tx_tb is
end uart_tx_tb;
architecture uart_tx_tb_rtl of uart_tx_tb is
-- 10 MHz clock
constant c_CLK_PERIOD : time := 100 ns;
--Declaration of component we will instantiate.
component uart_tx
port (
i_clk_baudrate : in std_logic;
i_reset_n : in std_logic;
i_tx_send : in std_logic;
i_msb_first : in std_logic;
i_tx_data_vec : in std_logic_vector(7 downto 0);
o_tx_pin : out std_logic;
o_tx_sent : out std_logic
);
end component;
-- Which entity is bound with the component.
for uart_tx_0: uart_tx use entity work.uart_tx;
-- Signals for test stimuli.
signal tb_i_clk_baudrate : std_logic := '0';
signal tb_i_reset_n : std_logic := '0';
signal tb_i_tx_send : std_logic := '0';
signal tb_i_msb_first : std_logic := '0';
signal tb_i_tx_data_vec : std_logic_vector(7 downto 0) := x"00";
signal tb_o_tx_pin : std_logic := '0';
signal tb_o_tx_sent : std_logic := '0';
signal tb_done : std_logic := '0';
begin
-- Instatiating component.
uart_tx_0: uart_tx port map (
i_clk_baudrate => tb_i_clk_baudrate,
i_reset_n => tb_i_reset_n,
i_tx_send => tb_i_tx_send,
i_msb_first => tb_i_msb_first,
i_tx_data_vec => tb_i_tx_data_vec,
o_tx_pin => tb_o_tx_pin,
o_tx_sent => tb_o_tx_sent
);
-- Generate clock.
p_clock : process is
begin
if (tb_done = '0') then
tb_i_clk_baudrate <= '0';
wait for c_CLK_PERIOD/2;
tb_i_clk_baudrate <= '1';
wait for c_CLK_PERIOD/2;
elsif tb_done = '1' then
wait;
end if;
end process p_clock;
-- Generate further testing stimuli in addition.
p_stimuli : process is
type vector_array_t is array (0 to 3) of std_logic_vector(7 downto 0);
constant nice_words : vector_array_t := (x"BE", x"EF", x"BA", x"BE");
begin
-- Reset transmitter.
tb_i_reset_n <= '0';
wait for c_CLK_PERIOD;
tb_i_reset_n <= '1';
for sanny in nice_words'range loop
-- Feed with data and tell transmitter to send.
tb_i_tx_data_vec <= nice_words(sanny);
tb_i_msb_first <= not tb_i_msb_first;
tb_i_tx_send <= '1';
-- Wait until transmitted then finish simulation.
wait until tb_o_tx_sent = '1';
tb_i_tx_send <= '0';
wait for c_CLK_PERIOD*1.5;
end loop;
tb_done <= '1';
assert false report "end of test" severity note;
wait;
-- Wait forever, which will finish the simulation.
end process p_stimuli;
end uart_tx_tb_rtl;