Skip to content

Commit 21da005

Browse files
committed
SPI MASTER [MAINTENANCE]: Add some code tuning
1 parent f00cedc commit 21da005

File tree

1 file changed

+38
-41
lines changed

1 file changed

+38
-41
lines changed

rtl/spi_master.vhd

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ entity SPI_MASTER is
4848
MOSI : out std_logic; -- SPI serial data from master to slave
4949
MISO : in std_logic; -- SPI serial data from slave to master
5050
-- 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
5252
DIN : in std_logic_vector(WORD_SIZE-1 downto 0); -- input data for SPI slave
5353
DIN_LAST : in std_logic; -- when DIN_LAST = 1, after transmit these input data is asserted CS_N
5454
DIN_VLD : in std_logic; -- when DIN_VLD = 1, input data are valid
@@ -61,32 +61,31 @@ end entity;
6161

6262
architecture RTL of SPI_MASTER is
6363

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;
9089

9190
begin
9291

@@ -100,12 +99,11 @@ begin
10099
-- -------------------------------------------------------------------------
101100

102101
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;
104102

105103
sys_clk_cnt_reg_p : process (CLK)
106104
begin
107105
if (rising_edge(CLK)) then
108-
if (sys_clk_cnt_rst = '1') then
106+
if (RST = '1' or sys_clk_cnt_max = '1') then
109107
sys_clk_cnt <= (others => '0');
110108
else
111109
sys_clk_cnt <= sys_clk_cnt + 1;
@@ -120,7 +118,7 @@ begin
120118
spi_clk_gen_p : process (CLK)
121119
begin
122120
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
124122
spi_clk <= '0';
125123
elsif (sys_clk_cnt_max = '1') then
126124
spi_clk <= not spi_clk;
@@ -135,12 +133,11 @@ begin
135133
-- -------------------------------------------------------------------------
136134

137135
bit_cnt_max <= '1' when (bit_cnt = WORD_SIZE-1) else '0';
138-
bit_cnt_rst <= RST or not spi_clk_en;
139136

140137
bit_cnt_p : process (CLK)
141138
begin
142139
if (rising_edge(CLK)) then
143-
if (bit_cnt_rst = '1') then
140+
if (RST = '1' or spi_clk_rst = '1') then
144141
bit_cnt <= (others => '0');
145142
elsif (second_edge_en = '1') then
146143
bit_cnt <= bit_cnt + 1;
@@ -158,15 +155,15 @@ begin
158155
if (RST = '1') then
159156
addr_reg <= (others => '0');
160157
elsif (load_data = '1') then
161-
addr_reg <= DIN_ADDR;
158+
addr_reg <= unsigned(DIN_ADDR);
162159
end if;
163160
end if;
164161
end process;
165162

166163
cs_n_g : for i in 0 to SLAVE_COUNT-1 generate
167164
cs_n_p : process (addr_reg, chip_select_n)
168165
begin
169-
if (to_integer(unsigned(addr_reg)) = i) then
166+
if (addr_reg = i) then
170167
CS_N(i) <= chip_select_n;
171168
else
172169
CS_N(i) <= '1';
@@ -307,47 +304,47 @@ begin
307304
when idle =>
308305
master_ready <= '1';
309306
chip_select_n <= not din_last_reg_n;
310-
spi_clk_en <= '0';
307+
spi_clk_rst <= '1';
311308
first_edge_en <= '0';
312309
second_edge_en <= '0';
313310
rx_data_vld <= '0';
314311

315312
when first_edge =>
316313
master_ready <= '0';
317314
chip_select_n <= '0';
318-
spi_clk_en <= '1';
315+
spi_clk_rst <= '0';
319316
first_edge_en <= sys_clk_cnt_max;
320317
second_edge_en <= '0';
321318
rx_data_vld <= '0';
322319

323320
when second_edge =>
324321
master_ready <= '0';
325322
chip_select_n <= '0';
326-
spi_clk_en <= '1';
323+
spi_clk_rst <= '0';
327324
first_edge_en <= '0';
328325
second_edge_en <= sys_clk_cnt_max;
329326
rx_data_vld <= '0';
330327

331328
when transmit_end =>
332329
master_ready <= '0';
333330
chip_select_n <= '0';
334-
spi_clk_en <= '0';
331+
spi_clk_rst <= '1';
335332
first_edge_en <= '0';
336333
second_edge_en <= '0';
337334
rx_data_vld <= sys_clk_cnt_max;
338335

339336
when transmit_gap =>
340337
master_ready <= '0';
341338
chip_select_n <= not din_last_reg_n;
342-
spi_clk_en <= '0';
339+
spi_clk_rst <= '1';
343340
first_edge_en <= '0';
344341
second_edge_en <= '0';
345342
rx_data_vld <= '0';
346343

347344
when others =>
348345
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';
351348
first_edge_en <= '0';
352349
second_edge_en <= '0';
353350
rx_data_vld <= '0';

0 commit comments

Comments
 (0)