@@ -74,7 +74,9 @@ module axi_ada4355_if #(
74
74
75
75
// Output data
76
76
output [15 :0 ] adc_data,
77
- output adc_valid
77
+ output adc_valid,
78
+ output adc_pn_err,
79
+ input [ 2 :0 ] enable_error
78
80
);
79
81
80
82
// Use always DDR mode for SERDES, useful for SDR mode to adjust capture
@@ -86,6 +88,8 @@ module axi_ada4355_if #(
86
88
FRAME_SHIFTED = 3'h2 ,
87
89
RESET = 3'h3 ;
88
90
localparam [ 7 :0 ] pattern_value = 8'hF0 ;
91
+ localparam [15 :0 ] expected_pattern_lane_0 = 16'h5554 ;
92
+ localparam [15 :0 ] expected_pattern_lane_1 = 16'hAAA8 ;
89
93
90
94
wire clk_in_s;
91
95
wire out_ibufmrce_clock;
@@ -120,6 +124,7 @@ module axi_ada4355_if #(
120
124
reg [ 1 :0 ] serdes_valid = 2'b00 ;
121
125
reg [ 1 :0 ] serdes_valid_d = 2'b00 ;
122
126
reg [ 2 :0 ] shift_cnt = 3'd0 ;
127
+ reg [ 4 :0 ] delay = 5'd0 ;
123
128
reg [15 :0 ] serdes_data;
124
129
reg [15 :0 ] serdes_data_d;
125
130
reg [ 7 :0 ] serdes_frame;
@@ -130,6 +135,12 @@ module axi_ada4355_if #(
130
135
reg bufr_alignment;
131
136
reg bufr_alignment_bufr;
132
137
reg [ 2 :0 ] state = 3'h0 ;
138
+ reg frame_err_r;
139
+ reg data_err_lane_0_r;
140
+ reg data_err_lane_1_r;
141
+ reg [15 :0 ] lane_0_mask = 16'h5555 ;
142
+ reg [15 :0 ] lane_1_mask = 16'hAAAA ;
143
+ reg [15 :0 ] test_pattern;
133
144
134
145
IBUFGDS i_clk_in_ibuf (
135
146
.I(dco_p),
@@ -275,38 +286,40 @@ module axi_ada4355_if #(
275
286
end
276
287
277
288
assign adc_clk = adc_clk_div;
289
+ assign adc_pn_err = ((data_err_lane_0_r & enable_error[0 ]) | (data_err_lane_1_r & enable_error[1 ]) |
290
+ (frame_err_r & enable_error[2 ]));
278
291
279
292
assign data_in_p = {d1a_p, d0a_p};
280
293
assign data_in_n = {d1a_n, d0a_n};
281
294
282
- assign {data_0 [0 ],data_1 [0 ]} = data_s0; // f-e latest bit received
283
- assign {data_0 [1 ],data_1 [1 ]} = data_s1; // r-e
284
- assign {data_0 [2 ],data_1 [2 ]} = data_s2; // f-e
285
- assign {data_0 [3 ],data_1 [3 ]} = data_s3; // r-e
286
- assign {data_0 [4 ],data_1 [4 ]} = data_s4; // f-e
287
- assign {data_0 [5 ],data_1 [5 ]} = data_s5; // r-e
288
- assign {data_0 [6 ],data_1 [6 ]} = data_s6; // f-e
289
- assign {data_0 [7 ],data_1 [7 ]} = data_s7; // r-e oldest bit received
295
+ assign {data_1 [0 ],data_0 [0 ]} = data_s0; // f-e latest bit received
296
+ assign {data_1 [1 ],data_0 [1 ]} = data_s1; // r-e
297
+ assign {data_1 [2 ],data_0 [2 ]} = data_s2; // f-e
298
+ assign {data_1 [3 ],data_0 [3 ]} = data_s3; // r-e
299
+ assign {data_1 [4 ],data_0 [4 ]} = data_s4; // f-e
300
+ assign {data_1 [5 ],data_0 [5 ]} = data_s5; // r-e
301
+ assign {data_1 [6 ],data_0 [6 ]} = data_s6; // f-e
302
+ assign {data_1 [7 ],data_0 [7 ]} = data_s7; // r-e oldest bit received
290
303
291
304
// For DDR dual lane interleave the two sedres outputs;
292
305
293
306
always @(posedge adc_clk_div) begin
294
- serdes_data = {data_0[7 ],
295
- data_1[7 ],
296
- data_0[6 ],
307
+ serdes_data = {data_1[7 ],
308
+ data_0[7 ],
297
309
data_1[6 ],
298
- data_0[5 ],
310
+ data_0[6 ],
299
311
data_1[5 ],
300
- data_0[4 ],
312
+ data_0[5 ],
301
313
data_1[4 ],
302
- data_0[3 ],
314
+ data_0[4 ],
303
315
data_1[3 ],
304
- data_0[2 ],
316
+ data_0[3 ],
305
317
data_1[2 ],
306
- data_0[1 ],
318
+ data_0[2 ],
307
319
data_1[1 ],
308
- data_0[0 ],
309
- data_1[0 ]};
320
+ data_0[1 ],
321
+ data_1[0 ],
322
+ data_0[0 ]};
310
323
311
324
serdes_frame = {frame_s7,
312
325
frame_s6,
@@ -325,6 +338,10 @@ module axi_ada4355_if #(
325
338
end
326
339
end
327
340
341
+ always @(posedge adc_clk_div) begin
342
+ test_pattern <= adc_data_shifted;
343
+ end
344
+
328
345
always @(posedge adc_clk_div) begin
329
346
if (serdes_reset_d) begin
330
347
state <= INIT;
@@ -337,10 +354,27 @@ module axi_ada4355_if #(
337
354
state <= CNT_UPDATE;
338
355
end else begin
339
356
frame_shifted <= {serdes_frame, serdes_frame_d} >> shift_cnt;
357
+ if (expected_pattern_lane_0 == (test_pattern & lane_0_mask)) begin
358
+ data_err_lane_0_r <= 1'b0 ;
359
+ end else begin
360
+ data_err_lane_0_r <= 1'b1 ;
361
+ end
362
+ if (expected_pattern_lane_1 == (test_pattern & lane_1_mask)) begin
363
+ data_err_lane_1_r <= 1'b0 ;
364
+ end else begin
365
+ data_err_lane_1_r <= 1'b1 ;
366
+ end
340
367
state <= INIT;
341
368
end
342
369
end
343
370
CNT_UPDATE : begin
371
+ if (shift_cnt == 3'b111 ) begin
372
+ frame_err_r <= 1'b1 ;
373
+ state <= RESET;
374
+ end
375
+ else begin
376
+ frame_err_r <= 1'b0 ;
377
+ end
344
378
shift_cnt <= shift_cnt + 1 ;
345
379
state <= FRAME_SHIFTED;
346
380
end
@@ -351,6 +385,9 @@ module axi_ada4355_if #(
351
385
RESET : begin
352
386
shift_cnt <= 0 ;
353
387
state <= INIT;
388
+ frame_err_r <= 1'b0 ;
389
+ data_err_lane_0_r <= 1'b0 ;
390
+ data_err_lane_1_r <= 1'b0 ;
354
391
end
355
392
default :
356
393
state <= INIT;
0 commit comments