@@ -112,6 +112,20 @@ module axi_logic_analyzer #(
112
112
113
113
reg streaming_on;
114
114
115
+ reg [ 1 :0 ] trigger_i_m1 = 2'd0 ;
116
+ reg [ 1 :0 ] trigger_i_m2 = 2'd0 ;
117
+ reg [ 1 :0 ] trigger_i_m3 = 2'd0 ;
118
+ reg trigger_adc_m1 = 1'd0 ;
119
+ reg trigger_adc_m2 = 1'd0 ;
120
+ reg trigger_la_m2 = 1'd0 ;
121
+ reg pg_trigered = 1'd0 ;
122
+
123
+ reg [ 1 :0 ] any_edge_trigger = 1'd0 ;
124
+ reg [ 1 :0 ] rise_edge_trigger = 1'd0 ;
125
+ reg [ 1 :0 ] fall_edge_trigger = 1'd0 ;
126
+ reg [ 1 :0 ] high_level_trigger = 1'd0 ;
127
+ reg [ 1 :0 ] low_level_trigger = 1'd0 ;
128
+
115
129
reg [15 :0 ] adc_data_mn = 'd0;
116
130
reg [31 :0 ] trigger_holdoff_counter = 32'd0 ;
117
131
@@ -150,6 +164,18 @@ module axi_logic_analyzer #(
150
164
wire [31 :0 ] trigger_delay;
151
165
wire trigger_out_delayed;
152
166
167
+ wire [19 :0 ] pg_trigger_config;
168
+
169
+ wire [ 1 :0 ] pg_en_trigger_pins;
170
+ wire pg_en_trigger_adc;
171
+ wire pg_en_trigger_la;
172
+
173
+ wire [ 1 :0 ] pg_low_level;
174
+ wire [ 1 :0 ] pg_high_level;
175
+ wire [ 1 :0 ] pg_any_edge;
176
+ wire [ 1 :0 ] pg_rise_edge;
177
+ wire [ 1 :0 ] pg_fall_edge;
178
+
153
179
wire [31 :0 ] trigger_holdoff;
154
180
wire trigger_out_holdoff;
155
181
@@ -280,6 +306,47 @@ module axi_logic_analyzer #(
280
306
end
281
307
end
282
308
309
+ // pattern generator instrument triggering
310
+
311
+ assign pg_any_edge = pg_trigger_config[1 :0 ];
312
+ assign pg_rise_edge = pg_trigger_config[3 :2 ];
313
+ assign pg_fall_edge = pg_trigger_config[5 :4 ];
314
+ assign pg_low_level = pg_trigger_config[7 :6 ];
315
+ assign pg_high_level = pg_trigger_config[9 :8 ];
316
+
317
+ assign pg_en_trigger_pins = pg_trigger_config[17 :16 ];
318
+ assign pg_en_trigger_adc = pg_trigger_config[18 ];
319
+ assign pg_en_trigger_la = pg_trigger_config[19 ];
320
+
321
+ assign trigger_active = | pg_trigger_config[19 :16 ];
322
+ assign trigger = (ext_trigger & pg_en_trigger_pins) |
323
+ (trigger_adc_m2 & pg_en_trigger_adc) |
324
+ (trigger_out_s & pg_en_trigger_la);
325
+
326
+ assign ext_trigger = | (any_edge_trigger |
327
+ rise_edge_trigger |
328
+ fall_edge_trigger |
329
+ high_level_trigger |
330
+ low_level_trigger);
331
+
332
+ // sync
333
+ always @(posedge clk) begin
334
+ trigger_i_m1 <= trigger_i;
335
+ trigger_i_m2 <= trigger_i_m1;
336
+ trigger_i_m3 <= trigger_i_m2;
337
+
338
+ trigger_adc_m1 <= trigger_in;
339
+ trigger_adc_m2 <= trigger_adc_m1;
340
+ end
341
+
342
+ always @(posedge clk) begin
343
+ any_edge_trigger <= (trigger_i_m3 ^ trigger_i_m2) & pg_any_edge;
344
+ rise_edge_trigger <= (~ trigger_i_m3 & trigger_i_m2) & pg_rise_edge;
345
+ fall_edge_trigger <= (trigger_i_m3 & ~ trigger_i_m2) & pg_fall_edge;
346
+ high_level_trigger <= trigger_i_m3 & pg_high_level;
347
+ low_level_trigger <= ~ trigger_i_m3 & pg_low_level;
348
+ end
349
+
283
350
// upsampler pattern generator
284
351
285
352
always @(posedge clk_out) begin
@@ -288,12 +355,16 @@ module axi_logic_analyzer #(
288
355
dac_read <= 1'b0 ;
289
356
end else begin
290
357
dac_read <= 1'b0 ;
291
- if (upsampler_counter_pg < divider_counter_pg) begin
292
- upsampler_counter_pg <= upsampler_counter_pg + 1 ;
293
- end else begin
294
- upsampler_counter_pg <= 32'h0 ;
295
- dac_read <= 1'b1 ;
296
- end
358
+ pg_trigered <= trigger_active ? (trigger | pg_trigered) : 1'b0 ;
359
+ if (trigger_active & ! pg_trigered) begin
360
+ upsampler_counter_pg <= 32'h0 ;
361
+ dac_read <= 1'b0 ;
362
+ end else if (upsampler_counter_pg < divider_counter_pg) begin
363
+ upsampler_counter_pg <= upsampler_counter_pg + 1 ;
364
+ end else begin
365
+ upsampler_counter_pg <= 32'h0 ;
366
+ dac_read <= 1'b1 ;
367
+ end
297
368
end
298
369
end
299
370
@@ -377,6 +448,7 @@ module axi_logic_analyzer #(
377
448
.od_pp_n (od_pp_n),
378
449
379
450
.triggered (up_triggered),
451
+ .pg_trigger_config (pg_trigger_config),
380
452
381
453
.streaming(streaming),
382
454
0 commit comments