library ieee;
							 | 
						|
								  use ieee.std_logic_1164.all;
							 | 
						|
								  --use ieee.numeric_std.all;
							 | 
						|
								
							 | 
						|
								library libvhdl;
							 | 
						|
								  use libvhdl.AssertP.all;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								package SimP is
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  procedure wait_cycles (signal clk : in std_logic; n : in natural);
							 | 
						|
								
							 | 
						|
								  procedure spi_master  (data_in : in std_logic_vector; data_out : out std_logic_vector;
							 | 
						|
								                         signal sclk : inout std_logic; signal ste : out std_logic;
							 | 
						|
								                         signal mosi : out std_logic; signal miso : in std_logic;
							 | 
						|
								                         cpol : in natural range 0 to 1; period : in time);
							 | 
						|
								
							 | 
						|
								  procedure spi_slave (data_in : in std_logic_vector; data_out : out std_logic_vector;
							 | 
						|
								                       signal sclk : in std_logic; signal ste : in std_logic;
							 | 
						|
								                       signal mosi : in std_logic; signal miso : out std_logic;
							 | 
						|
								                       cpol : in natural range 0 to 1);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								end package SimP;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								package body SimP is
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  -- wait for n rising egdes on clk
							 | 
						|
								  procedure wait_cycles (signal clk : in std_logic; n : in natural) is
							 | 
						|
								  begin
							 | 
						|
								    for i in 1 to n loop
							 | 
						|
								      wait until rising_edge(clk);
							 | 
						|
								    end loop;
							 | 
						|
								  end procedure wait_cycles;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  procedure spi_master (    data_in : in    std_logic_vector;   data_out : out std_logic_vector;
							 | 
						|
								                        signal sclk : inout std_logic;        signal ste : out std_logic;
							 | 
						|
								                        signal mosi : out   std_logic;       signal miso : in  std_logic;
							 | 
						|
								                               cpol : in    natural range 0 to 1; period : in  time) is
							 | 
						|
								  begin
							 | 
						|
								    assert_equal(data_in'length, data_out'length, "data_in & data_out must have same length!");
							 | 
						|
								    sclk <= std_logic'val(cpol+2);
							 | 
						|
								    ste  <= '0';
							 | 
						|
								    mosi <= '1';
							 | 
						|
								    wait for period;
							 | 
						|
								    for i in data_in'range loop
							 | 
						|
								      sclk <= not(sclk);
							 | 
						|
								      mosi <= data_in(i);
							 | 
						|
								      wait for period;
							 | 
						|
								      sclk <= not(sclk);
							 | 
						|
								      data_out(i) := miso;
							 | 
						|
								      wait for period;
							 | 
						|
								    end loop;
							 | 
						|
								    ste  <= '1';
							 | 
						|
								    mosi <= '1';
							 | 
						|
								    wait for period;
							 | 
						|
								  end procedure spi_master;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  procedure spi_slave (    data_in : in std_logic_vector; data_out : out std_logic_vector;
							 | 
						|
								                       signal sclk : in std_logic;      signal ste : in  std_logic;
							 | 
						|
								                       signal mosi : in std_logic;     signal miso : out std_logic;
							 | 
						|
								                              cpol : in natural range 0 to 1) is
							 | 
						|
								    variable v_cpol : std_logic := std_logic'val(cpol+2);
							 | 
						|
								  begin
							 | 
						|
								    assert_equal(data_in'length, data_out'length, "data_in & data_out must have same length!");
							 | 
						|
								    miso <= 'Z';
							 | 
						|
								    wait until ste = '0';
							 | 
						|
								    for i in data_in'range loop
							 | 
						|
								      wait until sclk'event and sclk = not(v_cpol);
							 | 
						|
								      miso <= data_in(i);
							 | 
						|
								      wait until sclk'event and sclk = v_cpol;
							 | 
						|
								      data_out(i) := mosi;
							 | 
						|
								    end loop;
							 | 
						|
								    wait until ste = '1';
							 | 
						|
								    miso <= 'Z';
							 | 
						|
								  end procedure spi_slave;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								end package body SimP;
							 |