library ieee;
use ieee.std_logic_1164.all;
library spi;
library vunit_lib;
context vunit_lib.vunit_context;
entity tb_spi_transmit is
generic (
runner_cfg : string);
end entity tb_spi_transmit;
architecture a1 of tb_spi_transmit is
signal clk : std_logic := '0';
signal rst : std_logic := '0';
signal transmit_data : std_logic_vector(7 downto 0);
signal transmit_pulse : std_logic;
signal ready : std_logic;
signal transmitting : std_logic;
signal mosi : std_logic;
begin -- architecture a1
uut: entity spi.spi_transmit
generic map (
WIDTH => 8)
port map (
clk_i => clk,
rst_in => rst,
transmit_data_i => transmit_data,
transmit_i => transmit_pulse,
ready_o => ready,
transmitting_o => transmitting,
transmit_bit_o => mosi);
clk <= not clk after 1 ns;
rst <= '1' after 6 ns;
main: process is
begin -- process
wait until rst = '1';
test_runner_setup(runner, runner_cfg);
while test_suite loop
if run("transmit_one_byte") then
wait until falling_edge(clk);
check_equal(ready, '1');
transmit_pulse <= '1';
transmit_data <= "11100010";
wait until falling_edge(clk);
transmit_pulse <= '0';
for i in 0 to 2 loop
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
end loop; -- i
for i in 0 to 2 loop
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '0');
wait until falling_edge(clk);
end loop; -- i
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '0');
wait until falling_edge(clk);
check_equal(ready, '1');
check_equal(transmitting, '0');
elsif run("transmit_more_bytes") then
wait until falling_edge(clk);
check_equal(ready, '1');
transmit_pulse <= '1';
transmit_data <= "11100010";
wait until falling_edge(clk);
check_equal(ready, '1');
transmit_pulse <= '1';
transmit_data <= "00011101";
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
check_equal(ready, '0');
transmit_pulse <= '0';
for i in 0 to 1 loop
check_equal(ready, '0');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
end loop; -- i
for i in 0 to 2 loop
check_equal(ready, '0');
check_equal(transmitting, '1');
check_equal(mosi, '0');
wait until falling_edge(clk);
end loop; -- i
check_equal(ready, '0');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
check_equal(ready, '0');
check_equal(transmitting, '1');
check_equal(mosi, '0');
wait until falling_edge(clk);
-- starting to send second byte
for i in 0 to 2 loop
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '0');
wait until falling_edge(clk);
end loop; -- i
for i in 0 to 2 loop
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
end loop; -- i
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '0');
wait until falling_edge(clk);
check_equal(ready, '1');
check_equal(transmitting, '1');
check_equal(mosi, '1');
wait until falling_edge(clk);
check_equal(ready, '1');
check_equal(transmitting, '0');
wait until falling_edge(clk);
check_equal(ready, '1');
check_equal(transmitting, '0');
end if;
end loop;
test_runner_cleanup(runner);
end process;
end architecture a1;