Skip to content

Commit 36f986b

Browse files
committed
spi: Add configurable parameters for chip count and data width in order to work with Xilinx
1 parent 9086d70 commit 36f986b

6 files changed

Lines changed: 25 additions & 13 deletions

File tree

ip/communication/spi/spi_interface.vhd

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ entity spi_interface is
3434
generic (
3535
SPI_CLK_POLARITY: bit := '0'; -- Clock polarity
3636
SPI_CLK_PHASE: bit := '0'; -- Clock phase
37+
SPI_CHIPS_AMOUNT: natural := 1; -- Number of SPI chips
38+
DATA_WIDTH: natural := 8; -- Width of the data bus
3739
CONTROLLER_AND_NOT_PERIPHERAL: boolean := true;
3840
MSB_FIRST_AND_NOT_LSB: boolean := true;
3941
ENABLE_INTERNAL_CLOCK_GATING: boolean := true;
@@ -45,16 +47,16 @@ entity spi_interface is
4547

4648
selected_chips: in std_ulogic_vector;
4749

48-
tx_data: in std_ulogic_vector;
50+
tx_data: in std_ulogic_vector(DATA_WIDTH - 1 downto 0);
4951
tx_data_valid: in std_ulogic;
5052

51-
rx_data: out std_ulogic_vector;
53+
rx_data: out std_ulogic_vector(DATA_WIDTH - 1 downto 0);
5254
rx_data_valid: out std_ulogic;
5355

5456
spi_clk_out: out std_ulogic;
5557
serial_data_out: out std_logic;
5658
serial_data_in: in std_ulogic;
57-
spi_chip_select_n: inout std_ulogic_vector;
59+
spi_chip_select_n: inout std_ulogic_vector(SPI_CHIPS_AMOUNT - 1 downto 0);
5860

5961
tx_is_ongoing: out std_ulogic
6062
);
@@ -66,6 +68,8 @@ begin
6668
generic map (
6769
SPI_CLK_POLARITY => SPI_CLK_POLARITY,
6870
SPI_CLK_PHASE => SPI_CLK_PHASE,
71+
SPI_CHIPS_AMOUNT => SPI_CHIPS_AMOUNT,
72+
DATA_WIDTH => DATA_WIDTH,
6973
CONTROLLER_AND_NOT_PERIPHERAL => CONTROLLER_AND_NOT_PERIPHERAL,
7074
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB,
7175
ENABLE_INTERNAL_CLOCK_GATING => ENABLE_INTERNAL_CLOCK_GATING,
@@ -87,6 +91,7 @@ begin
8791
generic map (
8892
SPI_CLK_POLARITY => SPI_CLK_POLARITY,
8993
SPI_CLK_PHASE => SPI_CLK_PHASE,
94+
DATA_WIDTH => DATA_WIDTH,
9095
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB
9196
)
9297
port map (

ip/communication/spi/spi_rx.vhd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ entity spi_rx is
1515
generic (
1616
SPI_CLK_POLARITY: bit := '0'; -- Clock polarity
1717
SPI_CLK_PHASE: bit := '0'; -- Clock phase
18+
DATA_WIDTH: natural := 8;
1819
MSB_FIRST_AND_NOT_LSB: boolean := true
1920
);
2021
port (
@@ -24,16 +25,15 @@ entity spi_rx is
2425
serial_data_in: in std_logic;
2526
spi_chip_select_n: in std_ulogic;
2627

27-
rx_data: out std_ulogic_vector;
28+
rx_data: out std_ulogic_vector(DATA_WIDTH - 1 downto 0);
2829
rx_data_valid: out std_ulogic
2930
);
30-
3131
end entity;
3232

3333
architecture behavioural of spi_rx is
3434
package spi_pkg_constrained is new work.spi_pkg
3535
generic map (
36-
DATA_WIDTH => rx_data'length,
36+
DATA_WIDTH => DATA_WIDTH,
3737
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB
3838
);
3939
use spi_pkg_constrained.all;

ip/communication/spi/spi_tx.vhd

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ entity spi_tx is
3232
generic (
3333
SPI_CLK_POLARITY: bit := '0'; -- Clock polarity
3434
SPI_CLK_PHASE: bit := '0'; -- Clock phase
35+
SPI_CHIPS_AMOUNT: natural := 1;
36+
DATA_WIDTH: natural := 8;
3537
CONTROLLER_AND_NOT_PERIPHERAL: boolean := true;
3638
MSB_FIRST_AND_NOT_LSB: boolean := true;
3739
ENABLE_INTERNAL_CLOCK_GATING: boolean := true;
@@ -43,12 +45,12 @@ entity spi_tx is
4345

4446
selected_chips: in std_ulogic_vector;
4547

46-
tx_data: in std_ulogic_vector;
48+
tx_data: in std_ulogic_vector(DATA_WIDTH - 1 downto 0);
4749
tx_data_valid: in std_ulogic;
4850

4951
spi_clk_out: out std_ulogic;
5052
serial_data_out: out std_logic; -- For tri-state output
51-
spi_chip_select_n: inout std_ulogic_vector;
53+
spi_chip_select_n: inout std_ulogic_vector(SPI_CHIPS_AMOUNT - 1 downto 0);
5254

5355
tx_is_ongoing: out std_ulogic
5456
);
@@ -57,7 +59,7 @@ end entity;
5759
architecture behavioural of spi_tx is
5860
package spi_pkg_constrained is new work.spi_pkg
5961
generic map (
60-
DATA_WIDTH => tx_data'length,
62+
DATA_WIDTH => DATA_WIDTH,
6163
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB
6264
);
6365
use spi_pkg_constrained.all;

ip/communication/spi/tb_spi_interface.vhd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,8 @@ begin
527527
generic map (
528528
SPI_CLK_POLARITY => SPI_CLK_POLARITY,
529529
SPI_CLK_PHASE => SPI_CLK_PHASE,
530+
SPI_CHIPS_AMOUNT => CHIP_COUNT,
531+
DATA_WIDTH => DATA_WIDTH,
530532
CONTROLLER_AND_NOT_PERIPHERAL => CONTROLLER_AND_NOT_PERIPHERAL,
531533
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB,
532534
ENABLE_INTERNAL_CLOCK_GATING => true,

ip/communication/spi/tb_spi_rx.vhd

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ architecture tb of tb_spi_rx is
4949
-------------------------------------------------------------
5050
constant SPI_CLK_POLARITY: bit := '0';
5151
constant SPI_CLK_PHASE: bit := '0';
52-
constant MSB_FIRST_AND_NOT_LSB: boolean := true;
5352
constant DATA_WIDTH: positive := 8;
53+
constant MSB_FIRST_AND_NOT_LSB: boolean := true;
5454

5555
package spi_pkg_constrained is new work.spi_pkg
5656
generic map (
@@ -65,7 +65,7 @@ architecture tb of tb_spi_rx is
6565
signal serial_data_in: std_logic := '0';
6666
signal spi_chip_select_n: std_ulogic := '1';
6767

68-
signal rx_data: std_ulogic_vector(data_range_t);
68+
signal rx_data: std_ulogic_vector(DATA_WIDTH - 1 downto 0) := (others => '0');
6969
signal rx_data_valid: std_ulogic;
7070
-------------------------------------------------------------
7171
begin
@@ -103,7 +103,7 @@ begin
103103
checker: process
104104
variable random: RandomPType;
105105
variable current_bit_index: data_range_t;
106-
variable expected_data: std_ulogic_vector(data_range_t);
106+
variable expected_data: std_ulogic_vector(DATA_WIDTH - 1 downto 0);
107107

108108
procedure wait_spi_clk_cycles(cycles: natural) is begin
109109
for i in 0 to cycles - 1 loop
@@ -211,7 +211,7 @@ begin
211211
procedure random_test is
212212
constant TEST_REPERTITIONS: natural := 1000;
213213

214-
variable random_data: std_ulogic_vector(data_range_t);
214+
variable random_data: std_ulogic_vector(DATA_WIDTH - 1 downto 0);
215215
variable random_spi_chip_select_n: std_ulogic;
216216
variable spi_chip_select_n_reg: std_ulogic;
217217
begin
@@ -283,6 +283,7 @@ begin
283283
generic map (
284284
SPI_CLK_POLARITY => SPI_CLK_POLARITY,
285285
SPI_CLK_PHASE => SPI_CLK_PHASE,
286+
DATA_WIDTH => DATA_WIDTH,
286287
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB
287288
)
288289
port map (

ip/communication/spi/tb_spi_tx.vhd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ begin
282282
generic map (
283283
SPI_CLK_POLARITY => SPI_CLK_POLARITY,
284284
SPI_CLK_PHASE => SPI_CLK_PHASE,
285+
SPI_CHIPS_AMOUNT => CHIP_COUNT,
286+
DATA_WIDTH => DATA_WIDTH,
285287
CONTROLLER_AND_NOT_PERIPHERAL => CONTROLLER_AND_NOT_PERIPHERAL,
286288
MSB_FIRST_AND_NOT_LSB => MSB_FIRST_AND_NOT_LSB,
287289
ENABLE_INTERNAL_CLOCK_GATING => true,

0 commit comments

Comments
 (0)