@@ -36,6 +36,7 @@ entity SPI_MASTER is
36
36
Generic (
37
37
CLK_FREQ : natural := 50e6 ; -- set system clock frequency in Hz
38
38
SCLK_FREQ : natural := 5e6 ; -- set SPI clock frequency in Hz (condition: SCLK_FREQ <= CLK_FREQ/10)
39
+ WORD_SIZE : natural := 8 ; -- size of transfer word in bits, must be power of two
39
40
SLAVE_COUNT : natural := 1 -- count of SPI slaves
40
41
);
41
42
Port (
@@ -48,12 +49,12 @@ entity SPI_MASTER is
48
49
MISO : in std_logic ; -- SPI serial data from slave to master
49
50
-- INPUT USER INTERFACE
50
51
DIN_ADDR : in std_logic_vector (integer (ceil (log2 (real (SLAVE_COUNT))))- 1 downto 0 ); -- SPI slave address
51
- DIN : in std_logic_vector (7 downto 0 ); -- input data for SPI slave
52
+ DIN : in std_logic_vector (WORD_SIZE - 1 downto 0 ); -- input data for SPI slave
52
53
DIN_LAST : in std_logic ; -- when DIN_LAST = 1, after transmit these input data is asserted CS_N
53
54
DIN_VLD : in std_logic ; -- when DIN_VLD = 1, input data are valid
54
55
DIN_RDY : out std_logic ; -- when DIN_RDY = 1, valid input data are accept
55
56
-- OUTPUT USER INTERFACE
56
- DOUT : out std_logic_vector (7 downto 0 ); -- output data from SPI slave
57
+ DOUT : out std_logic_vector (WORD_SIZE - 1 downto 0 ); -- output data from SPI slave
57
58
DOUT_VLD : out std_logic -- when DOUT_VLD = 1, output data are valid
58
59
);
59
60
end entity ;
@@ -63,6 +64,7 @@ architecture RTL of SPI_MASTER is
63
64
constant DIVIDER_VALUE : integer := (CLK_FREQ/ SCLK_FREQ)/ 2 ;
64
65
constant WIDTH_CLK_CNT : integer := integer (ceil (log2 (real (DIVIDER_VALUE))));
65
66
constant WIDTH_ADDR : integer := integer (ceil (log2 (real (SLAVE_COUNT))));
67
+ constant BIT_CNT_WIDTH : natural := natural (ceil (log2 (real (WORD_SIZE))));
66
68
67
69
signal addr_reg : std_logic_vector (WIDTH_ADDR- 1 downto 0 );
68
70
signal sys_clk_cnt : unsigned (WIDTH_CLK_CNT- 1 downto 0 );
@@ -76,8 +78,8 @@ architecture RTL of SPI_MASTER is
76
78
signal chip_select_n : std_logic ;
77
79
signal load_data : std_logic ;
78
80
signal miso_reg : std_logic ;
79
- signal shreg : std_logic_vector (7 downto 0 );
80
- signal bit_cnt : unsigned (2 downto 0 );
81
+ signal shreg : std_logic_vector (WORD_SIZE - 1 downto 0 );
82
+ signal bit_cnt : unsigned (BIT_CNT_WIDTH - 1 downto 0 );
81
83
signal bit_cnt_max : std_logic ;
82
84
signal bit_cnt_rst : std_logic ;
83
85
signal rx_data_vld : std_logic ;
@@ -132,7 +134,7 @@ begin
132
134
-- BIT COUNTER
133
135
-- -------------------------------------------------------------------------
134
136
135
- bit_cnt_max <= '1' when (bit_cnt = "111" ) else '0' ;
137
+ bit_cnt_max <= '1' when (bit_cnt = WORD_SIZE - 1 ) else '0' ;
136
138
bit_cnt_rst <= RST or not spi_clk_en;
137
139
138
140
bit_cnt_p : process (CLK)
@@ -210,13 +212,13 @@ begin
210
212
if (load_data = '1' ) then
211
213
shreg <= DIN;
212
214
elsif (second_edge_en = '1' ) then
213
- shreg <= shreg(6 downto 0 ) & miso_reg;
215
+ shreg <= shreg(WORD_SIZE - 2 downto 0 ) & miso_reg;
214
216
end if ;
215
217
end if ;
216
218
end process ;
217
219
218
220
DOUT <= shreg;
219
- MOSI <= shreg(7 );
221
+ MOSI <= shreg(WORD_SIZE - 1 );
220
222
221
223
-- -------------------------------------------------------------------------
222
224
-- DATA OUT VALID RESISTER
0 commit comments