From 4d54c7e2d67deef23fab5a804d80e3cf470aca9e Mon Sep 17 00:00:00 2001 From: Istvan Csomortani Date: Tue, 5 May 2020 14:42:39 +0300 Subject: [PATCH] spi_engine_execution: Merge the SDI lines into one vector This modification will help to support multiple SPI engine execution setups (e.g. different NUM_OF_SDI) for the same project. --- library/spi_engine/interfaces/spi_master.xml | 1 + .../spi_engine/interfaces/spi_master_rtl.xml | 129 +++++------------- .../spi_engine_execution.v | 78 +++-------- .../spi_engine_execution_ip.tcl | 25 ---- projects/ad7134_fmc/zed/system_top.v | 9 +- projects/ad738x_fmc/zed/system_top.v | 3 +- 6 files changed, 55 insertions(+), 190 deletions(-) diff --git a/library/spi_engine/interfaces/spi_master.xml b/library/spi_engine/interfaces/spi_master.xml index 525c27cac..b03644e64 100644 --- a/library/spi_engine/interfaces/spi_master.xml +++ b/library/spi_engine/interfaces/spi_master.xml @@ -10,4 +10,5 @@ false 1 1 + SPI Engine physical interface diff --git a/library/spi_engine/interfaces/spi_master_rtl.xml b/library/spi_engine/interfaces/spi_master_rtl.xml index 89821262c..3c4063054 100644 --- a/library/spi_engine/interfaces/spi_master_rtl.xml +++ b/library/spi_engine/interfaces/spi_master_rtl.xml @@ -6,17 +6,19 @@ interface spi_master_rtl 1.0 - SCLK + SPI clock required 1 + out required @@ -27,150 +29,83 @@ SDI + Serial data in - required - 1 + optional in - 1 + optional + out + 0 - SDI_1 - - - required - 1 - in - - - 1 - - - - - SDI_2 - - - required - 1 - in - - - 1 - - - - - SDI_3 - - - required - 1 - in - - - 1 - - - - - SDI_4 - - - required - 1 - in - - - 1 - - - - - SDI_5 - - - required - 1 - in - - - 1 - - - - - SDI_6 - - - required - 1 - in - - - 1 - - - - - SDI_7 - - - required - 1 - in - - - 1 - - - - SDO + Serial data out + optional 1 + out + optional 1 in + 0 SDO_T + Serial data out three state controle line + optional 1 + out + optional 1 in + 0 THREE_WIRE + Three wire mode + optional 1 + out + optional 1 in + 0 CS + Chip select + + required + out + + required in + 0 diff --git a/library/spi_engine/spi_engine_execution/spi_engine_execution.v b/library/spi_engine/spi_engine_execution/spi_engine_execution.v index 734421023..258c616d1 100644 --- a/library/spi_engine/spi_engine_execution/spi_engine_execution.v +++ b/library/spi_engine/spi_engine_execution/spi_engine_execution.v @@ -70,14 +70,7 @@ module spi_engine_execution #( output reg sclk, output reg sdo, output reg sdo_t, - input sdi, - input sdi_1, - input sdi_2, - input sdi_3, - input sdi_4, - input sdi_5, - input sdi_6, - input sdi_7, + input [NUM_OF_SDI-1:0] sdi, output reg [NUM_OF_CS-1:0] cs, output reg three_wire ); @@ -146,16 +139,7 @@ reg [7:0] clk_div = DEFAULT_CLK_DIV; wire sdo_enabled = cmd_d1[8]; wire sdi_enabled = cmd_d1[9]; -// supporting max 8 SDI channel reg [(DATA_WIDTH-1):0] data_sdo_shift = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_1 = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_2 = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_3 = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_4 = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_5 = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_6 = 'h0; -reg [(DATA_WIDTH-1):0] data_sdi_shift_7 = 'h0; reg [4:0] trigger_rx_d = 5'b0; @@ -415,48 +399,26 @@ assign trigger_rx_s = (SDI_DELAY == 2'b00) ? trigger_rx_d[1] : (SDI_DELAY == 2'b10) ? trigger_rx_d[3] : (SDI_DELAY == 2'b11) ? trigger_rx_d[4] : trigger_rx_d[1]; -always @(posedge clk) begin - if (inst_d1 == CMD_CHIPSELECT) begin - data_sdi_shift <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_1 <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_2 <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_3 <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_4 <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_5 <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_6 <= {DATA_WIDTH{1'b0}}; - data_sdi_shift_7 <= {DATA_WIDTH{1'b0}}; - end else if (trigger_rx_s == 1'b1) begin - data_sdi_shift <= {data_sdi_shift[(DATA_WIDTH-2):0], sdi}; - data_sdi_shift_1 <= {data_sdi_shift_1[(DATA_WIDTH-2):0], sdi_1}; - data_sdi_shift_2 <= {data_sdi_shift_2[(DATA_WIDTH-2):0], sdi_2}; - data_sdi_shift_3 <= {data_sdi_shift_3[(DATA_WIDTH-2):0], sdi_3}; - data_sdi_shift_4 <= {data_sdi_shift_4[(DATA_WIDTH-2):0], sdi_4}; - data_sdi_shift_5 <= {data_sdi_shift_5[(DATA_WIDTH-2):0], sdi_5}; - data_sdi_shift_6 <= {data_sdi_shift_6[(DATA_WIDTH-2):0], sdi_6}; - data_sdi_shift_7 <= {data_sdi_shift_7[(DATA_WIDTH-2):0], sdi_7}; - end -end +// Load the serial data into SDI shift register(s), then link it to the output +// register of the module +genvar i; +generate + for (i=0; i 1)" -adi_set_ports_dependency "sdi_2" \ - "(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_SDI')) > 2)" -adi_set_ports_dependency "sdi_3" \ - "(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_SDI')) > 3)" -adi_set_ports_dependency "sdi_4" \ - "(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_SDI')) > 4)" -adi_set_ports_dependency "sdi_5" \ - "(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_SDI')) > 5)" -adi_set_ports_dependency "sdi_6" \ - "(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_SDI')) > 6)" -adi_set_ports_dependency "sdi_7" \ - "(spirit:decode(id('MODELPARAM_VALUE.NUM_OF_SDI')) > 7)" - ipx::save_core [ipx::current_core] diff --git a/projects/ad7134_fmc/zed/system_top.v b/projects/ad7134_fmc/zed/system_top.v index 85a329ace..9c80bf850 100644 --- a/projects/ad7134_fmc/zed/system_top.v +++ b/projects/ad7134_fmc/zed/system_top.v @@ -217,14 +217,7 @@ module system_top ( .spi0_sdo_o (ad713x_spi_sdo), .ad713x_di_sdo (), .ad713x_di_sdo_t (), - .ad713x_di_sdi (ad713x_din[0]), - .ad713x_di_sdi_1 (ad713x_din[1]), - .ad713x_di_sdi_2 (ad713x_din[2]), - .ad713x_di_sdi_3 (ad713x_din[3]), - .ad713x_di_sdi_4 (ad713x_din[4]), - .ad713x_di_sdi_5 (ad713x_din[5]), - .ad713x_di_sdi_6 (ad713x_din[6]), - .ad713x_di_sdi_7 (ad713x_din[7]), + .ad713x_di_sdi (ad713x_din), .ad713x_di_cs (), .ad713x_di_sclk (ad713x_dclk), .ad713x_odr (ad713x_odr), diff --git a/projects/ad738x_fmc/zed/system_top.v b/projects/ad738x_fmc/zed/system_top.v index b4afd47a2..4bb5bcd23 100644 --- a/projects/ad738x_fmc/zed/system_top.v +++ b/projects/ad738x_fmc/zed/system_top.v @@ -174,8 +174,7 @@ module system_top ( .iic_mux_sda_t (iic_mux_sda_t_s), .spi_sdo (spi_sdo), .spi_sdo_t (), - .spi_sdi (spi_sdia), - .spi_sdi_1 (spi_sdib), + .spi_sdi ({spi_sdib, spi_sdia}), .spi_cs (spi_cs), .spi_sclk (spi_sclk), .otg_vbusoc (otg_vbusoc),