diff options
author | UnavailableDev <69792062+UnavailableDev@users.noreply.github.com> | 2023-03-10 14:01:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-10 14:01:32 +0100 |
commit | 6d82f9e3d165e0200bed2f2784a1183f47b37fa3 (patch) | |
tree | a8ce1dbdc5c29fb7001b71f1bc5003055d303fa0 /basys3/basys3.srcs/top.vhd | |
parent | 586aded2dddf2e6101d2709e42bceccadb50e8a1 (diff) | |
parent | c37397234534e9888dfeed9b1728c46646c33b58 (diff) |
Merge branch 'lonkaars:dev' into dev
Diffstat (limited to 'basys3/basys3.srcs/top.vhd')
-rw-r--r-- | basys3/basys3.srcs/top.vhd | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/basys3/basys3.srcs/top.vhd b/basys3/basys3.srcs/top.vhd new file mode 100644 index 0000000..7cf3e63 --- /dev/null +++ b/basys3/basys3.srcs/top.vhd @@ -0,0 +1,105 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 15.02.2023 21:09:16 +-- Design Name: +-- Module Name: top - Behavioral +-- Project Name: +-- Target Devices: +-- Tool Versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +-- Uncomment the following library declaration if using +-- arithmetic functions with Signed or Unsigned values +use IEEE.NUMERIC_STD.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; +-- Uncomment the following library declaration if instantiating +-- any Xilinx leaf cells in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity spiSlave is + Port ( clkBoard : in std_logic; -- clock basys3 100MHz + clkSPI : in std_logic; -- incoming clock of SPI + dataSPI : in std_logic; -- incoming data of SPI + csSPI : in std_logic; -- incoming select of SPI + dataRead : out std_logic_vector(23 downto 0) := (others => '0') -- data read + + ); +end spiSlave; + +architecture Behavioral of spiSlave is + signal PulseFF0,PulseFF1,PulseFF2,PulseFF3 : std_logic := '0'; -- signal for metastability synchronizer of clk SPI + signal dataFF0,dataFF1,dataFF2,dataFF3 : std_logic := '0'; -- signal for metastability synchronizer of data SPI + signal ssFF0,ssFF1,ssFF2,ssFF3 : std_logic := '0'; -- signal for metastability synchronizer of slave select SPI + + signal data : std_logic_vector(23 downto 0) := (others => '0'); -- signal to store incomming data of dataSPI (2x 8bit) + signal counter : integer := 23; --counter for data position + signal enable : std_logic := '0'; -- enable signal if slave is selected +begin + + process (clkBoard) + begin + + if rising_edge(clkBoard) then + -- flip flop for clk SPI to synchronise a + PulseFF0 <= clkSPI; + PulseFF1 <= PulseFF0; + PulseFF2 <= PulseFF1; + PulseFF3 <= PulseFF2; + -- flip flop for data SPI to synchronise + dataFF0 <= dataSPI; + dataFF1 <= dataFF0; + dataFF2 <= dataFF1; + dataFF3 <= dataFF2; + -- flip flop for slave select SPI to synchronise + ssFF0 <= csSPI; + ssFF1 <= ssFF0; + ssFF2 <= ssFF1; + ssFF3 <= ssFF2; + -- check if slave select signal has falling edge (slave is selected by master) + if(ssFF3 = '1' and ssFF2 = '0') then + --reset counter if true + counter <= 23; + --disable data read if rising edge (slave is not selected) + elsif (ssFF3 = '0' and ssFF2 = '1') then + enable <= '0'; + end if; + --check if synchronised slave select signal is falling edge or data read is enabled + if(ssFF3 = '1' and ssFF2 = '0') or enable = '1' then + enable <= '1'; --enable data read + if (PulseFF3 = '0' and PulseFF2 = '1') then -- check for rising edge of clk SPI + if counter > -1 then + counter <= counter - 1; + -- data transfer into vector + data(counter) <= dataFF3; + end if; + end if; + --check if counter is done + if counter = -1 then + counter <= 23; --reset counter + dataRead <= data; + end if; + elsif (enable = '0') then + --dataRead <= data; + + end if; + + end if; + + end process; + +end Behavioral; |