1 ------------------------------------------------------------------------------- 3 --! @brief DRV8711 SPI interface 4 ------------------------------------------------------------------------------- 9 --! Using IEEE standard logic components 10 USE ieee.std_logic_1164.
ALL;
12 --! @brief DRV8711 spi entity 27 END ENTITY drv8711_spi;
29 --! Architecture rtl of drv8711_spi entity 32 TYPE t_xfer_state IS (xfer_idle, xfer_start_delay, xfer_data, xfer_end_delay, xfer_finish);
34 SIGNAL xfer_state : t_xfer_state;
38 SIGNAL data_send : (15 DOWNTO 0);
40 SIGNAL data_recv : (15 DOWNTO 0);
42 SIGNAL spi_count : RANGE 0 TO 15;
52 xfer_state <= xfer_idle;
54 data_send <= (OTHERS => '0');
55 data_recv <= (OTHERS => '0');
58 ELSIF (rising_edge(clk_in)) THEN 59 -- Latch the transfer start 62 -- Default done to low 65 -- Handle transfer when told to advance 71 -- Detect start request 72 IF (xfer_start = '1') THEN 78 -- Transition to start delay 79 xfer_state <= xfer_start_delay;
82 WHEN xfer_start_delay => 83 -- Delay complete, transition to transfer data 84 xfer_state <= xfer_data;
87 -- Perform clocked transfer 88 IF (spi_sclk = '0') THEN 89 -- Sclk low->high: capture incoming data 92 -- Sclk high->low: advance outbound data 93 data_send <= data_send(14 DOWNTO 0) & '0';
96 -- Update state on end of bit 97 IF (spi_sclk = '1') THEN 98 IF (spi_count = 15) THEN 99 -- Transfer complete, transition to end delay 100 xfer_state <= xfer_end_delay;
102 -- Count bytes complete 103 spi_count <= spi_count + 1;
108 spi_sclk <= NOT spi_sclk;
110 WHEN xfer_end_delay => 111 -- Delay complete, transition to finish 112 xfer_state <= xfer_finish;
118 xfer_state <= xfer_idle;
121 xfer_state <= xfer_idle;
128 END PROCESS pr_transfer;
132 spi_scs_out <= '1' WHEN xfer_state = xfer_start_delay ELSE 133 '1' WHEN xfer_state = xfer_data ELSE 134 '1' WHEN xfer_state = xfer_end_delay ELSE 139 spi_mosi_out <= data_send(15) WHEN xfer_state = xfer_data ELSE 142 END ARCHITECTURE rtl;
out spi_mosi_outstd_logic
SPI mosi.
in spi_miso_instd_logic
SPI miso.
in xfer_start_instd_logic
Transfer start flag.
in xfer_adv_instd_logic
Transfer advance flag.
in data_send_instd_logic_vector( 15 DOWNTO 0)
Data to send.
out spi_sclk_outstd_logic
SPI clock.
_library_ ieeeieee
Using IEEE library.
in rst_instd_logic
Asynchronous reset.
out data_recv_outstd_logic_vector( 15 DOWNTO 0)
Data received.
out xfer_done_outstd_logic
Transfer done flag.
out spi_scs_outstd_logic
SPI chip-select.
in clk_instd_logic
Clock.