axi_logic_analyzer: equalize delay paths

- Add parameter for input data delay time to easily match the one of the
adc_trigger.
- Change the trigger delay path to match between the internal and
external(adc_trigger delays).
main
AndreiGrozav 2019-09-06 15:37:59 +03:00 committed by AndreiGrozav
parent 5e08e2d548
commit f5ac0f7019
2 changed files with 57 additions and 40 deletions

View File

@ -35,7 +35,13 @@
`timescale 1ns/100ps
module axi_logic_analyzer (
module axi_logic_analyzer #(
// add sample delays on LA to compensate for adc path delay
parameter ADC_PATH_DELAY = 19) (
// interface
input clk,
output clk_out,
@ -45,7 +51,7 @@ module axi_logic_analyzer (
output [15:0] data_t,
input [ 1:0] trigger_i,
output reg adc_valid,
output adc_valid,
output [15:0] adc_data,
input [15:0] dac_data,
@ -83,7 +89,6 @@ module axi_logic_analyzer (
// internal registers
reg [15:0] data_m1 = 'd0;
reg [15:0] data_r = 'd0;
reg [ 1:0] trigger_m1 = 'd0;
reg [31:0] downsampler_counter_la = 'd0;
@ -107,7 +112,7 @@ module axi_logic_analyzer (
reg streaming_on;
reg [15:0] adc_data_m2 = 'd0;
reg [15:0] adc_data_mn = 'd0;
// internal signals
@ -156,7 +161,7 @@ module axi_logic_analyzer (
assign trigger_out = trigger_delay == 32'h0 ? trigger_out_s | streaming_on : trigger_out_delayed | streaming_on;
assign trigger_out_delayed = delay_counter == 32'h0 ? 1 : 0;
assign adc_data = adc_data_m2;
assign adc_data = adc_data_mn;
always @(posedge clk_out) begin
if (trigger_delay == 0) begin
@ -218,26 +223,38 @@ module axi_logic_analyzer (
.I1 (data_i[0]),
.S (clock_select));
// synchronization
// - synchronization
// - compensate for m2k adc path delay
// - transfer data at clock frequency if capture is enabled
genvar j;
generate
reg [15:0] data_m[ADC_PATH_DELAY-2:0];
always @(posedge clk_out) begin
if (sample_valid_la == 1'b1) begin
data_m1 <= data_i;
trigger_m1 <= trigger_i;
data_m[0] <= data_i;
end
end
// transfer data at clock frequency
// if capture is enabled
for (j = 0; j < ADC_PATH_DELAY - 2; j = j + 1) begin
always @(posedge clk_out) begin
if (sample_valid_la == 1'b1) begin
data_m[j+1] <= data_m[j];
end
end
end
always @(posedge clk_out) begin
if (sample_valid_la == 1'b1) begin
adc_data_m2 <= data_m1;
adc_valid <= 1'b1;
end else begin
adc_valid <= 1'b0;
adc_data_mn <= data_m[ADC_PATH_DELAY-2];
end
end
endgenerate
assign adc_valid = sample_valid_la;
// downsampler logic analyzer
@ -295,7 +312,7 @@ module axi_logic_analyzer (
.clk (clk_out),
.reset (reset),
.data (adc_data_m2),
.data (adc_data_mn),
.data_valid(sample_valid_la),
.trigger_i (trigger_m1),
.trigger_in (trigger_in),
@ -329,7 +346,7 @@ module axi_logic_analyzer (
.clock_select (clock_select),
.overwrite_enable (overwrite_enable),
.overwrite_data (overwrite_data),
.input_data (adc_data_m2),
.input_data (adc_data_mn),
.od_pp_n (od_pp_n),
.triggered (up_triggered),

View File

@ -66,13 +66,11 @@ module axi_logic_analyzer_trigger (
reg trigger_active;
reg trigger_active_mux;
reg trigger_active_d1;
reg trigger_active_d2;
always @(posedge clk) begin
if (data_valid == 1'b1) begin
trigger_active_d1 <= trigger_active_mux;
trigger_active_d2 <= trigger_active_d1;
trigger_out <= trigger_active_d2;
trigger_out <= trigger_active_d1;
trigger_out_adc <= trigger_active_mux;
end
end
@ -82,14 +80,15 @@ module axi_logic_analyzer_trigger (
// 0 OR
// 1 AND
always @(*) begin
always @(posedge clk) begin
if (data_valid == 1'b1) begin
case (trigger_logic[0])
0: trigger_active = |((edge_detect & edge_detect_enable) |
0: trigger_active <= |((edge_detect & edge_detect_enable) |
(rise_edge & rise_edge_enable) |
(fall_edge & fall_edge_enable) |
(low_level & low_level_enable) |
(high_level & high_level_enable));
1: trigger_active = &((edge_detect | ~edge_detect_enable) &
1: trigger_active <= &((edge_detect | ~edge_detect_enable) &
(rise_edge | ~rise_edge_enable) &
(fall_edge | ~fall_edge_enable) &
(low_level | ~low_level_enable) &
@ -97,6 +96,7 @@ module axi_logic_analyzer_trigger (
default: trigger_active = 1'b1;
endcase
end
end
always @(*) begin
case (trigger_logic[6:4])