2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
5 entity spi_leds_and_enc_v1_0_spi_fsm is
7 data_width : integer := 32;
8 spi_clkdiv : integer := 10
11 reset_in : in std_logic;
13 clk_in : in std_logic;
14 clk_en : in std_logic;
16 spi_clk : out std_logic;
17 spi_cs : out std_logic;
18 spi_mosi : out std_logic;
19 spi_miso : in std_logic;
21 tx_data : in std_logic_vector(data_width-1 downto 0);
22 rx_data : out std_logic_vector(data_width-1 downto 0);
24 trasfer_rq : in std_logic;
25 transfer_ready : out std_logic
27 end spi_leds_and_enc_v1_0_spi_fsm;
29 architecture arch_imp of spi_leds_and_enc_v1_0_spi_fsm is
31 signal shift_reg : std_logic_vector(data_width-1 downto 0);
32 signal data_cnt : natural range 0 to data_width;
33 signal div_cnt : natural range 0 to spi_clkdiv-1;
34 signal clk_phase : std_logic;
35 signal in_progress : std_logic;
41 wait until rising_edge (clk_in);
42 if ( reset_in = '1' ) then
43 shift_reg <= (others => '0');
44 rx_data <= (others => '0');
45 div_cnt <= spi_clkdiv-1;
46 transfer_ready <= '0';
53 elsif (clk_en = '1') then
54 transfer_ready <= '0';
55 if (div_cnt /= 0) then
56 div_cnt <= div_cnt - 1;
57 elsif clk_phase = '1' then
58 div_cnt <= spi_clkdiv-1;
61 if in_progress = '1' then
62 shift_reg(data_width-1) <= spi_miso;
66 div_cnt <= spi_clkdiv-1;
68 if (data_cnt = 0) then
70 if in_progress = '1' then
74 transfer_ready <= in_progress;
76 if (trasfer_rq = '1') then
78 data_cnt <= data_width;
84 spi_mosi <= shift_reg(0);
85 shift_reg <= '0' & shift_reg(data_width-1 downto 1);
86 data_cnt <= data_cnt - 1;