library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; use ieee.std_logic_textio.all; library std_developerskit ; -- used for to_string -- use std_developerskit.std_iopak.all; entity data_io_tb is end; architecture rtl of data_io_tb is constant CLK_A_PERIOD : time := 1 us / (1.79*32); signal CLK_A : std_logic; signal reset_n : std_logic; signal spi_clk : std_logic; signal spi_ss_io : std_logic_vector(1 downto 0); signal spi_miso : std_logic; signal spi_mosi : std_logic; signal request : std_logic; signal write : std_logic; signal ready : std_logic; signal sector : std_logic_vector(23 downto 0); signal addr : std_logic_vector(8 downto 0); signal data_out : std_logic_vector(7 downto 0); signal data_in : std_logic_vector(7 downto 0); signal wr_en : std_logic; signal spi_enable : std_logic; signal spi_tx_data : std_logic_vector(7 downto 0); signal spi_rx_data : std_logic_vector(7 downto 0); signal spi_busy : std_logic; signal spi_addr : integer; begin p_clk_gen_a : process begin clk_a <= '1'; wait for CLK_A_PERIOD/2; clk_a <= '0'; wait for CLK_A_PERIOD - (CLK_A_PERIOD/2 ); end process; reset_n <= '0', '1' after 1000ns; spi_master1 : entity work.spi_master generic map(slaves=>2,d_width=>8) port map (clock=>clk_a,reset_n=>reset_n,enable=>spi_enable,cpol=>'0',cpha=>'0',cont=>'0',clk_div=>4,addr=>spi_addr, tx_data=>spi_tx_data, miso=>spi_miso,sclk=>spi_clk,ss_n=>spi_ss_io,mosi=>spi_mosi, rx_data=>spi_rx_data,busy=>spi_busy); spi_fake : process variable type_conv : std_logic_vector(8 downto 0); begin spi_enable <= '0'; spi_addr <= 0; wait for 1500us; spi_tx_data <= x"50"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; for i in 0 to 3 loop spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; end loop; spi_addr <= 1; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; spi_addr <= 0; wait for 20us; spi_tx_data <= x"51"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; for i in 0 to 511 loop type_conv := std_logic_vector(to_unsigned(i,9)); spi_tx_data <= type_conv(7 downto 0); spi_enable <= '1'; wait for CLK_A_PERIOD*4; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; end loop; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; -- NEXT spi_addr <= 1; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; spi_addr <= 0; wait for 20us; spi_tx_data <= x"50"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; for i in 0 to 3 loop spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; end loop; spi_addr <= 1; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; spi_addr <= 0; wait for 20us; spi_tx_data <= x"51"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; for i in 0 to 511 loop type_conv := std_logic_vector(to_unsigned(511-i,9)); spi_tx_data <= type_conv(7 downto 0); spi_enable <= '1'; wait for CLK_A_PERIOD*4; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; end loop; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; -- NEXT - WRITE... spi_addr <= 1; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; spi_addr <= 0; wait for 20us; spi_tx_data <= x"50"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; for i in 0 to 3 loop spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; end loop; spi_addr <= 1; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; spi_addr <= 0; wait for 20us; spi_tx_data <= x"52"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; for i in 0 to 511 loop spi_tx_data <= x"FF"; spi_enable <= '1'; wait for CLK_A_PERIOD*4; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; end loop; spi_tx_data <= x"ff"; spi_enable <= '1'; wait for CLK_A_PERIOD*2; spi_tx_data <= x"FF"; spi_enable <= '0'; wait until spi_busy='0'; wait for 100ms; end process; spi_request : process begin sector <= (others=>'0'); request <= '0'; write <= '0'; wait for 1500us; sector <= x"123456"; request <= '1'; wait until ready = '1'; request <= '0'; wait for CLK_A_PERIOD*20; wait until ready = '0'; sector <= x"654321"; request <= '1'; wait until ready = '1'; request <= '0'; wait for CLK_A_PERIOD*20; wait until ready = '0'; sector <= x"111111"; write <= '1'; wait until ready = '1'; write <= '0'; wait for CLK_A_PERIOD*20; wait until ready = '0'; wait for 100ms; end process; ram : entity work.generic_ram_infer generic map ( ADDRESS_WIDTH => 9, SPACE => 512, DATA_WIDTH => 8 ) PORT map ( clock => spi_clk, data => data_out, address => addr, we => wr_en, q => data_in ); data_io : entity work.data_io PORT MAP ( CLK => spi_clk, RESET_n =>reset_n, -- SPI connection - up to upstream to make miso 'Z' on ss_io going high SPI_CLK => spi_clk, SPI_SS_IO => spi_ss_io(0), SPI_MISO => spi_miso, SPI_MOSI => spi_mosi, -- Sector access request read_request => request, write_request => write, sector => sector, ready => ready, -- DMA to RAM ADDR => addr, DATA_OUT => data_out, DATA_IN => data_in, WR_EN => wr_en ); end rtl;