Skip to content

Commit 5296565

Browse files
committed
library/spi_engine: fix and improve timing
Fix g_sdo_shift_reg for that did not have a generate block. Also improves timing for the spi_engine_execution_shiftreg_data_assemble module, which was necessary for working on the quartus version of the AD4052 project. Signed-off-by: Carlos Souza <carlos.souza@analog.com>
1 parent bf3e6a8 commit 5296565

File tree

3 files changed

+19
-30
lines changed

3 files changed

+19
-30
lines changed

library/spi_engine/axi_spi_engine/axi_spi_engine.v

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -473,8 +473,6 @@ module axi_spi_engine #(
473473
.m_axis_empty(),
474474
.m_axis_almost_empty(sdo_fifo_almost_empty));
475475

476-
assign sdi_fifo_out_ready = up_rreq_s == 1'b1 && up_raddr_s == 8'h3a;
477-
478476
integer i;
479477
always @(posedge spi_clk) begin
480478
if (!spi_resetn) begin
@@ -788,5 +786,4 @@ module axi_spi_engine #(
788786
.out_data (sdi_level_s)
789787
);
790788

791-
792789
endmodule

library/spi_engine/spi_engine_execution/spi_engine_execution_shiftreg.v

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,23 +133,25 @@ module spi_engine_execution_shiftreg #(
133133
.last_handshake (data_sdo_v));
134134

135135
genvar i;
136-
for (i = 0; i < NUM_OF_SDIO; i = i + 1) begin: g_sdo_shift_reg
137-
// Load the SDO parallel data into the SDO shift register.
138-
reg [(DATA_WIDTH-1):0] data_sdo_shift = 'h0;
139-
always @(posedge clk) begin
140-
if (!sdo_enabled || !exec_cmd) begin
141-
data_sdo_shift <= {DATA_WIDTH{sdo_idle_state}};
142-
end else if (transfer_active == 1'b1 && trigger_tx == 1'b1) begin
143-
if (first_bit == 1'b1) begin
144-
data_sdo_shift <= sdo_lane_mask[i] ? aligned_sdo_data[i * DATA_WIDTH+:DATA_WIDTH] : {DATA_WIDTH{sdo_idle_state}};
145-
end else begin
146-
data_sdo_shift <= {data_sdo_shift[(DATA_WIDTH-2):0], 1'b0};
136+
generate
137+
for (i = 0; i < NUM_OF_SDIO; i = i + 1) begin: g_sdo_shift_reg
138+
// Load the SDO parallel data into the SDO shift register.
139+
reg [(DATA_WIDTH-1):0] data_sdo_shift = 'h0;
140+
always @(posedge clk) begin
141+
if (!sdo_enabled || !exec_cmd) begin
142+
data_sdo_shift <= {DATA_WIDTH{sdo_idle_state}};
143+
end else if (transfer_active == 1'b1 && trigger_tx == 1'b1) begin
144+
if (first_bit == 1'b1) begin
145+
data_sdo_shift <= sdo_lane_mask[i] ? aligned_sdo_data[i * DATA_WIDTH+:DATA_WIDTH] : {DATA_WIDTH{sdo_idle_state}};
146+
end else begin
147+
data_sdo_shift <= {data_sdo_shift[(DATA_WIDTH-2):0], 1'b0};
148+
end
147149
end
148150
end
149-
end
150151

151-
assign sdo_int[i] = data_sdo_shift[DATA_WIDTH-1];
152-
end
152+
assign sdo_int[i] = data_sdo_shift[DATA_WIDTH-1];
153+
end
154+
endgenerate
153155

154156
assign sdo_toshiftreg = (transfer_active && trigger_tx && first_bit && sdo_enabled);
155157

library/spi_engine/spi_engine_execution/spi_engine_execution_shiftreg_data_assemble.v

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ module spi_engine_execution_shiftreg_data_assemble #(
6969
reg last_handshake_int;
7070
reg [(NUM_OF_SDIO * DATA_WIDTH)-1:0] aligned_data;
7171
reg [ (DATA_WIDTH)-1:0] data_reg;
72-
reg [ 3:0] count_active_lanes = 0;
73-
reg [ 3:0] num_active_lanes = NUM_OF_SDIO;
7472
reg [ 3:0] lane_index = 0;
7573
reg [ 3:0] valid_indices [0:7];
7674

@@ -105,27 +103,19 @@ module spi_engine_execution_shiftreg_data_assemble #(
105103

106104
// data line counter and stores activated lines
107105
// it returns valid_indices array necessary for correct buffering of data
108-
reg [3:0] i;
109106
reg [3:0] j;
110107
reg [3:0] mask_index;
111108
reg index_ready_reg;
112109
always @(posedge clk) begin
113110
if (resetn == 1'b0) begin
114-
num_active_lanes <= NUM_OF_SDIO;
115111
index_ready_reg <= 1'b0;
116112
mask_index <= 0;
117113
j <= 0;
118114
end else begin
119115
if (exec_sdo_lane_cmd) begin
120-
count_active_lanes = 0;
121-
i = 0;
122116
j <= 0;
123117
index_ready_reg <= 1'b0;
124118
mask_index <= 0;
125-
for (i = 0; i < NUM_OF_SDIO; i = i + 1) begin
126-
count_active_lanes = count_active_lanes + current_cmd[i];
127-
end
128-
num_active_lanes <= count_active_lanes;
129119
end else begin
130120
if (j < NUM_OF_SDIO) begin
131121
if (lane_mask[j]) begin
@@ -140,7 +130,7 @@ module spi_engine_execution_shiftreg_data_assemble #(
140130
end
141131

142132
// handshake counter
143-
// it will increment up to num_active_lanes
133+
// it will increment up to mask_index
144134
// The last handshake is used by external logic to enable sdo_io_ready
145135
// retrieves the correct lane_index used to align data
146136
always @(posedge clk) begin
@@ -150,8 +140,8 @@ module spi_engine_execution_shiftreg_data_assemble #(
150140
last_handshake_int <= 1'b0;
151141
end else begin
152142
if (data_ready && data_valid) begin
153-
last_handshake_int <= (lane_index == (num_active_lanes-1)) ? 1'b1 : 1'b0;
154-
if (lane_index < (num_active_lanes-1)) begin
143+
last_handshake_int <= (lane_index == (mask_index-1)) ? 1'b1 : 1'b0;
144+
if (lane_index < (mask_index-1)) begin
155145
lane_index <= lane_index + 1;
156146
end else begin
157147
lane_index <= 0;

0 commit comments

Comments
 (0)