Professional Documents
Culture Documents
Spi Slave v1 0
Spi Slave v1 0
--
-- FileName: spi_slave.vhd
-- Dependencies: none
-- Design Software: Quartus II 32-bit Version 11.1 Build 173 SJ Full Version
--
--
-- Version History
--
--------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
ENTITY spi_slave IS
GENERIC(
PORT(
rx_req : IN STD_LOGIC; --'1' while busy = '0' moves data to the rx_data output
busy : OUT STD_LOGIC := '0'; --busy signal to logic ('1' during transaction)
END spi_slave;
SIGNAL bit_cnt : STD_LOGIC_VECTOR(d_width+8 DOWNTO 0); --'1' for active transaction bit
SIGNAL wr_add : STD_LOGIC; --address of register to write ('0' = receive, '1' = status)
SIGNAL rd_add : STD_LOGIC; --address of register to read ('0' = transmit, '1' = status)
BEGIN
--adjust clock so writes are on rising edge and reads on falling edge
mode <= cpol XOR cpha; --'1' for modes that write on rising edge
PROCESS(ss_n, clk)
BEGIN
bit_cnt <= bit_cnt(d_width+8-1 DOWNTO 0) & '0'; --shift active bit indicator
END IF;
bit_cnt <= (conv_integer(NOT cpha) => '1', OTHERS => '0'); --reset miso/mosi bit count
END IF;
END PROCESS;
BEGIN
END IF;
--trdy register
ELSIF(ss_n = '1' AND ((st_load_en = '1' AND st_load_trdy = '1') OR tx_load_en = '1')) THEN
trdy <= '1'; --set when tx buffer written or set by user logic
END IF;
--rrdy register
IF(ss_n = '1' AND ((st_load_en = '1' AND st_load_rrdy = '0') OR rx_req = '1')) THEN
rrdy <= '0'; --cleared by user logic or rx_data has been requested
END IF;
--roe register
ELSIF(rrdy = '1' AND wr_add = '0' AND bit_cnt(d_width+8) = '1' AND falling_edge(clk)) THEN
END IF;
--receive registers
END IF;
END LOOP;
END IF;
--transmit registers
IF(ss_n = '1' AND tx_load_en = '1') THEN --load transmit register from user logic
ELSIF(rd_add = '0' AND bit_cnt(7 DOWNTO 0) = "00000000" AND bit_cnt(d_width+8) = '0' AND
rising_edge(clk)) THEN
END CASE;
ELSIF(rd_add = '0' AND bit_cnt(7 DOWNTO 0) = "00000000" AND bit_cnt(d_width+8) = '0' AND
rising_edge(clk)) THEN
END IF;
END PROCESS;
END logic;