fix(fpga): F-0.1 wire AD9484 OR overrange pin into diagnostics
The AD9484 OR (overrange) LVDS pair is routed on the 50T main board to xc7a50t-ftg256 bank-14 pins M6/N6 but was previously left unconnected at the top level. Plumb it through the full stack so saturation at the raw ADC boundary shows up in the existing overflow aggregation: - ad9484_interface_400m: add adc_or_p/n inputs, IBUFDS + IDDR capture of both phases in the BUFIO domain, re-register into the clk_400m BUFG domain, OR rise|fall into adc_overrange_400m output. - radar_receiver_final: stickify adc_overrange_400m in clk_400m, CDC to clk_100m via a 2FF ASYNC_REG chain (same reasoning as F-1.2's cdc_cic_fir_overrun — single-bit, latched low→high, GPIO-class diagnostic), OR into the existing ddc_overflow_any aggregation. - radar_system_top: expose adc_or_p/n top-level ports and pass through. - xc7a50t_ftg256.xdc: anchor M6/N6 as LVDS_25 DIFF_TERM, with the same DCO-relative input-delay constraints as adc_d_p[*]. - xc7a200t_fbg484.xdc: IOSTANDARD/DIFF_TERM set; PACKAGE_PIN left as a documented TODO — the 200T dev-board schematic has not been checked and the 200T build will need the anchor filled in before place/route.
This commit is contained in:
@@ -9,6 +9,9 @@ module radar_receiver_final (
|
||||
input wire [7:0] adc_d_n, // ADC Data N (LVDS)
|
||||
input wire adc_dco_p, // Data Clock Output P (400MHz LVDS)
|
||||
input wire adc_dco_n, // Data Clock Output N (400MHz LVDS)
|
||||
// Audit F-0.1: AD9484 OR (overrange) LVDS pair
|
||||
input wire adc_or_p,
|
||||
input wire adc_or_n,
|
||||
output wire adc_pwdn,
|
||||
|
||||
// Chirp counter from transmitter (for matched filter indexing)
|
||||
@@ -206,18 +209,43 @@ wire adc_valid; // Data valid signal
|
||||
// ADC power-down control (directly tie low = ADC always on)
|
||||
assign adc_pwdn = 1'b0;
|
||||
|
||||
wire adc_overrange_400m;
|
||||
ad9484_interface_400m adc (
|
||||
.adc_d_p(adc_d_p),
|
||||
.adc_d_n(adc_d_n),
|
||||
.adc_dco_p(adc_dco_p),
|
||||
.adc_dco_n(adc_dco_n),
|
||||
.adc_or_p(adc_or_p),
|
||||
.adc_or_n(adc_or_n),
|
||||
.sys_clk(clk),
|
||||
.reset_n(reset_n),
|
||||
.adc_data_400m(adc_data_cmos),
|
||||
.adc_data_valid_400m(adc_valid),
|
||||
.adc_dco_bufg(clk_400m)
|
||||
.adc_dco_bufg(clk_400m),
|
||||
.adc_overrange_400m(adc_overrange_400m)
|
||||
);
|
||||
|
||||
// Audit F-0.1: stickify the 400 MHz OR pulse, then CDC to clk_100m via 2FF.
|
||||
// Same reasoning as ddc_cic_fir_overrun: single-bit, low→high-only once
|
||||
// latched, so a 2FF sync is sufficient for a GPIO-class diagnostic. Cleared
|
||||
// only by global reset_n.
|
||||
reg adc_overrange_sticky_400m;
|
||||
always @(posedge clk_400m or negedge reset_n) begin
|
||||
if (!reset_n)
|
||||
adc_overrange_sticky_400m <= 1'b0;
|
||||
else if (adc_overrange_400m)
|
||||
adc_overrange_sticky_400m <= 1'b1;
|
||||
end
|
||||
|
||||
(* ASYNC_REG = "TRUE" *) reg [1:0] adc_overrange_sync_100m;
|
||||
always @(posedge clk or negedge reset_n) begin
|
||||
if (!reset_n)
|
||||
adc_overrange_sync_100m <= 2'b00;
|
||||
else
|
||||
adc_overrange_sync_100m <= {adc_overrange_sync_100m[0], adc_overrange_sticky_400m};
|
||||
end
|
||||
wire adc_overrange_100m = adc_overrange_sync_100m[1];
|
||||
|
||||
// NOTE: The cdc_adc_to_processing instance that was here used src_clk=dst_clk=clk_400m
|
||||
// (same clock domain — no crossing). Gray-code CDC on same-clock with fast-changing
|
||||
// ADC data corrupts samples because Gray coding only guarantees safe transfer of
|
||||
@@ -270,7 +298,9 @@ ddc_400m_enhanced ddc(
|
||||
.cdc_cic_fir_overrun(ddc_cic_fir_overrun)
|
||||
);
|
||||
|
||||
assign ddc_overflow_any = ddc_mixer_saturation | ddc_filter_overflow;
|
||||
// Audit F-0.1: AD9484 overrange aggregated here so a single gpio_dig bit
|
||||
// covers DDC-internal saturation, FIR overflow, AND raw ADC clipping.
|
||||
assign ddc_overflow_any = ddc_mixer_saturation | ddc_filter_overflow | adc_overrange_100m;
|
||||
assign ddc_saturation_count = ddc_diagnostics_w[7:5];
|
||||
|
||||
ddc_input_interface ddc_if (
|
||||
|
||||
Reference in New Issue
Block a user