Motion FPGA
Motion FPGA for the MachX02-7000HE Breakout Board
sim_spi_master.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 --! @file
3 --! @brief SPI Master simulation module
4 -------------------------------------------------------------------------------
5 
6 --! Using IEEE library
7 LIBRARY ieee;
8 
9 --! Using IEEE standard logic components
10 USE ieee.std_logic_1164.ALL;
11 
12 --! @brief SPI Master simulation entity
13 ENTITY sim_spi_master IS
14  GENERIC (
15  spi_width : natural := 32; --! SPI transfer width
16  spi_cs_delay : time := 500 ns; --! SPI chip-select rise/fall delay
17  spi_sclk_period : time := 400 ns --! SPI clock period
18  );
19  PORT (
20  rst_in : IN std_logic; --! Asynchronous reset
21  spi_cs_out : OUT std_logic; --! SPI chip-select line
22  spi_sclk_out : OUT std_logic; --! SPI sclk line
23  spi_mosi_out : OUT std_logic; --! SPI mosi line
24  spi_miso_in : IN std_logic; --! SPI miso line
25  data_mosi_in : IN std_logic_vector(spi_width - 1 DOWNTO 0); --! Data to send
26  data_miso_out : OUT std_logic_vector(spi_width - 1 DOWNTO 0); --! Data received
27  xfer_start_in : IN std_logic; --! Start transfer flag
28  xfer_done_out : OUT std_logic --! Transfer done flag
29  );
30 END ENTITY sim_spi_master;
31 
32 --! Architecture sim of entity sim_spi_master
33 ARCHITECTURE sim OF sim_spi_master IS
34 
35 BEGIN
36 
37  --! @brief SPI transfer process
38  --!
39  --! This process performs SPI transfers when requested by xfer_start.
40  pr_xfer : PROCESS IS
41 
42  VARIABLE v_data_miso : std_logic_vector(spi_width - 1 DOWNTO 0);
43 
44  BEGIN
45 
46  IF (rst_in = '1') THEN
47  -- Reset
48  spi_cs_out <= '1';
49  spi_sclk_out <= '0';
50  spi_mosi_out <= '0';
51  data_miso_out <= (OTHERS => '0');
52  xfer_done_out <= '0';
53 
54  -- Wait for reset to clear
55  WAIT UNTIL rst_in = '0';
56  ELSIF (xfer_start_in = '1') THEN
57  -- Drop chip-select
58  WAIT FOR spi_cs_delay;
59  spi_cs_out <= '0';
60  WAIT FOR spi_cs_delay;
61 
62  -- Transfer all bits
63  FOR b in spi_width - 1 DOWNTO 0 LOOP
64 
65  -- First half of clock
67  spi_sclk_out <= '1';
68  WAIT FOR spi_sclk_period / 2;
69 
70  -- Second half of clock
71  v_data_miso(b) := spi_miso_in;
72  spi_sclk_out <= '0';
73  WAIT FOR spi_sclk_period / 2;
74 
75  END LOOP;
76 
77  -- Raise chip-select
78  WAIT FOR spi_cs_delay;
79  spi_cs_out <= '1';
80  WAIT FOR spi_cs_delay;
81 
82  -- Hand-shake transfer complete
83  data_miso_out <= v_data_miso;
84  xfer_done_out <= '1';
85  WAIT UNTIL xfer_start_in = '0';
86  xfer_done_out <= '0';
87  ELSE
88  -- Wait for work
89  WAIT ON rst_in, xfer_start_in;
90  END IF;
91 
92  END PROCESS pr_xfer;
93 
94 END ARCHITECTURE sim;
out spi_mosi_outstd_logic
SPI mosi line.
in xfer_start_instd_logic
Start transfer flag.
out spi_sclk_outstd_logic
SPI sclk line.
out data_miso_outstd_logic_vector( spi_width- 1 DOWNTO 0)
Data received.
spi_sclk_periodtime := 400 ns
SPI clock period.
in rst_instd_logic
Asynchronous reset.
spi_widthnatural := 32
SPI transfer width.
spi_cs_delaytime := 500 ns
SPI chip-select rise/fall delay.
out spi_cs_outstd_logic
SPI chip-select line.
out xfer_done_outstd_logic
Transfer done flag.
in data_mosi_instd_logic_vector( spi_width- 1 DOWNTO 0)
Data to send.
SPI Master simulation entity.
in spi_miso_instd_logic
SPI miso line.