| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -19,16 +19,17 @@ package SimP is | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																  procedure wait_cycles (signal clk : in std_logic; n : in natural); | 
																 | 
																 | 
																  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; cpha : in  natural range 0 to 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                             period : in    time); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																  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; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                                dir : in    natural range 0 to 1;  cpol : in  natural range 0 to 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                                cpha : in  natural range 0 to 1; period : in  time); | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																  procedure spi_slave (    data_in : in std_logic_vector; data_out : out std_logic_vector; | 
																 | 
																 | 
																  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 sclk : in std_logic;      signal ste : in  std_logic; | 
															
														
														
													
														
															
																 | 
																 | 
																                       signal mosi : in std_logic;     signal miso : out std_logic; | 
																 | 
																 | 
																                       signal mosi : in std_logic;     signal miso : out std_logic; | 
															
														
														
													
														
															
																 | 
																 | 
																                       cpol        : in natural range 0 to 1; cpha : in  natural range 0 to 1); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                               dir : in natural range 0 to 1; cpol : in  natural range 0 to 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                              cpha : in natural range 0 to 1); | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																end package SimP; | 
																 | 
																 | 
																end package SimP; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -51,18 +52,26 @@ package body SimP is | 
															
														
														
													
														
															
																 | 
																 | 
																  procedure spi_master (    data_in : in    std_logic_vector;   data_out : out std_logic_vector; | 
																 | 
																 | 
																  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 sclk : inout std_logic;        signal ste : out std_logic; | 
															
														
														
													
														
															
																 | 
																 | 
																                        signal mosi : out   std_logic;       signal miso : in  std_logic; | 
																 | 
																 | 
																                        signal mosi : out   std_logic;       signal miso : in  std_logic; | 
															
														
														
													
														
															
																 | 
																 | 
																                               cpol : in    natural range 0 to 1;   cpha : in  natural range 0 to 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                             period : in    time) is | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                                dir : in    natural range 0 to 1;   cpol : in  natural range 0 to 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                               cpha : in  natural range 0 to 1;   period : in  time) is | 
															
														
														
													
														
															
																 | 
																 | 
																  begin | 
																 | 
																 | 
																  begin | 
															
														
														
													
														
															
																 | 
																 | 
																    assert_equal(data_in'length, data_out'length, "data_in & data_out must have same length!"); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    assert_equal(data_in'length, data_out'length, spi_master'simple_name & ": data_in & data_out must have same length!"); | 
															
														
														
													
														
															
																 | 
																 | 
																    sclk <= std_logic'val(cpol+2); | 
																 | 
																 | 
																    sclk <= std_logic'val(cpol+2); | 
															
														
														
													
														
															
																 | 
																 | 
																    ste  <= '0'; | 
																 | 
																 | 
																    ste  <= '0'; | 
															
														
														
													
														
															
																 | 
																 | 
																    if (cpha = 0) then | 
																 | 
																 | 
																    if (cpha = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																      for i in data_in'range loop | 
																 | 
																 | 
																      for i in data_in'range loop | 
															
														
														
													
														
															
																 | 
																 | 
																        mosi <= data_in(i); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          mosi <= data_in(data_in'high - i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          mosi <= data_in(i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait for period/2; | 
																 | 
																 | 
																        wait for period/2; | 
															
														
														
													
														
															
																 | 
																 | 
																        sclk <= not(sclk); | 
																 | 
																 | 
																        sclk <= not(sclk); | 
															
														
														
													
														
															
																 | 
																 | 
																        data_out(i) := miso; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(data_out'high - i) := miso; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(i) := miso; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait for period/2; | 
																 | 
																 | 
																        wait for period/2; | 
															
														
														
													
														
															
																 | 
																 | 
																        sclk <= not(sclk); | 
																 | 
																 | 
																        sclk <= not(sclk); | 
															
														
														
													
														
															
																 | 
																 | 
																      end loop; | 
																 | 
																 | 
																      end loop; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -72,10 +81,18 @@ package body SimP is | 
															
														
														
													
														
															
																 | 
																 | 
																      wait for period/2; | 
																 | 
																 | 
																      wait for period/2; | 
															
														
														
													
														
															
																 | 
																 | 
																      for i in data_in'range loop | 
																 | 
																 | 
																      for i in data_in'range loop | 
															
														
														
													
														
															
																 | 
																 | 
																        sclk <= not(sclk); | 
																 | 
																 | 
																        sclk <= not(sclk); | 
															
														
														
													
														
															
																 | 
																 | 
																        mosi <= data_in(i); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          mosi <= data_in(data_in'high - i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          mosi <= data_in(i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait for period/2; | 
																 | 
																 | 
																        wait for period/2; | 
															
														
														
													
														
															
																 | 
																 | 
																        sclk <= not(sclk); | 
																 | 
																 | 
																        sclk <= not(sclk); | 
															
														
														
													
														
															
																 | 
																 | 
																        data_out(i) := miso; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(data_out'high - i) := miso; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(i) := miso; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait for period/2; | 
																 | 
																 | 
																        wait for period/2; | 
															
														
														
													
														
															
																 | 
																 | 
																      end loop; | 
																 | 
																 | 
																      end loop; | 
															
														
														
													
														
															
																 | 
																 | 
																    end if; | 
																 | 
																 | 
																    end if; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -89,25 +106,42 @@ package body SimP is | 
															
														
														
													
														
															
																 | 
																 | 
																  procedure spi_slave (    data_in : in std_logic_vector; data_out : out std_logic_vector; | 
																 | 
																 | 
																  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 sclk : in std_logic;      signal ste : in  std_logic; | 
															
														
														
													
														
															
																 | 
																 | 
																                       signal mosi : in std_logic;     signal miso : out std_logic; | 
																 | 
																 | 
																                       signal mosi : in std_logic;     signal miso : out std_logic; | 
															
														
														
													
														
															
																 | 
																 | 
																                              cpol : in natural range 0 to 1; cpha : in  natural range 0 to 1) is | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    variable v_cpol : std_logic := std_logic'val(cpol+2); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                              dir  : in natural range 0 to 1; cpol : in  natural range 0 to 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                              cpha : in natural range 0 to 1) is | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    variable v_cpol   : std_logic := std_logic'val(cpol+2); | 
															
														
														
													
														
															
																 | 
																 | 
																  begin | 
																 | 
																 | 
																  begin | 
															
														
														
													
														
															
																 | 
																 | 
																    assert_equal(data_in'length, data_out'length, "data_in & data_out must have same length!"); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    assert_equal(data_in'length, data_out'length, spi_slave'simple_name & ": data_in & data_out must have same length!"); | 
															
														
														
													
														
															
																 | 
																 | 
																    miso <= 'Z'; | 
																 | 
																 | 
																    miso <= 'Z'; | 
															
														
														
													
														
															
																 | 
																 | 
																    wait until ste = '0'; | 
																 | 
																 | 
																    wait until ste = '0'; | 
															
														
														
													
														
															
																 | 
																 | 
																    if (cpha = 0) then | 
																 | 
																 | 
																    if (cpha = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																      for i in data_in'range loop | 
																 | 
																 | 
																      for i in data_in'range loop | 
															
														
														
													
														
															
																 | 
																 | 
																        miso <= data_in(i); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          miso <= data_in(data_in'high - i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          miso <= data_in(i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait until sclk'event and sclk = not(v_cpol); | 
																 | 
																 | 
																        wait until sclk'event and sclk = not(v_cpol); | 
															
														
														
													
														
															
																 | 
																 | 
																        data_out(i) := mosi; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(data_out'high - i) := mosi; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(i) := mosi; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait until sclk'event and sclk = v_cpol; | 
																 | 
																 | 
																        wait until sclk'event and sclk = v_cpol; | 
															
														
														
													
														
															
																 | 
																 | 
																      end loop; | 
																 | 
																 | 
																      end loop; | 
															
														
														
													
														
															
																 | 
																 | 
																    else | 
																 | 
																 | 
																    else | 
															
														
														
													
														
															
																 | 
																 | 
																      for i in data_in'range loop | 
																 | 
																 | 
																      for i in data_in'range loop | 
															
														
														
													
														
															
																 | 
																 | 
																        wait until sclk'event and sclk = not(v_cpol); | 
																 | 
																 | 
																        wait until sclk'event and sclk = not(v_cpol); | 
															
														
														
													
														
															
																 | 
																 | 
																        miso <= data_in(i); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          miso <= data_in(data_in'high - i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          miso <= data_in(i); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																        wait until sclk'event and sclk = v_cpol; | 
																 | 
																 | 
																        wait until sclk'event and sclk = v_cpol; | 
															
														
														
													
														
															
																 | 
																 | 
																        data_out(i) := mosi; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (dir = 0) then | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(data_out'high - i) := mosi; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        else | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																          data_out(i) := mosi; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        end if; | 
															
														
														
													
														
															
																 | 
																 | 
																      end loop; | 
																 | 
																 | 
																      end loop; | 
															
														
														
													
														
															
																 | 
																 | 
																    end if; | 
																 | 
																 | 
																    end if; | 
															
														
														
													
														
															
																 | 
																 | 
																    wait until ste = '1'; | 
																 | 
																 | 
																    wait until ste = '1'; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
  |