Skip to content

Commit 1b4d065

Browse files
committed
library:axi_ad408x: Fix filter capture
Fix shift register issue caused by filter_ready_n timing The filter_ready_n signal stays HIGH for 2.5 adc_clk_div periods, which causes the shift register to capture either 2 or 3 HIGH periods. The solution is to activate the filter_ready signal at the fall edge of the filter_ready_n and deactivate it after the first data valid. Signed-off-by: PopPaul2021 <paul.pop@analog.com>
1 parent f982f4f commit 1b4d065

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

library/axi_ad408x/ad408x_phy.v

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// ***************************************************************************
22
// ***************************************************************************
3-
// Copyright (C) 2022-2024 Analog Devices, Inc. All rights reserved.
3+
// Copyright (C) 2022-2025 Analog Devices, Inc. All rights reserved.
44
//
55
// In this HDL repository, there are many different and unique modules, consisting
66
// of various HDL(Verilog or VHDL) components. The individual modules are
@@ -134,6 +134,8 @@ module ad408x_phy #(
134134
wire [19:0] pattern_value;
135135
wire [19:0] packed_16_20;
136136
wire [19:0] packed_8_20;
137+
wire pack16_valid;
138+
wire pack8_valid;
137139
wire adc_clk_div;
138140
wire [NUM_LANES-1:0] serdes_in_p;
139141
wire [NUM_LANES-1:0] serdes_in_n;
@@ -150,7 +152,8 @@ module ad408x_phy #(
150152
reg [5:0] serdes_reset = 6'b000110;
151153
reg sync_status_int = 1'b0;
152154
reg [1:0] serdes_valid = 2'b00;
153-
reg [3:0] filter_rdy_n_d = 'b0;
155+
reg [1:0] filter_rdy_n_d = 'b0;
156+
reg filter_ready = 1'b0;
154157
reg shift_cnt_en = 1'b0;
155158
reg packed_data_valid_d;
156159
reg packed_data_valid;
@@ -161,7 +164,7 @@ module ad408x_phy #(
161164
reg slip_dd;
162165
reg slip_d;
163166

164-
assign fall_filter_ready = filter_rdy_n_d[3] & ~filter_rdy_n_d[2];
167+
assign fall_filter_ready = filter_rdy_n_d[1] & ~filter_rdy_n_d[0];
165168
assign sync_status = sync_status_int;
166169
assign single_lane = num_lanes[0];
167170
assign adc_clk = adc_clk_div;
@@ -380,12 +383,20 @@ module ad408x_phy #(
380383
always @(posedge adc_clk_div) begin
381384
adc_data_shifted <= {packed_data_d,packed_data} >> shift_cnt;
382385
packed_data_valid_d <= packed_data_valid;
383-
filter_rdy_n_d <= {filter_rdy_n_d[2:0], filter_rdy_n};
386+
end
387+
388+
always @(posedge adc_clk_div) begin
389+
filter_rdy_n_d <= {filter_rdy_n_d[0], filter_rdy_n};
390+
if(fall_filter_ready) begin
391+
filter_ready <= 1'b1;
392+
end else if (packed_data_valid_d == 1'b1) begin
393+
filter_ready <= 1'b0;
394+
end
384395
end
385396

386397
// Sign extend to 32 bits
387398

388399
assign adc_data = {{12{adc_data_shifted[19]}},adc_data_shifted};
389-
assign adc_valid = filter_enable ? (packed_data_valid_d & fall_filter_ready) : packed_data_valid_d;
400+
assign adc_valid = filter_enable ? (packed_data_valid_d & filter_ready) : packed_data_valid_d;
390401

391402
endmodule

0 commit comments

Comments
 (0)