@@ -48,7 +48,7 @@ entity SPI_MASTER is
48
48
MOSI : out std_logic ; -- SPI serial data from master to slave
49
49
MISO : in std_logic ; -- SPI serial data from slave to master
50
50
-- INPUT USER INTERFACE
51
- DIN_ADDR : in std_logic_vector (integer (ceil (log2 (real (SLAVE_COUNT))))- 1 downto 0 ); -- SPI slave address
51
+ DIN_ADDR : in std_logic_vector (natural (ceil (log2 (real (SLAVE_COUNT))))- 1 downto 0 ); -- SPI slave address
52
52
DIN : in std_logic_vector (WORD_SIZE- 1 downto 0 ); -- input data for SPI slave
53
53
DIN_LAST : in std_logic ; -- when DIN_LAST = 1, after transmit these input data is asserted CS_N
54
54
DIN_VLD : in std_logic ; -- when DIN_VLD = 1, input data are valid
@@ -61,32 +61,31 @@ end entity;
61
61
62
62
architecture RTL of SPI_MASTER is
63
63
64
- constant DIVIDER_VALUE : integer := (CLK_FREQ/ SCLK_FREQ)/ 2 ;
65
- constant WIDTH_CLK_CNT : integer := integer (ceil (log2 (real (DIVIDER_VALUE))));
66
- constant WIDTH_ADDR : integer := integer (ceil (log2 (real (SLAVE_COUNT))));
67
- constant BIT_CNT_WIDTH : natural := natural (ceil (log2 (real (WORD_SIZE))));
68
-
69
- signal addr_reg : std_logic_vector (WIDTH_ADDR- 1 downto 0 );
70
- signal sys_clk_cnt : unsigned (WIDTH_CLK_CNT- 1 downto 0 );
71
- signal sys_clk_cnt_max : std_logic ;
72
- signal sys_clk_cnt_rst : std_logic ;
73
- signal spi_clk : std_logic ;
74
- signal spi_clk_en : std_logic ;
75
- signal din_last_reg_n : std_logic ;
76
- signal first_edge_en : std_logic ;
77
- signal second_edge_en : std_logic ;
78
- signal chip_select_n : std_logic ;
79
- signal load_data : std_logic ;
80
- signal miso_reg : std_logic ;
81
- signal shreg : std_logic_vector (WORD_SIZE- 1 downto 0 );
82
- signal bit_cnt : unsigned (BIT_CNT_WIDTH- 1 downto 0 );
83
- signal bit_cnt_max : std_logic ;
84
- signal bit_cnt_rst : std_logic ;
85
- signal rx_data_vld : std_logic ;
86
- signal master_ready : std_logic ;
87
-
88
- type state is (idle, first_edge, second_edge, transmit_end, transmit_gap);
89
- signal present_state, next_state : state;
64
+ constant DIVIDER_VALUE : natural := (CLK_FREQ/ SCLK_FREQ)/ 2 ;
65
+ constant WIDTH_CLK_CNT : natural := natural (ceil (log2 (real (DIVIDER_VALUE))));
66
+ constant WIDTH_ADDR : natural := natural (ceil (log2 (real (SLAVE_COUNT))));
67
+ constant BIT_CNT_WIDTH : natural := natural (ceil (log2 (real (WORD_SIZE))));
68
+
69
+ type state_t is (idle, first_edge, second_edge, transmit_end, transmit_gap);
70
+
71
+ signal addr_reg : unsigned (WIDTH_ADDR- 1 downto 0 );
72
+ signal sys_clk_cnt : unsigned (WIDTH_CLK_CNT- 1 downto 0 );
73
+ signal sys_clk_cnt_max : std_logic ;
74
+ signal spi_clk : std_logic ;
75
+ signal spi_clk_rst : std_logic ;
76
+ signal din_last_reg_n : std_logic ;
77
+ signal first_edge_en : std_logic ;
78
+ signal second_edge_en : std_logic ;
79
+ signal chip_select_n : std_logic ;
80
+ signal load_data : std_logic ;
81
+ signal miso_reg : std_logic ;
82
+ signal shreg : std_logic_vector (WORD_SIZE- 1 downto 0 );
83
+ signal bit_cnt : unsigned (BIT_CNT_WIDTH- 1 downto 0 );
84
+ signal bit_cnt_max : std_logic ;
85
+ signal rx_data_vld : std_logic ;
86
+ signal master_ready : std_logic ;
87
+ signal present_state : state_t;
88
+ signal next_state : state_t;
90
89
91
90
begin
92
91
@@ -100,12 +99,11 @@ begin
100
99
-- -------------------------------------------------------------------------
101
100
102
101
sys_clk_cnt_max <= '1' when (to_integer (sys_clk_cnt) = DIVIDER_VALUE- 1 ) else '0' ;
103
- sys_clk_cnt_rst <= RST or sys_clk_cnt_max;
104
102
105
103
sys_clk_cnt_reg_p : process (CLK)
106
104
begin
107
105
if (rising_edge (CLK)) then
108
- if (sys_clk_cnt_rst = '1' ) then
106
+ if (RST = '1' or sys_clk_cnt_max = '1' ) then
109
107
sys_clk_cnt <= (others => '0' );
110
108
else
111
109
sys_clk_cnt <= sys_clk_cnt + 1 ;
@@ -120,7 +118,7 @@ begin
120
118
spi_clk_gen_p : process (CLK)
121
119
begin
122
120
if (rising_edge (CLK)) then
123
- if (RST = '1' or spi_clk_en = '0 ' ) then
121
+ if (RST = '1' or spi_clk_rst = '1 ' ) then
124
122
spi_clk <= '0' ;
125
123
elsif (sys_clk_cnt_max = '1' ) then
126
124
spi_clk <= not spi_clk;
@@ -135,12 +133,11 @@ begin
135
133
-- -------------------------------------------------------------------------
136
134
137
135
bit_cnt_max <= '1' when (bit_cnt = WORD_SIZE- 1 ) else '0' ;
138
- bit_cnt_rst <= RST or not spi_clk_en;
139
136
140
137
bit_cnt_p : process (CLK)
141
138
begin
142
139
if (rising_edge (CLK)) then
143
- if (bit_cnt_rst = '1' ) then
140
+ if (RST = '1' or spi_clk_rst = '1' ) then
144
141
bit_cnt <= (others => '0' );
145
142
elsif (second_edge_en = '1' ) then
146
143
bit_cnt <= bit_cnt + 1 ;
@@ -158,15 +155,15 @@ begin
158
155
if (RST = '1' ) then
159
156
addr_reg <= (others => '0' );
160
157
elsif (load_data = '1' ) then
161
- addr_reg <= DIN_ADDR;
158
+ addr_reg <= unsigned ( DIN_ADDR) ;
162
159
end if ;
163
160
end if ;
164
161
end process ;
165
162
166
163
cs_n_g : for i in 0 to SLAVE_COUNT- 1 generate
167
164
cs_n_p : process (addr_reg, chip_select_n)
168
165
begin
169
- if (to_integer ( unsigned ( addr_reg)) = i) then
166
+ if (addr_reg = i) then
170
167
CS_N(i) <= chip_select_n;
171
168
else
172
169
CS_N(i) <= '1' ;
@@ -307,47 +304,47 @@ begin
307
304
when idle =>
308
305
master_ready <= '1' ;
309
306
chip_select_n <= not din_last_reg_n;
310
- spi_clk_en <= '0 ' ;
307
+ spi_clk_rst <= '1 ' ;
311
308
first_edge_en <= '0' ;
312
309
second_edge_en <= '0' ;
313
310
rx_data_vld <= '0' ;
314
311
315
312
when first_edge =>
316
313
master_ready <= '0' ;
317
314
chip_select_n <= '0' ;
318
- spi_clk_en <= '1 ' ;
315
+ spi_clk_rst <= '0 ' ;
319
316
first_edge_en <= sys_clk_cnt_max;
320
317
second_edge_en <= '0' ;
321
318
rx_data_vld <= '0' ;
322
319
323
320
when second_edge =>
324
321
master_ready <= '0' ;
325
322
chip_select_n <= '0' ;
326
- spi_clk_en <= '1 ' ;
323
+ spi_clk_rst <= '0 ' ;
327
324
first_edge_en <= '0' ;
328
325
second_edge_en <= sys_clk_cnt_max;
329
326
rx_data_vld <= '0' ;
330
327
331
328
when transmit_end =>
332
329
master_ready <= '0' ;
333
330
chip_select_n <= '0' ;
334
- spi_clk_en <= '0 ' ;
331
+ spi_clk_rst <= '1 ' ;
335
332
first_edge_en <= '0' ;
336
333
second_edge_en <= '0' ;
337
334
rx_data_vld <= sys_clk_cnt_max;
338
335
339
336
when transmit_gap =>
340
337
master_ready <= '0' ;
341
338
chip_select_n <= not din_last_reg_n;
342
- spi_clk_en <= '0 ' ;
339
+ spi_clk_rst <= '1 ' ;
343
340
first_edge_en <= '0' ;
344
341
second_edge_en <= '0' ;
345
342
rx_data_vld <= '0' ;
346
343
347
344
when others =>
348
345
master_ready <= '0' ;
349
- chip_select_n <= '1' ;
350
- spi_clk_en <= '0 ' ;
346
+ chip_select_n <= not din_last_reg_n ;
347
+ spi_clk_rst <= '1 ' ;
351
348
first_edge_en <= '0' ;
352
349
second_edge_en <= '0' ;
353
350
rx_data_vld <= '0' ;
0 commit comments