aboutsummaryrefslogtreecommitdiff
path: root/basys3/basys3.srcs/spi.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'basys3/basys3.srcs/spi.vhd')
-rw-r--r--basys3/basys3.srcs/spi.vhd78
1 files changed, 31 insertions, 47 deletions
diff --git a/basys3/basys3.srcs/spi.vhd b/basys3/basys3.srcs/spi.vhd
index cdf7d4a..1560b54 100644
--- a/basys3/basys3.srcs/spi.vhd
+++ b/basys3/basys3.srcs/spi.vhd
@@ -6,65 +6,49 @@ use work.ppu_consts.all;
entity spi is port (
SYSCLK : in std_logic; -- clock basys3 100MHz
- SPI_CLK : in std_logic; -- incoming clock of SPI
+ SPI_CLK : in std_logic; -- incoming clock of SPI
SPI_MOSI : in std_logic; -- incoming data of SPI
- SPI_CS : in std_logic; -- incoming select of SPI
- DATA : out std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH+PPU_RAM_BUS_DATA_WIDTH-1 downto 0)); -- data read
+ RESET : in std_logic; -- async reset
+ DATA : out std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH+PPU_RAM_BUS_DATA_WIDTH-1 downto 0) := (others => '0')); -- data read
end spi;
architecture Behavioral of spi 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 SPI_REG : std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH+PPU_RAM_BUS_DATA_WIDTH-1 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
+ signal clkFF0,clkFF1,clkFF2,clkFF3 : 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 SPI_REG : std_logic_vector(PPU_RAM_BUS_ADDR_WIDTH+PPU_RAM_BUS_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal counter : integer := 31; -- counter for data position
+
+ constant COUNTER_RESET_VALUE : integer := PPU_RAM_BUS_ADDR_WIDTH + PPU_RAM_BUS_DATA_WIDTH - 1;
begin
-
process (SYSCLK)
begin
- if rising_edge(SYSCLK) then
+ if RESET = '1' then
+ counter <= COUNTER_RESET_VALUE;
+ DATA <= (others => '0');
+ elsif rising_edge(SYSCLK) then
-- flip flop for clk SPI to synchronise a
- PulseFF0 <= SPI_CLK;
- PulseFF1 <= PulseFF0;
- PulseFF2 <= PulseFF1;
- PulseFF3 <= PulseFF2;
- -- flip flop for data SPI to synchronise
+ clkFF0 <= SPI_CLK;
+ clkFF1 <= clkFF0;
+ clkFF2 <= clkFF1;
+ clkFF3 <= clkFF2;
+ -- flip flop for data SPI to synchronise
dataFF0 <= SPI_MOSI;
dataFF1 <= dataFF0;
dataFF2 <= dataFF1;
- dataFF3 <= dataFF2;
- -- flip flop for slave select SPI to synchronise
- ssFF0 <= SPI_CS;
- 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
- SPI_REG(counter) <= dataFF3;
- end if;
+ dataFF3 <= dataFF2;
+
+ if (clkFF3 = '0' and clkFF2 = '1') then -- check for rising edge of clk SPI
+ if counter > -1 then
+ counter <= counter - 1;
+ -- data transfer into vector
+ SPI_REG(counter) <= dataFF3;
end if;
- -- check if counter is done
- if counter = -1 then
- counter <= 23; -- reset counter
- DATA <= SPI_REG;
- end if;
- elsif (enable = '0') then
- -- DATA <= SPI_REG;
+ end if;
+ -- check if counter is done
+ if counter = -1 then
+ counter <= COUNTER_RESET_VALUE; -- reset counter
+ DATA <= SPI_REG;
end if;
end if;
end process;