repo2/mist_5200/tb_data/data_io_tb.vhd
177 | markw | 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;
|