|
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;
|
|
|