From 02925ac34eb67203b9c142d49f31ad863ff37f06 Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:38:59 +0545 Subject: [PATCH] fix: align all range/carrier/velocity values to PLFM hardware + FPGA bug fixes - Correct carrier from 10.525/10 GHz to 10.5 GHz (verified ADF4382 config) - Correct range-per-bin from 4.8/5.6/781.25 m to 24.0 m (matched-filter) - Correct velocity resolution from 1.484 to 2.67 m/s/bin (PRI-based) - Correct processing rate from 4 MSPS to 100 MSPS (post-DDC) - Correct max range from 307/5000/50000 m to 1536 m (64 bins x 24 m) - Add WaveformConfig.pri_s field (167 us PRI for velocity calculation) - Fix short chirp chirp_complete deadlock (Bug A) - Remove dead short_chirp ports, rename long_chirp to ref_chirp (Bug B) - Fix stale latency comment 2159 -> 3187 cycles (Bug C) - Create radar_params.vh as single source of truth for FPGA parameters - Lower RadarSettings.cpp map_size validation bound from 1000 to 100 - Add PLFM hardware constants to golden_reference.py - Update all GUI versions, tests, and cross-layer contracts All 244 tests passing (167 Python + 21 MCU + 29 cross-layer + 27 FPGA) --- 8_Utils/Python/LUT.py | 5 +- .../9_1_1_C_Cpp_Libraries/RadarSettings.cpp | 12 +- .../9_2_FPGA/matched_filter_multi_segment.v | 16 +- .../matched_filter_processing_chain.v | 26 +- 9_Firmware/9_2_FPGA/radar_params.vh | 200 ++ 9_Firmware/9_2_FPGA/radar_receiver_final.v | 24 +- .../tb/cosim/real_data/golden_reference.py | 21 +- .../tb/cosim/rx_final_doppler_out.csv | 2049 ---------------- .../9_2_FPGA/tb/cosim/validate_mem_files.py | 6 +- .../9_2_FPGA/tb/golden/golden_doppler.mem | 2176 ----------------- .../tb/tb_matched_filter_processing_chain.v | 82 +- 9_Firmware/9_2_FPGA/tb/tb_mf_chain_synth.v | 70 +- 9_Firmware/9_2_FPGA/tb/tb_mf_cosim.v | 28 +- 9_Firmware/9_2_FPGA/tb/tb_multiseg_cosim.v | 26 +- 9_Firmware/9_3_GUI/GUI_PyQt_Map.py | 10 +- 9_Firmware/9_3_GUI/GUI_V5.py | 10 +- 9_Firmware/9_3_GUI/GUI_V5_Demo.py | 10 +- 9_Firmware/9_3_GUI/GUI_V6.py | 10 +- 9_Firmware/9_3_GUI/GUI_V65_Tk.py | 24 +- 9_Firmware/9_3_GUI/GUI_V6_Demo.py | 4 +- 9_Firmware/9_3_GUI/adi_agc_analysis.py | 338 --- 9_Firmware/9_3_GUI/test_v7.py | 36 +- 9_Firmware/9_3_GUI/v7/map_widget.py | 2 +- 9_Firmware/9_3_GUI/v7/models.py | 46 +- 9_Firmware/9_3_GUI/v7/workers.py | 2 +- .../cross_layer/test_cross_layer_contract.py | 8 +- 26 files changed, 415 insertions(+), 4826 deletions(-) create mode 100644 9_Firmware/9_2_FPGA/radar_params.vh delete mode 100644 9_Firmware/9_2_FPGA/tb/cosim/rx_final_doppler_out.csv delete mode 100644 9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem delete mode 100644 9_Firmware/9_3_GUI/adi_agc_analysis.py diff --git a/8_Utils/Python/LUT.py b/8_Utils/Python/LUT.py index 56a4cb1..f23d467 100644 --- a/8_Utils/Python/LUT.py +++ b/8_Utils/Python/LUT.py @@ -1,7 +1,10 @@ import numpy as np # Define parameters -fs = 120e6 # Sampling frequency +# NOTE: This is a standalone LUT generation utility. The production chirp LUT +# is generated by 9_Firmware/9_2_FPGA/tb/cosim/gen_chirp_mem.py with +# CHIRP_BW=20e6 (target: 30e6 Phase 1) and DAC_CLK=120e6. +fs = 120e6 # Sampling frequency (DAC clock from AD9523 OUT10) Ts = 1 / fs # Sampling time Tb = 1e-6 # Burst time Tau = 30e-6 # Pulse repetition time diff --git a/9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/RadarSettings.cpp b/9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/RadarSettings.cpp index be6f9bd..476985b 100644 --- a/9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/RadarSettings.cpp +++ b/9_Firmware/9_1_Microcontroller/9_1_1_C_Cpp_Libraries/RadarSettings.cpp @@ -6,16 +6,16 @@ RadarSettings::RadarSettings() { } void RadarSettings::resetToDefaults() { - system_frequency = 10.0e9; // 10 GHz - chirp_duration_1 = 30.0e-6; // 30 �s - chirp_duration_2 = 0.5e-6; // 0.5 �s + system_frequency = 10.5e9; // 10.5 GHz (PLFM TX LO, ADF4382 config) + chirp_duration_1 = 30.0e-6; // 30 µs + chirp_duration_2 = 0.5e-6; // 0.5 µs chirps_per_position = 32; freq_min = 10.0e6; // 10 MHz freq_max = 30.0e6; // 30 MHz prf1 = 1000.0; // 1 kHz prf2 = 2000.0; // 2 kHz - max_distance = 50000.0; // 50 km - map_size = 50000.0; // 50 km + max_distance = 1536.0; // 1536 m (64 bins × 24 m, 3 km mode) + map_size = 1536.0; // 1536 m settings_valid = true; } @@ -88,7 +88,7 @@ bool RadarSettings::validateSettings() { if (prf1 < 100 || prf1 > 10000) return false; if (prf2 < 100 || prf2 > 10000) return false; if (max_distance < 100 || max_distance > 100000) return false; - if (map_size < 1000 || map_size > 200000) return false; + if (map_size < 100 || map_size > 200000) return false; return true; } diff --git a/9_Firmware/9_2_FPGA/matched_filter_multi_segment.v b/9_Firmware/9_2_FPGA/matched_filter_multi_segment.v index 720545d..a913feb 100644 --- a/9_Firmware/9_2_FPGA/matched_filter_multi_segment.v +++ b/9_Firmware/9_2_FPGA/matched_filter_multi_segment.v @@ -18,10 +18,9 @@ module matched_filter_multi_segment ( input wire mc_new_elevation, // Toggle for new elevation (32) input wire mc_new_azimuth, // Toggle for new azimuth (50) - input wire [15:0] long_chirp_real, - input wire [15:0] long_chirp_imag, - input wire [15:0] short_chirp_real, - input wire [15:0] short_chirp_imag, + // Reference chirp (upstream memory loader selects long/short via use_long_chirp) + input wire [15:0] ref_chirp_real, + input wire [15:0] ref_chirp_imag, // Memory system interface output reg [1:0] segment_request, @@ -244,6 +243,7 @@ always @(posedge clk or negedge reset_n) begin if (!use_long_chirp) begin if (chirp_samples_collected >= SHORT_CHIRP_SAMPLES - 1) begin state <= ST_ZERO_PAD; + chirp_complete <= 1; // Bug A fix: mark chirp done so ST_OUTPUT exits to IDLE `ifdef SIMULATION $display("[MULTI_SEG_FIXED] Short chirp: collected %d samples, starting zero-pad", chirp_samples_collected + 1); @@ -500,11 +500,9 @@ matched_filter_processing_chain m_f_p_c( // Chirp Selection .chirp_counter(chirp_counter), - // Reference Chirp Memory Interfaces - .long_chirp_real(long_chirp_real), - .long_chirp_imag(long_chirp_imag), - .short_chirp_real(short_chirp_real), - .short_chirp_imag(short_chirp_imag), + // Reference Chirp Memory Interface (single pair — upstream selects long/short) + .ref_chirp_real(ref_chirp_real), + .ref_chirp_imag(ref_chirp_imag), // Output .range_profile_i(fft_pc_i), diff --git a/9_Firmware/9_2_FPGA/matched_filter_processing_chain.v b/9_Firmware/9_2_FPGA/matched_filter_processing_chain.v index 287a72e..b99f02e 100644 --- a/9_Firmware/9_2_FPGA/matched_filter_processing_chain.v +++ b/9_Firmware/9_2_FPGA/matched_filter_processing_chain.v @@ -15,7 +15,7 @@ * .clk, .reset_n * .adc_data_i, .adc_data_q, .adc_valid <- from input buffer * .chirp_counter <- 6-bit frame counter - * .long_chirp_real/imag, .short_chirp_real/imag <- reference (time-domain) + * .ref_chirp_real/imag <- reference (time-domain) * .range_profile_i, .range_profile_q, .range_profile_valid -> output * .chain_state -> 4-bit status * @@ -48,10 +48,10 @@ module matched_filter_processing_chain ( input wire [5:0] chirp_counter, // Reference chirp (time-domain, latency-aligned by upstream buffer) - input wire [15:0] long_chirp_real, - input wire [15:0] long_chirp_imag, - input wire [15:0] short_chirp_real, - input wire [15:0] short_chirp_imag, + // Upstream chirp_memory_loader_param selects long/short reference + // via use_long_chirp — this single pair carries whichever is active. + input wire [15:0] ref_chirp_real, + input wire [15:0] ref_chirp_imag, // Output: range profile (pulse-compressed) output wire signed [15:0] range_profile_i, @@ -189,8 +189,8 @@ always @(posedge clk or negedge reset_n) begin // Store first sample (signal + reference) fwd_buf_i[0] <= $signed(adc_data_i); fwd_buf_q[0] <= $signed(adc_data_q); - ref_buf_i[0] <= $signed(long_chirp_real); - ref_buf_q[0] <= $signed(long_chirp_imag); + ref_buf_i[0] <= $signed(ref_chirp_real); + ref_buf_q[0] <= $signed(ref_chirp_imag); fwd_in_count <= 1; state <= ST_FWD_FFT; end @@ -205,8 +205,8 @@ always @(posedge clk or negedge reset_n) begin if (adc_valid && fwd_in_count < FFT_SIZE) begin fwd_buf_i[fwd_in_count] <= $signed(adc_data_i); fwd_buf_q[fwd_in_count] <= $signed(adc_data_q); - ref_buf_i[fwd_in_count] <= $signed(long_chirp_real); - ref_buf_q[fwd_in_count] <= $signed(long_chirp_imag); + ref_buf_i[fwd_in_count] <= $signed(ref_chirp_real); + ref_buf_q[fwd_in_count] <= $signed(ref_chirp_imag); fwd_in_count <= fwd_in_count + 1; end @@ -775,16 +775,16 @@ always @(posedge clk) begin : ref_bram_port if (adc_valid) begin we = 1'b1; addr = 0; - wdata_i = $signed(long_chirp_real); - wdata_q = $signed(long_chirp_imag); + wdata_i = $signed(ref_chirp_real); + wdata_q = $signed(ref_chirp_imag); end end ST_COLLECT: begin if (adc_valid && collect_count < FFT_SIZE) begin we = 1'b1; addr = collect_count[ADDR_BITS-1:0]; - wdata_i = $signed(long_chirp_real); - wdata_q = $signed(long_chirp_imag); + wdata_i = $signed(ref_chirp_real); + wdata_q = $signed(ref_chirp_imag); end end ST_REF_FFT: begin diff --git a/9_Firmware/9_2_FPGA/radar_params.vh b/9_Firmware/9_2_FPGA/radar_params.vh new file mode 100644 index 0000000..20e442d --- /dev/null +++ b/9_Firmware/9_2_FPGA/radar_params.vh @@ -0,0 +1,200 @@ +// ============================================================================ +// radar_params.vh — Single Source of Truth for AERIS-10 FPGA Parameters +// ============================================================================ +// +// ALL modules in the FPGA processing chain MUST `include this file instead of +// hardcoding range bins, segment counts, chirp samples, or timing values. +// +// This file uses `define macros (not localparam) so it can be included at any +// scope. Each consuming module should include this file inside its body and +// optionally alias macros to localparams for readability. +// +// BOARD VARIANTS: +// SUPPORT_LONG_RANGE = 0 (50T, USB_MODE=1) — 3 km mode only, 64 range bins +// SUPPORT_LONG_RANGE = 1 (200T, USB_MODE=0) — 3 km + 20 km modes, up to 1024 bins +// +// RANGE MODES (runtime, via host_range_mode register, opcode 0x20): +// 2'b00 = 3 km (default on both boards) +// 2'b01 = 20 km (200T only; clamped to 3 km on 50T) +// 2'b10 = Reserved +// 2'b11 = Reserved +// +// USAGE: +// `include "radar_params.vh" +// Then reference `RP_FFT_SIZE, `RP_MAX_OUTPUT_BINS, etc. +// +// PHYSICAL CONSTANTS (derived from hardware): +// ADC clock: 400 MSPS +// CIC decimation: 4x +// Processing rate: 100 MSPS (post-DDC) +// Range per sample: c / (2 * 100e6) = 1.5 m +// Decimation factor: 16 (1024 FFT bins -> 64 output bins per segment) +// Range per dec. bin: 1.5 m * 16 = 24.0 m +// Carrier frequency: 10.5 GHz +// +// CHIRP BANDWIDTH (Phase 1 target — currently 20 MHz, planned 30 MHz): +// Range resolution: c / (2 * BW) +// 20 MHz -> 7.5 m +// 30 MHz -> 5.0 m +// NOTE: Range resolution is independent of range-per-bin. Resolution +// determines the minimum separation between two targets; range-per-bin +// determines the spatial sampling grid. +// ============================================================================ + +`ifndef RADAR_PARAMS_VH +`define RADAR_PARAMS_VH + +// ============================================================================ +// BOARD VARIANT — set at synthesis time, NOT runtime +// ============================================================================ +// Default to 50T (conservative). Override in top-level or synthesis script: +// +define+SUPPORT_LONG_RANGE +// or via Vivado: set_property verilog_define {SUPPORT_LONG_RANGE} [current_fileset] + +// Note: SUPPORT_LONG_RANGE is a flag define (ifdef/ifndef), not a value. +// `ifndef SUPPORT_LONG_RANGE means 50T (no long range). +// `ifdef SUPPORT_LONG_RANGE means 200T (long range supported). + +// ============================================================================ +// FFT AND PROCESSING CONSTANTS (fixed, both modes) +// ============================================================================ + +`define RP_FFT_SIZE 1024 // Range FFT points per segment +`define RP_OVERLAP_SAMPLES 128 // Overlap between adjacent segments +`define RP_SEGMENT_ADVANCE 896 // FFT_SIZE - OVERLAP = 1024 - 128 +`define RP_DECIMATION_FACTOR 16 // Range bin decimation (1024 -> 64) +`define RP_BINS_PER_SEGMENT 64 // FFT_SIZE / DECIMATION_FACTOR +`define RP_DOPPLER_FFT_SIZE 16 // Per sub-frame Doppler FFT +`define RP_CHIRPS_PER_FRAME 32 // Total chirps (16 long + 16 short) +`define RP_CHIRPS_PER_SUBFRAME 16 // Chirps per Doppler sub-frame +`define RP_NUM_DOPPLER_BINS 32 // 2 sub-frames * 16 = 32 +`define RP_DATA_WIDTH 16 // ADC/processing data width + +// ============================================================================ +// 3 KM MODE PARAMETERS (both 50T and 200T) +// ============================================================================ + +`define RP_LONG_CHIRP_SAMPLES_3KM 3000 // 30 us at 100 MSPS +`define RP_LONG_SEGMENTS_3KM 4 // ceil((3000-1024)/896) + 1 = 4 +`define RP_OUTPUT_RANGE_BINS_3KM 64 // Downstream pipeline expects 64 range bins (NOTE: will become 128 after 2048-pt FFT upgrade) +`define RP_SHORT_CHIRP_SAMPLES 50 // 0.5 us at 100 MSPS (same both modes) +`define RP_SHORT_SEGMENTS 1 // Single segment for short chirp + +// Derived 3 km limits +`define RP_MAX_RANGE_3KM 1536 // 64 bins * 24 m = 1536 m + +// ============================================================================ +// 20 KM MODE PARAMETERS (200T only) +// ============================================================================ + +`define RP_LONG_CHIRP_SAMPLES_20KM 13700 // 137 us at 100 MSPS (= listen window) +`define RP_LONG_SEGMENTS_20KM 16 // ceil((13700-1024)/896) + 1 = 16 +`define RP_OUTPUT_RANGE_BINS_20KM 1024 // 16 segments * 64 dec. bins each + +// Derived 20 km limits +`define RP_MAX_RANGE_20KM 24576 // 1024 bins * 24 m = 24576 m + +// ============================================================================ +// MAX VALUES (for sizing buffers — compile-time, based on board variant) +// ============================================================================ + +`ifdef SUPPORT_LONG_RANGE + `define RP_MAX_SEGMENTS 16 + `define RP_MAX_OUTPUT_BINS 1024 + `define RP_MAX_CHIRP_SAMPLES 13700 +`else + `define RP_MAX_SEGMENTS 4 + `define RP_MAX_OUTPUT_BINS 64 + `define RP_MAX_CHIRP_SAMPLES 3000 +`endif + +// ============================================================================ +// BIT WIDTHS (derived from MAX values) +// ============================================================================ + +// Segment index: ceil(log2(MAX_SEGMENTS)) +// 50T: log2(4) = 2 bits +// 200T: log2(16) = 4 bits +`ifdef SUPPORT_LONG_RANGE + `define RP_SEGMENT_IDX_WIDTH 4 + `define RP_RANGE_BIN_WIDTH 10 + `define RP_CHIRP_MEM_ADDR_W 14 // log2(16*1024) = 14 + `define RP_DOPPLER_MEM_ADDR_W 15 // log2(1024*32) = 15 + `define RP_CFAR_MAG_ADDR_W 15 // log2(1024*32) = 15 +`else + `define RP_SEGMENT_IDX_WIDTH 2 + `define RP_RANGE_BIN_WIDTH 6 + `define RP_CHIRP_MEM_ADDR_W 12 // log2(4*1024) = 12 + `define RP_DOPPLER_MEM_ADDR_W 11 // log2(64*32) = 11 + `define RP_CFAR_MAG_ADDR_W 11 // log2(64*32) = 11 +`endif + +// Derived depths (for memory declarations) +// Usage: reg [15:0] mem [0:`RP_CHIRP_MEM_DEPTH-1]; +`define RP_CHIRP_MEM_DEPTH (`RP_MAX_SEGMENTS * `RP_FFT_SIZE) +`define RP_DOPPLER_MEM_DEPTH (`RP_MAX_OUTPUT_BINS * `RP_CHIRPS_PER_FRAME) +`define RP_CFAR_MAG_DEPTH (`RP_MAX_OUTPUT_BINS * `RP_NUM_DOPPLER_BINS) + +// ============================================================================ +// CHIRP TIMING DEFAULTS (100 MHz clock cycles) +// ============================================================================ +// Reset defaults for host-configurable timing registers. +// Match radar_mode_controller.v parameters and main.cpp STM32 defaults. + +`define RP_DEF_LONG_CHIRP_CYCLES 3000 // 30 us +`define RP_DEF_LONG_LISTEN_CYCLES 13700 // 137 us +`define RP_DEF_GUARD_CYCLES 17540 // 175.4 us +`define RP_DEF_SHORT_CHIRP_CYCLES 50 // 0.5 us +`define RP_DEF_SHORT_LISTEN_CYCLES 17450 // 174.5 us +`define RP_DEF_CHIRPS_PER_ELEV 32 + +// ============================================================================ +// BLIND ZONE CONSTANTS (informational, for comments and GUI) +// ============================================================================ +// Long chirp blind zone: c * 30 us / 2 = 4500 m +// Short chirp blind zone: c * 0.5 us / 2 = 75 m + +`define RP_LONG_BLIND_ZONE_M 4500 +`define RP_SHORT_BLIND_ZONE_M 75 + +// ============================================================================ +// PHYSICAL CONSTANTS (integer-scaled for Verilog — use in comments/assertions) +// ============================================================================ +// Range per ADC sample: 1.5 m (stored as 15 in units of 0.1 m) +// Range per decimated bin: 24.0 m (stored as 240 in units of 0.1 m) +// Processing rate: 100 MSPS + +`define RP_RANGE_PER_SAMPLE_DM 15 // 1.5 m in decimeters +`define RP_RANGE_PER_BIN_DM 240 // 24.0 m in decimeters +`define RP_PROCESSING_RATE_MHZ 100 + +// ============================================================================ +// AGC DEFAULTS +// ============================================================================ +`define RP_DEF_AGC_TARGET 200 +`define RP_DEF_AGC_ATTACK 1 +`define RP_DEF_AGC_DECAY 1 +`define RP_DEF_AGC_HOLDOFF 4 + +// ============================================================================ +// CFAR DEFAULTS +// ============================================================================ +`define RP_DEF_CFAR_GUARD 2 +`define RP_DEF_CFAR_TRAIN 8 +`define RP_DEF_CFAR_ALPHA 8'h30 // 3.0 in Q4.4 +`define RP_DEF_CFAR_MODE 2'b00 // CA-CFAR + +// ============================================================================ +// DETECTION DEFAULTS +// ============================================================================ +`define RP_DEF_DETECT_THRESHOLD 10000 + +// ============================================================================ +// RANGE MODE ENCODING +// ============================================================================ +`define RP_RANGE_MODE_3KM 2'b00 +`define RP_RANGE_MODE_20KM 2'b01 +`define RP_RANGE_MODE_RSVD2 2'b10 +`define RP_RANGE_MODE_RSVD3 2'b11 + +`endif // RADAR_PARAMS_VH diff --git a/9_Firmware/9_2_FPGA/radar_receiver_final.v b/9_Firmware/9_2_FPGA/radar_receiver_final.v index 4be1571..a7300e0 100644 --- a/9_Firmware/9_2_FPGA/radar_receiver_final.v +++ b/9_Firmware/9_2_FPGA/radar_receiver_final.v @@ -102,9 +102,9 @@ wire [7:0] gc_saturation_count; // Diagnostic: per-frame clipped sample counter wire [7:0] gc_peak_magnitude; // Diagnostic: per-frame peak magnitude wire [3:0] gc_current_gain; // Diagnostic: effective gain_shift -// Reference signals for the processing chain -wire [15:0] long_chirp_real, long_chirp_imag; -wire [15:0] short_chirp_real, short_chirp_imag; +// Reference signal for the processing chain (carries long OR short ref +// depending on use_long_chirp — selected by chirp_memory_loader_param) +wire [15:0] ref_chirp_real, ref_chirp_imag; // ========== DOPPLER PROCESSING SIGNALS ========== wire [31:0] range_data_32bit; @@ -292,7 +292,8 @@ end // sample_addr_wire removed — was unused implicit wire (synthesis warning) // 4. CRITICAL: Reference Chirp Latency Buffer -// This aligns reference data with FFT output (2159 cycle delay) +// This aligns reference data with FFT output (3187 cycle delay) +// TODO: verify empirically during hardware bring-up with correlation test wire [15:0] delayed_ref_i, delayed_ref_q; wire mem_ready_delayed; @@ -308,11 +309,10 @@ latency_buffer #( .valid_out(mem_ready_delayed) ); -// Assign delayed reference signals -assign long_chirp_real = delayed_ref_i; -assign long_chirp_imag = delayed_ref_q; -assign short_chirp_real = delayed_ref_i; -assign short_chirp_imag = delayed_ref_q; +// Assign delayed reference signals (single pair — chirp_memory_loader_param +// selects long/short reference upstream via use_long_chirp) +assign ref_chirp_real = delayed_ref_i; +assign ref_chirp_imag = delayed_ref_q; // 5. Dual Chirp Matched Filter @@ -336,10 +336,8 @@ matched_filter_multi_segment mf_dual ( .mc_new_chirp(mc_new_chirp), .mc_new_elevation(mc_new_elevation), .mc_new_azimuth(mc_new_azimuth), - .long_chirp_real(delayed_ref_i), // From latency buffer - .long_chirp_imag(delayed_ref_q), - .short_chirp_real(delayed_ref_i), // Same for short chirp - .short_chirp_imag(delayed_ref_q), + .ref_chirp_real(delayed_ref_i), // From latency buffer (long or short ref) + .ref_chirp_imag(delayed_ref_q), .segment_request(segment_request), .mem_request(mem_request), .sample_addr_out(sample_addr_from_chain), diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/golden_reference.py b/9_Firmware/9_2_FPGA/tb/cosim/real_data/golden_reference.py index 9b0ca86..9058461 100644 --- a/9_Firmware/9_2_FPGA/tb/cosim/real_data/golden_reference.py +++ b/9_Firmware/9_2_FPGA/tb/cosim/real_data/golden_reference.py @@ -2,8 +2,8 @@ """ golden_reference.py — AERIS-10 FPGA bit-accurate golden reference model -Uses ADI CN0566 Phaser radar data (10.525 GHz X-band FMCW) to validate -the FPGA signal processing pipeline stage by stage: +Uses ADI CN0566 Phaser radar data (10.525 GHz, used as test stimulus only) to +validate the FPGA signal processing pipeline stage by stage: ADC → DDC (NCO+mixer+CIC+FIR) → Range FFT → Doppler FFT → Detection @@ -90,7 +90,8 @@ HAMMING_Q15 = [ 0x3088, 0x1B6D, 0x0E5C, 0x0A3D, ] -# ADI dataset parameters +# ADI dataset parameters — used ONLY for loading/requantizing ADI Phaser test data. +# These are NOT PLFM hardware parameters. See AERIS-10 constants below. ADI_SAMPLE_RATE = 4e6 # 4 MSPS ADI_IF_FREQ = 100e3 # 100 kHz IF ADI_RF_FREQ = 9.9e9 # 9.9 GHz @@ -99,9 +100,17 @@ ADI_RAMP_TIME = 300e-6 # 300 us ADI_NUM_CHIRPS = 256 ADI_SAMPLES_PER_CHIRP = 1079 -# AERIS-10 parameters -AERIS_FS = 400e6 # 400 MHz ADC clock -AERIS_IF = 120e6 # 120 MHz IF +# AERIS-10 hardware parameters (from ADF4382/AD9523/main.cpp configuration) +AERIS_FS = 400e6 # 400 MHz ADC clock (AD9523 OUT4) +AERIS_IF = 120e6 # 120 MHz IF (TX 10.5 GHz - RX 10.38 GHz) +AERIS_FS_PROCESSING = 100e6 # Post-DDC rate (400 MSPS / 4x CIC) +AERIS_CARRIER_HZ = 10.5e9 # TX LO (ADF4382, verified) +AERIS_RX_LO_HZ = 10.38e9 # RX LO (ADF4382) +AERIS_CHIRP_BW = 20e6 # Chirp bandwidth (target: 30 MHz Phase 1) +AERIS_LONG_CHIRP_S = 30e-6 # Long chirp duration +AERIS_PRI_S = 167e-6 # Pulse repetition interval +AERIS_DECIMATION = 16 # Range bin decimation (1024 → 64) +AERIS_RANGE_PER_BIN = 24.0 # Meters per decimated bin # =========================================================================== diff --git a/9_Firmware/9_2_FPGA/tb/cosim/rx_final_doppler_out.csv b/9_Firmware/9_2_FPGA/tb/cosim/rx_final_doppler_out.csv deleted file mode 100644 index b0bdf5c..0000000 --- a/9_Firmware/9_2_FPGA/tb/cosim/rx_final_doppler_out.csv +++ /dev/null @@ -1,2049 +0,0 @@ -cycle,range_bin,doppler_bin,output_hex -1035995000,0,0,0024ffdd -1036005000,0,1,fff7002d -1036015000,0,2,007d0098 -1036025000,0,3,ff1afe23 -1036035000,0,4,00130108 -1036045000,0,5,ff530243 -1036055000,0,6,0274fb9d -1036065000,0,7,fee40370 -1036075000,0,8,fe98ff6f -1036085000,0,9,ff8bffa9 -1036095000,0,10,03dffdd0 -1036105000,0,11,fe3c042d -1036115000,0,12,fdddfcc0 -1036125000,0,13,00ff00cb -1036135000,0,14,015400f7 -1036145000,0,15,ff22ff4c -1038025000,0,16,ffedfff1 -1038035000,0,17,00880078 -1038045000,0,18,fe31ffb7 -1038055000,0,19,026c00de -1038065000,0,20,fd2afd6f -1038075000,0,21,0293ffc3 -1038085000,0,22,fef10677 -1038095000,0,23,ff6efadf -1038105000,0,24,008900ad -1038115000,0,25,017a0014 -1038125000,0,26,fdc301a1 -1038135000,0,27,020cff8e -1038145000,0,28,fce0ffbb -1038155000,0,29,025f00b1 -1038165000,0,30,fe73fff1 -1038175000,0,31,008effbd -1040055000,1,0,ffcd0030 -1040065000,1,1,009d0057 -1040075000,1,2,fecbff41 -1040085000,1,3,0110007a -1040095000,1,4,0148ff8e -1040105000,1,5,fd2e0229 -1040115000,1,6,ffe5fd1c -1040125000,1,7,0483ffb6 -1040135000,1,8,fb2f02ce -1040145000,1,9,02110069 -1040155000,1,10,0095fb47 -1040165000,1,11,ffd003b8 -1040175000,1,12,fdfcfdac -1040185000,1,13,011801c3 -1040195000,1,14,0023003c -1040205000,1,15,0001ff54 -1042085000,1,16,004fffd0 -1042095000,1,17,0078fee5 -1042105000,1,18,fed201e1 -1042115000,1,19,0097fe5a -1042125000,1,20,00ab0130 -1042135000,1,21,ff73febb -1042145000,1,22,00f301a4 -1042155000,1,23,fea60124 -1042165000,1,24,fe03fe84 -1042175000,1,25,0184fea7 -1042185000,1,26,ff1cffeb -1042195000,1,27,03210146 -1042205000,1,28,fc5fff84 -1042215000,1,29,017d0025 -1042225000,1,30,0053ff88 -1042235000,1,31,fef600b0 -1044115000,2,0,00260082 -1044125000,2,1,ff99ff96 -1044135000,2,2,016e0095 -1044145000,2,3,0034ff2d -1044155000,2,4,fce100d7 -1044165000,2,5,0276ff6c -1044175000,2,6,00a0ffaa -1044185000,2,7,fdc400b8 -1044195000,2,8,01dcffc4 -1044205000,2,9,fe1901ae -1044215000,2,10,0304fcf3 -1044225000,2,11,fe240203 -1044235000,2,12,0031fe2f -1044245000,2,13,fefc0150 -1044255000,2,14,0182006a -1044265000,2,15,ff18ff30 -1046145000,2,16,005bff79 -1046155000,2,17,0004ffcc -1046165000,2,18,fef70100 -1046175000,2,19,0136fe70 -1046185000,2,20,ffb80156 -1046195000,2,21,01b1feff -1046205000,2,22,fdac03d6 -1046215000,2,23,fdfafa69 -1046225000,2,24,0289032f -1046235000,2,25,feacfecc -1046245000,2,26,004dffb2 -1046255000,2,27,00d60062 -1046265000,2,28,fee0fe8e -1046275000,2,29,020f0245 -1046285000,2,30,fda4feac -1046295000,2,31,006a0079 -1048175000,3,0,ffe10086 -1048185000,3,1,0026ffcd -1048195000,3,2,00990030 -1048205000,3,3,ffe4ff8a -1048215000,3,4,fe7100c5 -1048225000,3,5,0179ffc6 -1048235000,3,6,ff2ffd5e -1048245000,3,7,01ed0473 -1048255000,3,8,fbd9fdf4 -1048265000,3,9,037800d1 -1048275000,3,10,0033fe0a -1048285000,3,11,ff4202c0 -1048295000,3,12,ffa5fc5d -1048305000,3,13,ffa90298 -1048315000,3,14,00950004 -1048325000,3,15,ffcdff0f -1050205000,3,16,00fdffc2 -1050215000,3,17,ff790028 -1050225000,3,18,ffa70037 -1050235000,3,19,ff03000a -1050245000,3,20,015cfe75 -1050255000,3,21,00850151 -1050265000,3,22,fe83fec3 -1050275000,3,23,029e02b0 -1050285000,3,24,f995fb6c -1050295000,3,25,072302fc -1050305000,3,26,fd0dfef3 -1050315000,3,27,006300bc -1050325000,3,28,ff8efe5d -1050335000,3,29,00ef0193 -1050345000,3,30,ff8dffbb -1050355000,3,31,ff0cffba -1052235000,4,0,ffcb0066 -1052245000,4,1,0050fffb -1052255000,4,2,ffe0fed3 -1052265000,4,3,ffa40100 -1052275000,4,4,00b60022 -1052285000,4,5,fe7cffd3 -1052295000,4,6,0039000a -1052305000,4,7,02ccfed9 -1052315000,4,8,f9eb01a6 -1052325000,4,9,061800f3 -1052335000,4,10,fd90fe8d -1052345000,4,11,00fa013e -1052355000,4,12,fedcfd16 -1052365000,4,13,015401e7 -1052375000,4,14,fee700b2 -1052385000,4,15,0086fee1 -1054265000,4,16,0016ffea -1054275000,4,17,0041ffa2 -1054285000,4,18,000b0138 -1054295000,4,19,ff6aff83 -1054305000,4,20,001fff0e -1054315000,4,21,feb400ab -1054325000,4,22,02910079 -1054335000,4,23,fe2b01c7 -1054345000,4,24,fd2afd74 -1054355000,4,25,06d7ff6e -1054365000,4,26,fb1d0056 -1054375000,4,27,04a2003b -1054385000,4,28,f9bd02cc -1054395000,4,29,03c4fe85 -1054405000,4,30,fef3ffa1 -1054415000,4,31,ffb1005b -1056295000,5,0,ffbd003f -1056305000,5,1,0098007e -1056315000,5,2,fed5fe93 -1056325000,5,3,00f30177 -1056335000,5,4,0051febd -1056345000,5,5,fe7d0440 -1056355000,5,6,019bfb1a -1056365000,5,7,014cff8a -1056375000,5,8,fd6b039f -1056385000,5,9,0104fdc4 -1056395000,5,10,ff77ffa3 -1056405000,5,11,0059012b -1056415000,5,12,ffa3ff59 -1056425000,5,13,0073002a -1056435000,5,14,ffcd0094 -1056445000,5,15,000cff50 -1058325000,5,16,00a20046 -1058335000,5,17,006fff8c -1058345000,5,18,fd68015d -1058355000,5,19,02c6fcac -1058365000,5,20,fffb02b4 -1058375000,5,21,ff45fea6 -1058385000,5,22,ff1200ce -1058395000,5,23,02840190 -1058405000,5,24,fdbcfc60 -1058415000,5,25,02e10144 -1058425000,5,26,0016fff3 -1058435000,5,27,fd92012a -1058445000,5,28,00af000e -1058455000,5,29,ff4ffebe -1058465000,5,30,02100082 -1058475000,5,31,fe78ffbe -1060355000,6,0,0082ff86 -1060365000,6,1,ff1800e6 -1060375000,6,2,0081fef2 -1060385000,6,3,015c009b -1060395000,6,4,fe04feb0 -1060405000,6,5,009a013d -1060415000,6,6,010efe57 -1060425000,6,7,fc9002f3 -1060435000,6,8,030aff5e -1060445000,6,9,ffb8fc76 -1060455000,6,10,fef904e4 -1060465000,6,11,0254fd7b -1060475000,6,12,fcf800d0 -1060485000,6,13,019efe6f -1060495000,6,14,00080137 -1060505000,6,15,ffa00027 -1062385000,6,16,00780011 -1062395000,6,17,ff34004c -1062405000,6,18,fffaff6d -1062415000,6,19,00c70042 -1062425000,6,20,fe0dfea3 -1062435000,6,21,027d02f2 -1062445000,6,22,fc5cfe46 -1062455000,6,23,057b013c -1062465000,6,24,f8b2fc3f -1062475000,6,25,0562022c -1062485000,6,26,002cfeeb -1062495000,6,27,fe690180 -1062505000,6,28,ffd5fe91 -1062515000,6,29,008901b2 -1062525000,6,30,ffcaff4e -1062535000,6,31,ff91ffc6 -1064415000,7,0,ff65ffee -1064425000,7,1,00aa005c -1064435000,7,2,ffd7003b -1064445000,7,3,fffbffa2 -1064455000,7,4,fe6cffd3 -1064465000,7,5,031f022a -1064475000,7,6,feccfb03 -1064485000,7,7,00dd0534 -1064495000,7,8,fcd3fe16 -1064505000,7,9,01c8fd94 -1064515000,7,10,01f902e7 -1064525000,7,11,feb5fff0 -1064535000,7,12,fdd4fde9 -1064545000,7,13,02030176 -1064555000,7,14,ff8c004b -1064565000,7,15,003fff7a -1066445000,7,16,00480050 -1066455000,7,17,0009ff92 -1066465000,7,18,fe4c01c7 -1066475000,7,19,0141fc4b -1066485000,7,20,00a20287 -1066495000,7,21,ff50fe69 -1066505000,7,22,0034009d -1066515000,7,23,03840148 -1066525000,7,24,fc3aff7e -1066535000,7,25,007b0044 -1066545000,7,26,fed2fda3 -1066555000,7,27,02d1ffa5 -1066565000,7,28,ff00039f -1066575000,7,29,0050fd79 -1066585000,7,30,ff220035 -1066595000,7,31,00aeffb0 -1068475000,8,0,ffb70007 -1068485000,8,1,0039007c -1068495000,8,2,000c00ac -1068505000,8,3,fed5fd66 -1068515000,8,4,01630101 -1068525000,8,5,004b045d -1068535000,8,6,fddffb1d -1068545000,8,7,013bfff2 -1068555000,8,8,00670371 -1068565000,8,9,019ffd88 -1068575000,8,10,fd5c0286 -1068585000,8,11,0261fc42 -1068595000,8,12,fd5b0043 -1068605000,8,13,02b9021b -1068615000,8,14,fd8dff35 -1068625000,8,15,0103ffaa -1070505000,8,16,0021ffc0 -1070515000,8,17,0088000a -1070525000,8,18,fedb011e -1070535000,8,19,ffccfe84 -1070545000,8,20,01a00014 -1070555000,8,21,feccfc60 -1070565000,8,22,01cc0642 -1070575000,8,23,fd17fdb6 -1070585000,8,24,0179fd86 -1070595000,8,25,03b20270 -1070605000,8,26,fc39fdda -1070615000,8,27,03140372 -1070625000,8,28,fc5efcbe -1070635000,8,29,017202fa -1070645000,8,30,fff8fdf6 -1070655000,8,31,fff10068 -1072535000,9,0,ff89003d -1072545000,9,1,00460071 -1072555000,9,2,0076ffc4 -1072565000,9,3,ff900112 -1072575000,9,4,ff17fdeb -1072585000,9,5,016f0256 -1072595000,9,6,010bfd4a -1072605000,9,7,ffd50316 -1072615000,9,8,fc91fdf7 -1072625000,9,9,02e4ffc9 -1072635000,9,10,01aefebe -1072645000,9,11,fca002ba -1072655000,9,12,004ffe59 -1072665000,9,13,00570004 -1072675000,9,14,00410154 -1072685000,9,15,001bfef2 -1074565000,9,16,004bffd7 -1074575000,9,17,ff730074 -1074585000,9,18,ffcdfeb5 -1074595000,9,19,01fe0249 -1074605000,9,20,fd93fdfa -1074615000,9,21,00b7fe2f -1074625000,9,22,0036028e -1074635000,9,23,032fff58 -1074645000,9,24,fbf10153 -1074655000,9,25,01fdfeba -1074665000,9,26,fe79fe5b -1074675000,9,27,03e8039b -1074685000,9,28,fb99fcb8 -1074695000,9,29,0171022f -1074705000,9,30,ff8cfece -1074715000,9,31,00530000 -1076595000,10,0,0036004a -1076605000,10,1,fee4ffae -1076615000,10,2,01d300ba -1076625000,10,3,ffc9ffc9 -1076635000,10,4,fe13fee6 -1076645000,10,5,02e90074 -1076655000,10,6,fcdb01e8 -1076665000,10,7,00f9fde3 -1076675000,10,8,00e60036 -1076685000,10,9,01de0198 -1076695000,10,10,fbe9fed8 -1076705000,10,11,02afffd1 -1076715000,10,12,ff5dffa6 -1076725000,10,13,004dffd2 -1076735000,10,14,ff2d014a -1076745000,10,15,0047ff27 -1078625000,10,16,002effb9 -1078635000,10,17,0012006b -1078645000,10,18,fdcfffcc -1078655000,10,19,035bfe87 -1078665000,10,20,fe2b007f -1078675000,10,21,0139fe13 -1078685000,10,22,00c50461 -1078695000,10,23,feabfed4 -1078705000,10,24,fe3aff77 -1078715000,10,25,046afe17 -1078725000,10,26,fc47020c -1078735000,10,27,02b5fe7b -1078745000,10,28,fc7d0085 -1078755000,10,29,03b3ffe7 -1078765000,10,30,fe350023 -1078775000,10,31,004dfffe -1080655000,11,0,ffcc0042 -1080665000,11,1,0019006f -1080675000,11,2,00eaff0f -1080685000,11,3,fe1f010a -1080695000,11,4,0030febc -1080705000,11,5,01aefffd -1080715000,11,6,ff16027c -1080725000,11,7,ff96fdaf -1080735000,11,8,ff780078 -1080745000,11,9,032d01ad -1080755000,11,10,fc48fcef -1080765000,11,11,02cf0088 -1080775000,11,12,febc02ba -1080785000,11,13,feb8fd1b -1080795000,11,14,01a8016e -1080805000,11,15,ffb0ff73 -1082685000,11,16,ffe2ff96 -1082695000,11,17,00d7ffb3 -1082705000,11,18,fe2d00f1 -1082715000,11,19,00e5ff2e -1082725000,11,20,fec4ff23 -1082735000,11,21,02690026 -1082745000,11,22,00aa0079 -1082755000,11,23,fddf016f -1082765000,11,24,ff1afe12 -1082775000,11,25,039fff2f -1082785000,11,26,fc8f0283 -1082795000,11,27,02ddfe72 -1082805000,11,28,fe440201 -1082815000,11,29,0005fdbc -1082825000,11,30,ffa6005f -1082835000,11,31,002b0075 -1084715000,12,0,ffa5ffca -1084725000,12,1,00830144 -1084735000,12,2,ffc1fdb2 -1084745000,12,3,ffbb02b0 -1084755000,12,4,fff2fd05 -1084765000,12,5,ff5f036f -1084775000,12,6,032afd5a -1084785000,12,7,fd540072 -1084795000,12,8,fe6701c4 -1084805000,12,9,0347ffbc -1084815000,12,10,ffcdfd3a -1084825000,12,11,004d015c -1084835000,12,12,fdf6015d -1084845000,12,13,fff3fda1 -1084855000,12,14,012c015a -1084865000,12,15,ffb0ffe2 -1086745000,12,16,00a8ff77 -1086755000,12,17,00240110 -1086765000,12,18,fe8efff4 -1086775000,12,19,00a1fece -1086785000,12,20,0169005a -1086795000,12,21,fc73fddc -1086805000,12,22,053c02e0 -1086815000,12,23,fcc9fe6b -1086825000,12,24,feda0131 -1086835000,12,25,0490fda4 -1086845000,12,26,fcf60178 -1086855000,12,27,01bbfed4 -1086865000,12,28,fe0901da -1086875000,12,29,01a1fdfc -1086885000,12,30,ff7c0198 -1086895000,12,31,ff53ff27 -1088775000,13,0,ffccffcd -1088785000,13,1,00ed0068 -1088795000,13,2,fe73ff6e -1088805000,13,3,01130031 -1088815000,13,4,feb2fe08 -1088825000,13,5,0075056c -1088835000,13,6,018ef9b3 -1088845000,13,7,fe2e03c4 -1088855000,13,8,00b60125 -1088865000,13,9,ff0dfc72 -1088875000,13,10,01d10050 -1088885000,13,11,001902b9 -1088895000,13,12,fd28fe6a -1088905000,13,13,01d5002e -1088915000,13,14,0072000b -1088925000,13,15,ffc2fffe -1090805000,13,16,00beffee -1090815000,13,17,fefa0049 -1090825000,13,18,005cffde -1090835000,13,19,00d5ff4a -1090845000,13,20,fe59006d -1090855000,13,21,024c00d1 -1090865000,13,22,fed2017e -1090875000,13,23,0018ffd5 -1090885000,13,24,fde2ff56 -1090895000,13,25,fffafd19 -1090905000,13,26,03580252 -1090915000,13,27,fb8dff48 -1090925000,13,28,039b00f7 -1090935000,13,29,fe78ff55 -1090945000,13,30,00e60082 -1090955000,13,31,feee0029 -1092835000,14,0,ff7d0027 -1092845000,14,1,010fffea -1092855000,14,2,ffa400f7 -1092865000,14,3,fe85fee8 -1092875000,14,4,021cffae -1092885000,14,5,fea8016a -1092895000,14,6,00e6fef6 -1092905000,14,7,fe98ff05 -1092915000,14,8,0165039f -1092925000,14,9,fec7fdfe -1092935000,14,10,01defe67 -1092945000,14,11,ff650238 -1092955000,14,12,0076fe14 -1092965000,14,13,fdae0142 -1092975000,14,14,01ecffa4 -1092985000,14,15,ff8affc7 -1094865000,14,16,0047ffd2 -1094875000,14,17,0089003a -1094885000,14,18,fda50108 -1094895000,14,19,02ebfcb5 -1094905000,14,20,fec601a2 -1094915000,14,21,00c400ab -1094925000,14,22,ff1cff9e -1094935000,14,23,022c01dc -1094945000,14,24,fac1fc2c -1094955000,14,25,04250286 -1094965000,14,26,ff6dfdf4 -1094975000,14,27,0015fffb -1094985000,14,28,002e005c -1094995000,14,29,ffc6ff15 -1095005000,14,30,00de01e2 -1095015000,14,31,ff44feec -1096895000,15,0,00120019 -1096905000,15,1,0022ff0b -1096915000,15,2,004701f6 -1096925000,15,3,00cfffb0 -1096935000,15,4,fcf1fdbf -1096945000,15,5,02f800be -1096955000,15,6,ffb501a5 -1096965000,15,7,fce8ffb1 -1096975000,15,8,03e400dd -1096985000,15,9,fef8fdb1 -1096995000,15,10,000f0000 -1097005000,15,11,ffbb022e -1097015000,15,12,ff99fdb3 -1097025000,15,13,003e0146 -1097035000,15,14,0065ff75 -1097045000,15,15,ff4e0039 -1098925000,15,16,007fffdd -1098935000,15,17,ff23000f -1098945000,15,18,00a7fffa -1098955000,15,19,ff4fff4f -1098965000,15,20,016bff4b -1098975000,15,21,01ce0213 -1098985000,15,22,f9ab01e7 -1098995000,15,23,0532fd47 -1099005000,15,24,fd7b001b -1099015000,15,25,00dfff37 -1099025000,15,26,ff49ff98 -1099035000,15,27,013f0101 -1099045000,15,28,fe9fffc9 -1099055000,15,29,00f00087 -1099065000,15,30,ffd1ff33 -1099075000,15,31,ffd00041 -1100955000,16,0,0017002b -1100965000,16,1,ffb20001 -1100975000,16,2,00160008 -1100985000,16,3,ffc5fefa -1100995000,16,4,ffd900dd -1101005000,16,5,fe9b0276 -1101015000,16,6,02c6fc2a -1101025000,16,7,005802e0 -1101035000,16,8,fbbfffaf -1101045000,16,9,03a6fceb -1101055000,16,10,ffec04e2 -1101065000,16,11,00ebfe32 -1101075000,16,12,fc75fd51 -1101085000,16,13,03bd021a -1101095000,16,14,fe14ffec -1101105000,16,15,0048ff70 -1102985000,16,16,003e002a -1102995000,16,17,0072004f -1103005000,16,18,fdf20013 -1103015000,16,19,01f4ff78 -1103025000,16,20,ff98ffb3 -1103035000,16,21,fe16fede -1103045000,16,22,0471018a -1103055000,16,23,fd5701a8 -1103065000,16,24,ff48fc3c -1103075000,16,25,04b20227 -1103085000,16,26,fcf4ff6d -1103095000,16,27,026600f6 -1103105000,16,28,fb6a000f -1103115000,16,29,04260020 -1103125000,16,30,fe21ffe6 -1103135000,16,31,006fffae -1105015000,17,0,ffae0061 -1105025000,17,1,0058ffd9 -1105035000,17,2,0054fff0 -1105045000,17,3,fe930079 -1105055000,17,4,012fff0f -1105065000,17,5,fe4bffcc -1105075000,17,6,018500c9 -1105085000,17,7,015300cd -1105095000,17,8,fa94006f -1105105000,17,9,0504fe0f -1105115000,17,10,00ce00c4 -1105125000,17,11,fdaf00b5 -1105135000,17,12,ff5bfed1 -1105145000,17,13,0181000c -1105155000,17,14,ff350173 -1105165000,17,15,009bfea5 -1107045000,17,16,00c50001 -1107055000,17,17,ff720023 -1107065000,17,18,feb5ffea -1107075000,17,19,024a00b6 -1107085000,17,20,fddcfdd9 -1107095000,17,21,02ca00af -1107105000,17,22,fc64025a -1107115000,17,23,0329fdd5 -1107125000,17,24,fca1022f -1107135000,17,25,034efbf1 -1107145000,17,26,00990436 -1107155000,17,27,fddafe74 -1107165000,17,28,ff62003f -1107175000,17,29,008a0135 -1107185000,17,30,0022fec6 -1107195000,17,31,ff370061 -1109075000,18,0,ffe60003 -1109085000,18,1,002dfff1 -1109095000,18,2,00cd0039 -1109105000,18,3,ffa2ffce -1109115000,18,4,fd55003e -1109125000,18,5,0451ff23 -1109135000,18,6,febd0040 -1109145000,18,7,fd4601b1 -1109155000,18,8,023efea3 -1109165000,18,9,ff23005b -1109175000,18,10,02edffdf -1109185000,18,11,fda4ffbe -1109195000,18,12,ff8f0028 -1109205000,18,13,0047ffc1 -1109215000,18,14,0119fff4 -1109225000,18,15,fef4003b -1111105000,18,16,ffbbff2a -1111115000,18,17,002d00b0 -1111125000,18,18,00c9fee7 -1111135000,18,19,ffb00251 -1111145000,18,20,ff06fd06 -1111155000,18,21,0101011d -1111165000,18,22,ff86ffc7 -1111175000,18,23,0274010c -1111185000,18,24,f9ff0130 -1111195000,18,25,06edfc16 -1111205000,18,26,fc050153 -1111215000,18,27,01f4002b -1111225000,18,28,ffdcfef8 -1111235000,18,29,ff810101 -1111245000,18,30,00a8ffbf -1111255000,18,31,ffe4007c -1113135000,19,0,00420005 -1113145000,19,1,fec50098 -1113155000,19,2,02eefef1 -1113165000,19,3,fe430108 -1113175000,19,4,fde0ff13 -1113185000,19,5,0241ffbe -1113195000,19,6,0163ff90 -1113205000,19,7,fcd203a7 -1113215000,19,8,0026fc63 -1113225000,19,9,01dd0170 -1113235000,19,10,0024ffdd -1113245000,19,11,002d0012 -1113255000,19,12,fe88ff5d -1113265000,19,13,ffe50006 -1113275000,19,14,014b00e2 -1113285000,19,15,ff66ff5b -1115165000,19,16,005effad -1115175000,19,17,ffc80081 -1115185000,19,18,fe430065 -1115195000,19,19,026dfd90 -1115205000,19,20,ff30011b -1115215000,19,21,00d902bd -1115225000,19,22,fe3cfd72 -1115235000,19,23,027a02b0 -1115245000,19,24,fb20fad7 -1115255000,19,25,03480525 -1115265000,19,26,ff27fbb7 -1115275000,19,27,01e1018a -1115285000,19,28,fe82009d -1115295000,19,29,009ffea9 -1115305000,19,30,ffa2017e -1115315000,19,31,ffb8ff82 -1117195000,20,0,fffe0094 -1117205000,20,1,ffbdffda -1117215000,20,2,00bdff48 -1117225000,20,3,003500aa -1117235000,20,4,fe45ff6a -1117245000,20,5,00dc0243 -1117255000,20,6,007afc67 -1117265000,20,7,ffaa0274 -1117275000,20,8,fed800ea -1117285000,20,9,02f3fd90 -1117295000,20,10,fe53020c -1117305000,20,11,00d5fec6 -1117315000,20,12,fd9dfe8c -1117325000,20,13,02d001cf -1117335000,20,14,fe460059 -1117345000,20,15,0068ff18 -1119225000,20,16,004eff71 -1119235000,20,17,001b003a -1119245000,20,18,fe44017f -1119255000,20,19,0283fd90 -1119265000,20,20,fd780030 -1119275000,20,21,02b500d6 -1119285000,20,22,fd7fff51 -1119295000,20,23,0113030f -1119305000,20,24,fd68faa3 -1119315000,20,25,03bd0310 -1119325000,20,26,ff32fd01 -1119335000,20,27,015301c0 -1119345000,20,28,fc82016c -1119355000,20,29,02e3fdb4 -1119365000,20,30,fec3016f -1119375000,20,31,ffdfffbd -1121255000,21,0,ffb40015 -1121265000,21,1,ffc1006e -1121275000,21,2,00d4fedd -1121285000,21,3,ff1e01ec -1121295000,21,4,ff9cfdaa -1121305000,21,5,00a80392 -1121315000,21,6,013bfb1a -1121325000,21,7,fc35036c -1121335000,21,8,03e40047 -1121345000,21,9,ff1b0094 -1121355000,21,10,fe92fe1f -1121365000,21,11,0368fee4 -1121375000,21,12,fdc00186 -1121385000,21,13,ff640054 -1121395000,21,14,007bff0e -1121405000,21,15,004d002c -1123285000,21,16,ffed0022 -1123295000,21,17,005efef7 -1123305000,21,18,004f0227 -1123315000,21,19,004bff24 -1123325000,21,20,fe6a0006 -1123335000,21,21,fedcfef9 -1123345000,21,22,0325ff9f -1123355000,21,23,fe860265 -1123365000,21,24,00d7fe50 -1123375000,21,25,0050fed1 -1123385000,21,26,fec90163 -1123395000,21,27,004bfc56 -1123405000,21,28,012204e4 -1123415000,21,29,0042fd23 -1123425000,21,30,ff230173 -1123435000,21,31,0038ff35 -1125315000,22,0,00240021 -1125325000,22,1,ff74ffd7 -1125335000,22,2,009dffe2 -1125345000,22,3,00f6019f -1125355000,22,4,ff44fd14 -1125365000,22,5,fd2c02e5 -1125375000,22,6,0348fc5a -1125385000,22,7,ffaf0463 -1125395000,22,8,000cff89 -1125405000,22,9,ff5efcd7 -1125415000,22,10,fff10160 -1125425000,22,11,014a00e5 -1125435000,22,12,fe9cfe2e -1125445000,22,13,00c20169 -1125455000,22,14,ff22ff88 -1125465000,22,15,0049000d -1127345000,22,16,0058ff8e -1127355000,22,17,ff92000c -1127365000,22,18,ff2f0013 -1127375000,22,19,01f800a7 -1127385000,22,20,fe59fc15 -1127395000,22,21,01f10480 -1127405000,22,22,fce7fd9a -1127415000,22,23,035b0321 -1127425000,22,24,fd84fd2a -1127435000,22,25,01240066 -1127445000,22,26,ff69ff2b -1127455000,22,27,0054ff17 -1127465000,22,28,ff3f015b -1127475000,22,29,018dff26 -1127485000,22,30,ffad0088 -1127495000,22,31,ff850031 -1129375000,23,0,ffceffb0 -1129385000,23,1,ffab00d1 -1129395000,23,2,005e0005 -1129405000,23,3,0023ffb7 -1129415000,23,4,0025fe43 -1129425000,23,5,fe3d042f -1129435000,23,6,02f0fab5 -1129445000,23,7,fe44046e -1129455000,23,8,0048005a -1129465000,23,9,ffd7fa85 -1129475000,23,10,004803af -1129485000,23,11,014b013d -1129495000,23,12,fce1fd8b -1129505000,23,13,022d00a3 -1129515000,23,14,ff4e0097 -1129525000,23,15,0062ff9e -1131405000,23,16,00750062 -1131415000,23,17,ff2d0058 -1131425000,23,18,ffbcffb5 -1131435000,23,19,00edff63 -1131445000,23,20,ff79008d -1131455000,23,21,ffd4fe79 -1131465000,23,22,008401fc -1131475000,23,23,02d8fed7 -1131485000,23,24,fced0208 -1131495000,23,25,0073ff32 -1131505000,23,26,ff52fc25 -1131515000,23,27,026b04ad -1131525000,23,28,fd1dfe75 -1131535000,23,29,01cc0015 -1131545000,23,30,fee6ffde -1131555000,23,31,00b0ff61 -1133435000,24,0,fffd0025 -1133445000,24,1,ff8700f7 -1133455000,24,2,0118fe86 -1133465000,24,3,ffc60049 -1133475000,24,4,ffe2ffde -1133485000,24,5,fdc00404 -1133495000,24,6,02c2f902 -1133505000,24,7,ff8c04da -1133515000,24,8,ff71001f -1133525000,24,9,0053fe9b -1133535000,24,10,018c0074 -1133545000,24,11,fef8ff8f -1133555000,24,12,fe40fdc6 -1133565000,24,13,025e030e -1133575000,24,14,fe9aff6c -1133585000,24,15,002eff5a -1135465000,24,16,0046fff0 -1135475000,24,17,0084004a -1135485000,24,18,fde000de -1135495000,24,19,01fefe2b -1135505000,24,20,0018ff7f -1135515000,24,21,fcccff81 -1135525000,24,22,0446028f -1135535000,24,23,ff7cff0c -1135545000,24,24,fc180060 -1135555000,24,25,0562fc18 -1135565000,24,26,fc980236 -1135575000,24,27,041c0149 -1135585000,24,28,fa0eff71 -1135595000,24,29,035eff25 -1135605000,24,30,ff86005d -1135615000,24,31,ffd2ff88 -1137495000,25,0,ffa80057 -1137505000,25,1,0053ffab -1137515000,25,2,00c5013c -1137525000,25,3,fde2ff7f -1137535000,25,4,01affdc4 -1137545000,25,5,fe260398 -1137555000,25,6,0321fd50 -1137565000,25,7,fcff0207 -1137575000,25,8,011efff3 -1137585000,25,9,00a1fe27 -1137595000,25,10,ff990224 -1137605000,25,11,0160fde9 -1137615000,25,12,fd770072 -1137625000,25,13,01ca0106 -1137635000,25,14,ff05ff60 -1137645000,25,15,006bff91 -1139525000,25,16,002bff62 -1139535000,25,17,ff60015d -1139545000,25,18,ff85fe6a -1139555000,25,19,0182ff88 -1139565000,25,20,ffd6ffd6 -1139575000,25,21,0045ffad -1139585000,25,22,ff8e03c7 -1139595000,25,23,0176fd4a -1139605000,25,24,fccb002a -1139615000,25,25,0316006f -1139625000,25,26,fd81fe9e -1139635000,25,27,046e014e -1139645000,25,28,fb3cfe8e -1139655000,25,29,02c101c7 -1139665000,25,30,ff0cfec1 -1139675000,25,31,00860080 -1141555000,26,0,ff9d0003 -1141565000,26,1,ffb20051 -1141575000,26,2,016aff7c -1141585000,26,3,fd290196 -1141595000,26,4,0285fd5a -1141605000,26,5,fe640101 -1141615000,26,6,00c60267 -1141625000,26,7,00e5fec5 -1141635000,26,8,fe83fe45 -1141645000,26,9,01a6030b -1141655000,26,10,ff62fd18 -1141665000,26,11,00dbff54 -1141675000,26,12,ff2302f6 -1141685000,26,13,fe90fdb3 -1141695000,26,14,014e00bd -1141705000,26,15,0023fff1 -1143585000,26,16,005effb6 -1143595000,26,17,012e0039 -1143605000,26,18,fc780011 -1143615000,26,19,030200b8 -1143625000,26,20,ffc3fdb8 -1143635000,26,21,ffcc012d -1143645000,26,22,0058ff4a -1143655000,26,23,ffa60337 -1143665000,26,24,fdb0fd06 -1143675000,26,25,03feff9b -1143685000,26,26,feda0067 -1143695000,26,27,0210fef4 -1143705000,26,28,fce30234 -1143715000,26,29,017cfeb3 -1143725000,26,30,001200b6 -1143735000,26,31,ff24ffa9 -1145615000,27,0,ff9f0022 -1145625000,27,1,0063006c -1145635000,27,2,00c60044 -1145645000,27,3,fcf7ff21 -1145655000,27,4,013aff70 -1145665000,27,5,024402f4 -1145675000,27,6,fdf1fd3f -1145685000,27,7,00ce01d4 -1145695000,27,8,ff85ffb2 -1145705000,27,9,002dfe60 -1145715000,27,10,00960190 -1145725000,27,11,006dff2f -1145735000,27,12,ff1200b8 -1145745000,27,13,ffc4fee0 -1145755000,27,14,004300c9 -1145765000,27,15,0036ff64 -1147645000,27,16,0040ffb1 -1147655000,27,17,0114ff59 -1147665000,27,18,fd000206 -1147675000,27,19,0365fd54 -1147685000,27,20,feba01b9 -1147695000,27,21,fe99ff66 -1147705000,27,22,03160142 -1147715000,27,23,fc70fec2 -1147725000,27,24,0022ff37 -1147735000,27,25,01eefdd3 -1147745000,27,26,004a0232 -1147755000,27,27,0101ffd8 -1147765000,27,28,fdc0ffbf -1147775000,27,29,0251001e -1147785000,27,30,febcffce -1147795000,27,31,ffd6005a -1149675000,28,0,ff03002e -1149685000,28,1,016dffd6 -1149695000,28,2,fffc008d -1149705000,28,3,fd54008f -1149715000,28,4,02b2fe1c -1149725000,28,5,ff2c0194 -1149735000,28,6,022fffe9 -1149745000,28,7,fcbbfdb7 -1149755000,28,8,00af0446 -1149765000,28,9,0081fbd2 -1149775000,28,10,020e02ab -1149785000,28,11,fceefd61 -1149795000,28,12,017801cc -1149805000,28,13,fea60020 -1149815000,28,14,00ebffcb -1149825000,28,15,0043ffb5 -1151705000,28,16,0000ffc5 -1151715000,28,17,005b0042 -1151725000,28,18,fe3700cd -1151735000,28,19,01bdff07 -1151745000,28,20,ff4afed6 -1151755000,28,21,fe0aff2a -1151765000,28,22,05c60139 -1151775000,28,23,fd4e0244 -1151785000,28,24,fc84fd79 -1151795000,28,25,071dffb6 -1151805000,28,26,fb61ffad -1151815000,28,27,03270085 -1151825000,28,28,fd6e00d4 -1151835000,28,29,01f2ff62 -1151845000,28,30,fe76fff5 -1151855000,28,31,00baffec -1153735000,29,0,ffbb0030 -1153745000,29,1,0053ffcf -1153755000,29,2,00b7ffbd -1153765000,29,3,ff500108 -1153775000,29,4,ff03fead -1153785000,29,5,ffb30178 -1153795000,29,6,03e2fde7 -1153805000,29,7,fbcc00b1 -1153815000,29,8,019103ae -1153825000,29,9,fef5fabf -1153835000,29,10,022701e5 -1153845000,29,11,fef6012c -1153855000,29,12,ff31fe21 -1153865000,29,13,ffd90192 -1153875000,29,14,01880003 -1153885000,29,15,ff52ff4b -1155765000,29,16,001b0040 -1155775000,29,17,ffc600ee -1155785000,29,18,000ffed1 -1155795000,29,19,ffeb0076 -1155805000,29,20,00a7004b -1155815000,29,21,fee8ff6c -1155825000,29,22,01b1019f -1155835000,29,23,ff9c01cc -1155845000,29,24,fcfbfcc4 -1155855000,29,25,02120140 -1155865000,29,26,0065fdb1 -1155875000,29,27,01bd0108 -1155885000,29,28,fd4b01c9 -1155895000,29,29,0148fe82 -1155905000,29,30,fffb01f7 -1155915000,29,31,ffccfe9a -1157795000,30,0,ffce0016 -1157805000,30,1,00150077 -1157815000,30,2,001ffe63 -1157825000,30,3,ffe902d5 -1157835000,30,4,ff6afbd3 -1157845000,30,5,ff8504ab -1157855000,30,6,018afd06 -1157865000,30,7,007601e3 -1157875000,30,8,fe8cff20 -1157885000,30,9,ffe700bd -1157895000,30,10,0153fdab -1157905000,30,11,014f010f -1157915000,30,12,fcf001d7 -1157925000,30,13,0057fd19 -1157935000,30,14,01300174 -1157945000,30,15,ff9affd9 -1159825000,30,16,007e0039 -1159835000,30,17,ff7c002f -1159845000,30,18,ff08ffdb -1159855000,30,19,0362ffa0 -1159865000,30,20,faf9fef4 -1159875000,30,21,04a80136 -1159885000,30,22,fc3000a9 -1159895000,30,23,034fff3d -1159905000,30,24,febefedd -1159915000,30,25,00e6009f -1159925000,30,26,0164fe75 -1159935000,30,27,fcb801b0 -1159945000,30,28,02e3ff6a -1159955000,30,29,ff820080 -1159965000,30,30,ff440083 -1159975000,30,31,ffe3fedf -1161855000,31,0,ffd10031 -1161865000,31,1,0099fffb -1161875000,31,2,ffcfff15 -1161885000,31,3,ffd1018f -1161895000,31,4,0072fd59 -1161905000,31,5,fc9202af -1161915000,31,6,04b9fd92 -1161925000,31,7,fe530286 -1161935000,31,8,fda3ffaf -1161945000,31,9,00e1ff33 -1161955000,31,10,03d5ff2f -1161965000,31,11,fc570317 -1161975000,31,12,0082fce3 -1161985000,31,13,007c01ab -1161995000,31,14,0093ffc6 -1162005000,31,15,ffa5ff94 -1163885000,31,16,0077003a -1163895000,31,17,002a0072 -1163905000,31,18,fda6ff64 -1163915000,31,19,0396ff50 -1163925000,31,20,fd7f0119 -1163935000,31,21,0005fdf7 -1163945000,31,22,018303aa -1163955000,31,23,01a0fe53 -1163965000,31,24,fc91ff7a -1163975000,31,25,03dc00e8 -1163985000,31,26,fbf0ff94 -1163995000,31,27,022c00a8 -1164005000,31,28,ff29ff3f -1164015000,31,29,00550167 -1164025000,31,30,0037ff4a -1164035000,31,31,ff1efff5 -1165915000,32,0,0027004d -1165925000,32,1,fff5fff4 -1165935000,32,2,00a2ffc2 -1165945000,32,3,fe3100b0 -1165955000,32,4,024aff2c -1165965000,32,5,fd64018f -1165975000,32,6,0423fcf4 -1165985000,32,7,ff36030c -1165995000,32,8,fb19fe8d -1166005000,32,9,034bfdf2 -1166015000,32,10,018e01cc -1166025000,32,11,fd5f02a6 -1166035000,32,12,008efbea -1166045000,32,13,ff800203 -1166055000,32,14,0145004e -1166065000,32,15,ff66ff66 -1167945000,32,16,0000ffd4 -1167955000,32,17,0068ffef -1167965000,32,18,fe5b0119 -1167975000,32,19,0145feb0 -1167985000,32,20,ff97ff54 -1167995000,32,21,0001fff6 -1168005000,32,22,016a00c0 -1168015000,32,23,00ba03b3 -1168025000,32,24,fb0cface -1168035000,32,25,05be00e5 -1168045000,32,26,fdf103ef -1168055000,32,27,00fbfc7a -1168065000,32,28,fd0d0166 -1168075000,32,29,00d1ffda -1168085000,32,30,003aff6c -1168095000,32,31,ffae002f -1169975000,33,0,ffde0044 -1169985000,33,1,007b003d -1169995000,33,2,0011ffe9 -1170005000,33,3,fe4f0036 -1170015000,33,4,0115fe01 -1170025000,33,5,003404bf -1170035000,33,6,0036fbfd -1170045000,33,7,01290152 -1170055000,33,8,fe0aff8a -1170065000,33,9,001b009b -1170075000,33,10,00ddfe5b -1170085000,33,11,00570288 -1170095000,33,12,fffffd89 -1170105000,33,13,fe020101 -1170115000,33,14,01800077 -1170125000,33,15,ffc5ff48 -1172005000,33,16,000cffd0 -1172015000,33,17,0152ff0f -1172025000,33,18,fd320301 -1172035000,33,19,01d5fd8e -1172045000,33,20,ff39ffb3 -1172055000,33,21,006efe91 -1172065000,33,22,013d03d9 -1172075000,33,23,fd20fea5 -1172085000,33,24,000cff42 -1172095000,33,25,02cafe0b -1172105000,33,26,fe08021b -1172115000,33,27,026ffd92 -1172125000,33,28,fda30267 -1172135000,33,29,0116ffd1 -1172145000,33,30,ff95ff7f -1172155000,33,31,ff9c001f -1174035000,34,0,004b003f -1174045000,34,1,ff7e0035 -1174055000,34,2,0103ff59 -1174065000,34,3,00b60059 -1174075000,34,4,fbf20063 -1174085000,34,5,03efff36 -1174095000,34,6,ff9dff7e -1174105000,34,7,ff1a035e -1174115000,34,8,ff33fc47 -1174125000,34,9,01f601c1 -1174135000,34,10,fefdfeed -1174145000,34,11,015600b1 -1174155000,34,12,fde0ff63 -1174165000,34,13,fff10068 -1174175000,34,14,018b0030 -1174185000,34,15,ff0effc4 -1176065000,34,16,ffa9ffbf -1176075000,34,17,ffc9ffb9 -1176085000,34,18,ff8600a0 -1176095000,34,19,0274ffb7 -1176105000,34,20,fbf5feb8 -1176115000,34,21,04a6ffe1 -1176125000,34,22,fd1a03f3 -1176135000,34,23,0017fded -1176145000,34,24,fe67fe9d -1176155000,34,25,01c70125 -1176165000,34,26,ff04fe92 -1176175000,34,27,02b8ffe3 -1176185000,34,28,fbb70080 -1176195000,34,29,03a2fff1 -1176205000,34,30,fd800017 -1176215000,34,31,0135ffe9 -1178095000,35,0,00180073 -1178105000,35,1,ff7fffb1 -1178115000,35,2,0148005f -1178125000,35,3,fff0ff7b -1178135000,35,4,fe26006c -1178145000,35,5,016900bc -1178155000,35,6,ff47fc1d -1178165000,35,7,01a104a6 -1178175000,35,8,fc5cff6d -1178185000,35,9,0369ff95 -1178195000,35,10,0008fe07 -1178205000,35,11,ffa002b5 -1178215000,35,12,fe96fcac -1178225000,35,13,00f302da -1178235000,35,14,fff1ff45 -1178245000,35,15,ffd3ff8e -1180125000,35,16,00e4ff58 -1180135000,35,17,ff5500b1 -1180145000,35,18,fffeffae -1180155000,35,19,0006009d -1180165000,35,20,0056fd93 -1180175000,35,21,fff101fa -1180185000,35,22,fee7ff08 -1180195000,35,23,034a01fb -1180205000,35,24,faa4fccc -1180215000,35,25,05930227 -1180225000,35,26,fd26fe84 -1180235000,35,27,0118016d -1180245000,35,28,ff66fe01 -1180255000,35,29,000701a2 -1180265000,35,30,00a9ffde -1180275000,35,31,fea00007 -1182155000,36,0,0011006b -1182165000,36,1,ffc8ffb1 -1182175000,36,2,0139001f -1182185000,36,3,ff11000f -1182195000,36,4,fe28ff9d -1182205000,36,5,01bb013f -1182215000,36,6,012cfe5a -1182225000,36,7,004101a5 -1182235000,36,8,fbcd0093 -1182245000,36,9,04b2fd27 -1182255000,36,10,fe6b00a7 -1182265000,36,11,01830293 -1182275000,36,12,fbe6fbf1 -1182285000,36,13,02f702c1 -1182295000,36,14,ff74ffdc -1182305000,36,15,ffcfff59 -1184185000,36,16,002fffc5 -1184195000,36,17,005affa5 -1184205000,36,18,fed10244 -1184215000,36,19,00c2fd27 -1184225000,36,20,006a00dd -1184235000,36,21,fd69fe06 -1184245000,36,22,02c003e0 -1184255000,36,23,fe77fe5c -1184265000,36,24,004d00e3 -1184275000,36,25,0042fbb5 -1184285000,36,26,0033030c -1184295000,36,27,0262ff63 -1184305000,36,28,fb2601e7 -1184315000,36,29,022bfe88 -1184325000,36,30,ffe0002c -1184335000,36,31,ff95000a -1186215000,37,0,ffd7fffa -1186225000,37,1,fff2fff9 -1186235000,37,2,ffdeffcc -1186245000,37,3,0104003b -1186255000,37,4,fddcff3b -1186265000,37,5,00c3014b -1186275000,37,6,0269fe32 -1186285000,37,7,fd39015d -1186295000,37,8,002b0116 -1186305000,37,9,013cfd07 -1186315000,37,10,fdac00c6 -1186325000,37,11,03fa01e3 -1186335000,37,12,fbdeff09 -1186345000,37,13,015b0051 -1186355000,37,14,00e1ffa8 -1186365000,37,15,ffed0029 -1188245000,37,16,0047ffde -1188255000,37,17,009f002b -1188265000,37,18,ff24017a -1188275000,37,19,ffdcfdb3 -1188285000,37,20,011b0075 -1188295000,37,21,fc2b009b -1188305000,37,22,044800c9 -1188315000,37,23,fee400eb -1188325000,37,24,fefffdd6 -1188335000,37,25,ffd7ff89 -1188345000,37,26,01aaffae -1188355000,37,27,ffe60165 -1188365000,37,28,ff6b00ff -1188375000,37,29,fe8bff09 -1188385000,37,30,023e005f -1188395000,37,31,fe6effcd -1190275000,38,0,001bfffe -1190285000,38,1,0006ffff -1190295000,38,2,ffda004d -1190305000,38,3,01ae0091 -1190315000,38,4,fe59fe3e -1190325000,38,5,ff0601dc -1190335000,38,6,0158fc02 -1190345000,38,7,017f0598 -1190355000,38,8,fce1ff00 -1190365000,38,9,0212fc5b -1190375000,38,10,ff6201bf -1190385000,38,11,015201b7 -1190395000,38,12,fdcffd10 -1190405000,38,13,013e01f6 -1190415000,38,14,ff58ff76 -1190425000,38,15,00150024 -1192305000,38,16,0087ff7c -1192315000,38,17,002a00e4 -1192325000,38,18,fec3ff40 -1192335000,38,19,00c1fff8 -1192345000,38,20,ffbcfe1c -1192355000,38,21,fef6042e -1192365000,38,22,0262fd4b -1192375000,38,23,fdd70136 -1192385000,38,24,ffd7fd3a -1192395000,38,25,00b8fff2 -1192405000,38,26,00250184 -1192415000,38,27,013fffec -1192425000,38,28,fd5200b6 -1192435000,38,29,01fcfdfc -1192445000,38,30,ff420171 -1192455000,38,31,ff4dff6e -1194335000,39,0,ffcc0004 -1194345000,39,1,005100a7 -1194355000,39,2,001affbf -1194365000,39,3,ffd3ff8a -1194375000,39,4,ff80ff63 -1194385000,39,5,005e03b5 -1194395000,39,6,0235f9db -1194405000,39,7,fe850446 -1194415000,39,8,fecc00be -1194425000,39,9,ffc5f9a7 -1194435000,39,10,02000561 -1194445000,39,11,ff51ff88 -1194455000,39,12,fd80ff13 -1194465000,39,13,021c0039 -1194475000,39,14,ffc100bd -1194485000,39,15,001fff7c -1196365000,39,16,fffffff3 -1196375000,39,17,ff8e0083 -1196385000,39,18,ff83fee9 -1196395000,39,19,02a6000f -1196405000,39,20,fb8a0071 -1196415000,39,21,046afe97 -1196425000,39,22,fd1e01c9 -1196435000,39,23,03a6015d -1196445000,39,24,fbebff03 -1196455000,39,25,001afe81 -1196465000,39,26,01f5fde9 -1196475000,39,27,fd5c0275 -1196485000,39,28,02a4ff89 -1196495000,39,29,ff92ffdd -1196505000,39,30,fefaffdd -1196515000,39,31,007cffcf -1198395000,40,0,ff4affd2 -1198405000,40,1,016400e4 -1198415000,40,2,ff0dfff1 -1198425000,40,3,ff5aff09 -1198435000,40,4,0068ff79 -1198445000,40,5,00f70385 -1198455000,40,6,fe78fb3d -1198465000,40,7,021103c4 -1198475000,40,8,fdbc0042 -1198485000,40,9,022afcf8 -1198495000,40,10,fe570187 -1198505000,40,11,03860043 -1198515000,40,12,fc26fdeb -1198525000,40,13,00670227 -1198535000,40,14,0078ff1b -1198545000,40,15,003b0020 -1200425000,40,16,0067ff87 -1200435000,40,17,006affba -1200445000,40,18,fe13021c -1200455000,40,19,0184fd52 -1200465000,40,20,ffb10118 -1200475000,40,21,ff28fbfc -1200485000,40,22,01c30565 -1200495000,40,23,0060fd3d -1200505000,40,24,fd130211 -1200515000,40,25,0258fd9e -1200525000,40,26,ff6ffed4 -1200535000,40,27,023803a2 -1200545000,40,28,fc2dfd78 -1200555000,40,29,01620108 -1200565000,40,30,004bfed3 -1200575000,40,31,ff800083 -1202455000,41,0,0021ffec -1202465000,41,1,ff5d00ec -1202475000,41,2,01acfec9 -1202485000,41,3,fefa0034 -1202495000,41,4,ff1b0021 -1202505000,41,5,ff990087 -1202515000,41,6,02edff3b -1202525000,41,7,fe3f0131 -1202535000,41,8,ff59ffc4 -1202545000,41,9,012bff22 -1202555000,41,10,ff2a0069 -1202565000,41,11,0314ff4c -1202575000,41,12,fbff00df -1202585000,41,13,00b7ff47 -1202595000,41,14,0131005b -1202605000,41,15,ff53fffb -1204485000,41,16,0053ff4e -1204495000,41,17,ffac00cb -1204505000,41,18,fedafef1 -1204515000,41,19,022b0099 -1204525000,41,20,ff0afffa -1204535000,41,21,009efd4f -1204545000,41,22,fead0474 -1204555000,41,23,0279fe69 -1204565000,41,24,fb99fffc -1204575000,41,25,0412ffb1 -1204585000,41,26,fd80fe6d -1204595000,41,27,020101f1 -1204605000,41,28,fd72fd98 -1204615000,41,29,02e4018d -1204625000,41,30,feb1ffc2 -1204635000,41,31,ffeb0035 -1206515000,42,0,000affba -1206525000,42,1,fef00074 -1206535000,42,2,0134ffa8 -1206545000,42,3,ffae001f -1206555000,42,4,ffd500cf -1206565000,42,5,ff2efd43 -1206575000,42,6,01be0271 -1206585000,42,7,ffbd01ad -1206595000,42,8,fcd0fd2e -1206605000,42,9,0512010e -1206615000,42,10,fe2cfe02 -1206625000,42,11,ff6202f3 -1206635000,42,12,ffadff15 -1206645000,42,13,00ecfde3 -1206655000,42,14,ff0601c1 -1206665000,42,15,0097fff1 -1208545000,42,16,0009ff70 -1208555000,42,17,00d100c6 -1208565000,42,18,fcc4ff70 -1208575000,42,19,048bff5a -1208585000,42,20,fc990022 -1208595000,42,21,0302fe4b -1208605000,42,22,feb80306 -1208615000,42,23,0051ff2c -1208625000,42,24,feb90138 -1208635000,42,25,0111fd00 -1208645000,42,26,0078ffca -1208655000,42,27,00f5014c -1208665000,42,28,fdbdffd2 -1208675000,42,29,01840077 -1208685000,42,30,ffe4fee4 -1208695000,42,31,fff700c6 -1210575000,43,0,0016fff9 -1210585000,43,1,ff50005a -1210595000,43,2,01a5ff53 -1210605000,43,3,fe4c021b -1210615000,43,4,003cfcb0 -1210625000,43,5,005fffda -1210635000,43,6,0163048c -1210645000,43,7,fccffe25 -1210655000,43,8,00a6fdc3 -1210665000,43,9,04a401d6 -1210675000,43,10,fb83ff4b -1210685000,43,11,00b6004b -1210695000,43,12,009800d0 -1210705000,43,13,ffddfe3a -1210715000,43,14,001500fa -1210725000,43,15,ffcfffd1 -1212605000,43,16,0026ff5f -1212615000,43,17,006d0068 -1212625000,43,18,fec30006 -1212635000,43,19,012a00df -1212645000,43,20,ff49fdc4 -1212655000,43,21,ff6e0100 -1212665000,43,22,0242ffec -1212675000,43,23,fe0aff72 -1212685000,43,24,00aafd8d -1212695000,43,25,0441051a -1212705000,43,26,fae5fde6 -1212715000,43,27,025200af -1212725000,43,28,fe1bfe08 -1212735000,43,29,025c011e -1212745000,43,30,fe82ffa8 -1212755000,43,31,00420058 -1214635000,44,0,0005fffe -1214645000,44,1,006f010f -1214655000,44,2,ffc4feec -1214665000,44,3,fffeffe6 -1214675000,44,4,ff3dff63 -1214685000,44,5,0079031c -1214695000,44,6,015cfbb7 -1214705000,44,7,ffb9022d -1214715000,44,8,fb8101d4 -1214725000,44,9,0499fd2b -1214735000,44,10,00ce0076 -1214745000,44,11,fef001b6 -1214755000,44,12,fdfdfddf -1214765000,44,13,0093001a -1214775000,44,14,015201b3 -1214785000,44,15,ff45fee7 -1216665000,44,16,00a6ffba -1216675000,44,17,ffb300ce -1216685000,44,18,fe9c000d -1216695000,44,19,0279fe68 -1216705000,44,20,fe67019a -1216715000,44,21,ff10fd8b -1216725000,44,22,017f024a -1216735000,44,23,0121fed6 -1216745000,44,24,fcd60026 -1216755000,44,25,03ab0218 -1216765000,44,26,fcaafcc7 -1216775000,44,27,03a10234 -1216785000,44,28,fc39ff8e -1216795000,44,29,0162ffa3 -1216805000,44,30,ffa700da -1216815000,44,31,ff5dff2a -1218695000,45,0,ffdd0038 -1218705000,45,1,00280035 -1218715000,45,2,0058ff3b -1218725000,45,3,ff64013c -1218735000,45,4,004cfe0b -1218745000,45,5,fea1032d -1218755000,45,6,02c3fbcc -1218765000,45,7,ff0b028b -1218775000,45,8,ff0d02f8 -1218785000,45,9,ff90fa21 -1218795000,45,10,023601c7 -1218805000,45,11,007e010a -1218815000,45,12,fbde0009 -1218825000,45,13,0227fee5 -1218835000,45,14,0053014e -1218845000,45,15,ffdbff67 -1220725000,45,16,00bd0060 -1220735000,45,17,ff05004f -1220745000,45,18,0041004b -1220755000,45,19,004ffe10 -1220765000,45,20,ffb6023d -1220775000,45,21,fe5cfdd2 -1220785000,45,22,01950222 -1220795000,45,23,0140fed0 -1220805000,45,24,fce900f6 -1220815000,45,25,0235fe9b -1220825000,45,26,ffb9feef -1220835000,45,27,ff1b0062 -1220845000,45,28,009c020d -1220855000,45,29,006afe58 -1220865000,45,30,fed9019c -1220875000,45,31,ffb6fe42 -1222755000,46,0,ffef000e -1222765000,46,1,006e003b -1222775000,46,2,0090fec7 -1222785000,46,3,fd9b0048 -1222795000,46,4,02620156 -1222805000,46,5,fd95ff76 -1222815000,46,6,00e7fe16 -1222825000,46,7,023501df -1222835000,46,8,fd0d0100 -1222845000,46,9,fea8ff8b -1222855000,46,10,0468fddb -1222865000,46,11,fe5f036c -1222875000,46,12,ff4efd6c -1222885000,46,13,00790160 -1222895000,46,14,006dff60 -1222905000,46,15,ffb5ffe9 -1224785000,46,16,00390013 -1224795000,46,17,00b10010 -1224805000,46,18,fd4a0112 -1224815000,46,19,01effd5a -1224825000,46,20,018201d5 -1224835000,46,21,fc93ffa2 -1224845000,46,22,00f70022 -1224855000,46,23,00890084 -1224865000,46,24,00150013 -1224875000,46,25,0225fd80 -1224885000,46,26,fc6c01ee -1224895000,46,27,02150060 -1224905000,46,28,ff50ff95 -1224915000,46,29,ffa30066 -1224925000,46,30,00830016 -1224935000,46,31,ff57fff2 -1226815000,47,0,00380043 -1226825000,47,1,ff6c005c -1226835000,47,2,01bcfeea -1226845000,47,3,fde2001f -1226855000,47,4,010000fc -1226865000,47,5,feba018a -1226875000,47,6,01d9fb42 -1226885000,47,7,002f0220 -1226895000,47,8,fde803c5 -1226905000,47,9,0046fbb4 -1226915000,47,10,010000ba -1226925000,47,11,01ec01cb -1226935000,47,12,fcd0fddc -1226945000,47,13,016c00de -1226955000,47,14,fff30022 -1226965000,47,15,ffb3ff96 -1228845000,47,16,00a1ffaf -1228855000,47,17,fff4006c -1228865000,47,18,fee8003a -1228875000,47,19,ff5cfe50 -1228885000,47,20,034e006e -1228895000,47,21,fc0bff97 -1228905000,47,22,0342025c -1228915000,47,23,ff7efe11 -1228925000,47,24,fed7015d -1228935000,47,25,00cafbde -1228945000,47,26,007a03aa -1228955000,47,27,fef6feae -1228965000,47,28,00820182 -1228975000,47,29,ff57fe83 -1228985000,47,30,0124ffec -1228995000,47,31,fed00065 -1230875000,48,0,0023ffed -1230885000,48,1,ffff011b -1230895000,48,2,005efe65 -1230905000,48,3,ff8c0006 -1230915000,48,4,fff0ffda -1230925000,48,5,ff100499 -1230935000,48,6,0298f993 -1230945000,48,7,ff4a03ba -1230955000,48,8,fdf3ff1f -1230965000,48,9,014ffea9 -1230975000,48,10,019e028d -1230985000,48,11,ff1aff0c -1230995000,48,12,fda6fe16 -1231005000,48,13,02ea012f -1231015000,48,14,fea8007f -1231025000,48,15,ffe0ffa8 -1232905000,48,16,0038001e -1232915000,48,17,009affa5 -1232925000,48,18,fdb8008d -1232935000,48,19,017fff2b -1232945000,48,20,0058ff07 -1232955000,48,21,fec3fef0 -1232965000,48,22,02790297 -1232975000,48,23,ffca0220 -1232985000,48,24,fc06fa18 -1232995000,48,25,07b60213 -1233005000,48,26,f9aa01bd -1233015000,48,27,0473fd79 -1233025000,48,28,fbee02ff -1233035000,48,29,02b1fe64 -1233045000,48,30,fef90043 -1233055000,48,31,ffd8ffb0 -1234935000,49,0,ffa3fff3 -1234945000,49,1,00cd0105 -1234955000,49,2,ff0ffe57 -1234965000,49,3,fee50111 -1234975000,49,4,0276ff5b -1234985000,49,5,fe840131 -1234995000,49,6,ff0dfeb0 -1235005000,49,7,03570103 -1235015000,49,8,fabdfffd -1235025000,49,9,02f100e7 -1235035000,49,10,0359fde1 -1235045000,49,11,fc4d023d -1235055000,49,12,0062fe55 -1235065000,49,13,0012ff4f -1235075000,49,14,008301f0 -1235085000,49,15,fff3fecb -1236965000,49,16,008d004c -1236975000,49,17,0011ffad -1236985000,49,18,feb20112 -1236995000,49,19,0102fe58 -1237005000,49,20,ffc8004f -1237015000,49,21,0227ff78 -1237025000,49,22,fdd403d8 -1237035000,49,23,01ccfe11 -1237045000,49,24,fb97ff30 -1237055000,49,25,0609fecd -1237065000,49,26,fb0c0268 -1237075000,49,27,02c8ff56 -1237085000,49,28,fd38ffad -1237095000,49,29,02a7ffbe -1237105000,49,30,ff2a007e -1237115000,49,31,ff92ffa9 -1238995000,50,0,0027ffe4 -1239005000,50,1,ff680075 -1239015000,50,2,008bff50 -1239025000,50,3,00930179 -1239035000,50,4,fdb5fea8 -1239045000,50,5,02d301b0 -1239055000,50,6,ff9afc37 -1239065000,50,7,fee7045c -1239075000,50,8,010bfe80 -1239085000,50,9,fdf0ff5f -1239095000,50,10,02abff4e -1239105000,50,11,00dd008f -1239115000,50,12,fba500e0 -1239125000,50,13,020dfefc -1239135000,50,14,00d40087 -1239145000,50,15,ff41ffd4 -1241025000,50,16,0035ff55 -1241035000,50,17,ffbb00c3 -1241045000,50,18,fef5feec -1241055000,50,19,014000f1 -1241065000,50,20,ff6afd66 -1241075000,50,21,02e502d0 -1241085000,50,22,fd82fec8 -1241095000,50,23,00a800d3 -1241105000,50,24,ff0500a1 -1241115000,50,25,022ffd49 -1241125000,50,26,fdd9024e -1241135000,50,27,01e200d1 -1241145000,50,28,fdc8fe00 -1241155000,50,29,01b10054 -1241165000,50,30,fec4ff52 -1241175000,50,31,00d6012b -1243055000,51,0,00230072 -1243065000,51,1,ffa5fffa -1243075000,51,2,0200ff17 -1243085000,51,3,fd7301b2 -1243095000,51,4,ff03fdcd -1243105000,51,5,0385017d -1243115000,51,6,ff8bff81 -1243125000,51,7,fdab0072 -1243135000,51,8,ffaffdcc -1243145000,51,9,01370268 -1243155000,51,10,ff84ff9f -1243165000,51,11,00bd01a4 -1243175000,51,12,ff8ffdc5 -1243185000,51,13,00230091 -1243195000,51,14,00a500e1 -1243205000,51,15,ff89fee0 -1245085000,51,16,00a1ffad -1245095000,51,17,ffd40080 -1245105000,51,18,fe7b008f -1245115000,51,19,0277fe43 -1245125000,51,20,fed70182 -1245135000,51,21,ffcdffc3 -1245145000,51,22,febb0072 -1245155000,51,23,01d200e5 -1245165000,51,24,fc5ffced -1245175000,51,25,0416020c -1245185000,51,26,fed3fdad -1245195000,51,27,0071017d -1245205000,51,28,ff89011c -1245215000,51,29,ffd5fe59 -1245225000,51,30,00770192 -1245235000,51,31,fefaff6b -1247115000,52,0,fffc0056 -1247125000,52,1,ff36004f -1247135000,52,2,0257fef7 -1247145000,52,3,fe0d008e -1247155000,52,4,ff6d00b6 -1247165000,52,5,ff8cffdd -1247175000,52,6,0220fcd0 -1247185000,52,7,003603e5 -1247195000,52,8,fc4401de -1247205000,52,9,02b0fbff -1247215000,52,10,016b0071 -1247225000,52,11,ff6f01be -1247235000,52,12,fe93fde2 -1247245000,52,13,002200ed -1247255000,52,14,009600f4 -1247265000,52,15,0002febf -1249145000,52,16,0018ff91 -1249155000,52,17,00c300a7 -1249165000,52,18,fe230115 -1249175000,52,19,0238fc2d -1249185000,52,20,fe4003a6 -1249195000,52,21,0077fe46 -1249205000,52,22,000b0322 -1249215000,52,23,00e7fd24 -1249225000,52,24,faf40143 -1249235000,52,25,058dfd9f -1249245000,52,26,fe0dff4f -1249255000,52,27,01c40211 -1249265000,52,28,fe30ff72 -1249275000,52,29,0075005c -1249285000,52,30,00b9004e -1249295000,52,31,fef1fff6 -1251175000,53,0,ffa7006b -1251185000,53,1,00bf001d -1251195000,53,2,fedcfee5 -1251205000,53,3,0083018a -1251215000,53,4,ffedfe20 -1251225000,53,5,fee204f6 -1251235000,53,6,0165f9e7 -1251245000,53,7,005601aa -1251255000,53,8,ffd10317 -1251265000,53,9,fef5fe5b -1251275000,53,10,ffb6fec9 -1251285000,53,11,02e300f0 -1251295000,53,12,fe9bff4a -1251305000,53,13,ff5600c2 -1251315000,53,14,0019ff97 -1251325000,53,15,0048ff94 -1253205000,53,16,006bffee -1253215000,53,17,0063ff69 -1253225000,53,18,fe1c0269 -1253235000,53,19,02c7fb9c -1253245000,53,20,fdc0034c -1253255000,53,21,00b4fe4b -1253265000,53,22,0066010b -1253275000,53,23,00f90130 -1253285000,53,24,fdb5fd0c -1253295000,53,25,0297fff3 -1253305000,53,26,007a006d -1253315000,53,27,fe51ffc8 -1253325000,53,28,00b40346 -1253335000,53,29,001efcc9 -1253345000,53,30,00280123 -1253355000,53,31,ff7bfffc -1255235000,54,0,004b0039 -1255245000,54,1,00280058 -1255255000,54,2,fee1ff0d -1255265000,54,3,020d005e -1255275000,54,4,ff4bfec0 -1255285000,54,5,fe4804a7 -1255295000,54,6,013ff95c -1255305000,54,7,ff930344 -1255315000,54,8,006b01ff -1255325000,54,9,ff9efde6 -1255335000,54,10,00950035 -1255345000,54,11,011f0040 -1255355000,54,12,fcf7fec8 -1255365000,54,13,01ea011b -1255375000,54,14,0023008a -1255385000,54,15,ff79ff36 -1257265000,54,16,0093ff78 -1257275000,54,17,fff000a3 -1257285000,54,18,ffa6fff3 -1257295000,54,19,ff53fe9a -1257305000,54,20,02c0007d -1257315000,54,21,fd5600b5 -1257325000,54,22,0198018a -1257335000,54,23,ff2a000a -1257345000,54,24,fed5ff9a -1257355000,54,25,0084ff3d -1257365000,54,26,ff5efed7 -1257375000,54,27,002d0006 -1257385000,54,28,00e80215 -1257395000,54,29,fedafe5f -1257405000,54,30,01bc00e8 -1257415000,54,31,fe1a0012 -1259295000,55,0,fff20019 -1259305000,55,1,000a0015 -1259315000,55,2,ffdbffcf -1259325000,55,3,007d0164 -1259335000,55,4,fe66fc74 -1259345000,55,5,020a04dc -1259355000,55,6,ff67fb95 -1259365000,55,7,002e034a -1259375000,55,8,fd9affdd -1259385000,55,9,02acfd3f -1259395000,55,10,00ef0279 -1259405000,55,11,002f003e -1259415000,55,12,fbd6fd06 -1259425000,55,13,039801f4 -1259435000,55,14,feefffd3 -1259445000,55,15,ffe6ffd0 -1261325000,55,16,001a009d -1261335000,55,17,ff62ff1f -1261345000,55,18,01200165 -1261355000,55,19,fe6ffea5 -1261365000,55,20,01d5ff37 -1261375000,55,21,fe6a01d3 -1261385000,55,22,01d8fed9 -1261395000,55,23,013c02cd -1261405000,55,24,fce4fcd9 -1261415000,55,25,014400dd -1261425000,55,26,fddcff35 -1261435000,55,27,0239fe81 -1261445000,55,28,001d022f -1261455000,55,29,ffd0fea1 -1261465000,55,30,ff840091 -1261475000,55,31,0084ff2d -1263355000,56,0,ffa7ff88 -1263365000,56,1,003400e3 -1263375000,56,2,00810034 -1263385000,56,3,fe66ff66 -1263395000,56,4,0158fcc5 -1263405000,56,5,ff16071e -1263415000,56,6,ffdffa8b -1263425000,56,7,01900282 -1263435000,56,8,ff4d0056 -1263445000,56,9,fe9afe23 -1263455000,56,10,03430088 -1263465000,56,11,ff1000fa -1263475000,56,12,fdccfdc1 -1263485000,56,13,019401fc -1263495000,56,14,ff75feed -1263505000,56,15,00520066 -1265385000,56,16,005c0004 -1265395000,56,17,000e0053 -1265405000,56,18,fdc40037 -1265415000,56,19,0368ff16 -1265425000,56,20,ff2d00a5 -1265435000,56,21,fe6dfc7c -1265445000,56,22,02d804db -1265455000,56,23,ffa2fde0 -1265465000,56,24,fdc2011e -1265475000,56,25,04ccff23 -1265485000,56,26,fc2afea5 -1265495000,56,27,0442024a -1265505000,56,28,fa4900dd -1265515000,56,29,0225fe0a -1265525000,56,30,003e006d -1265535000,56,31,ffc0ffdc -1267415000,57,0,ff95ffe1 -1267425000,57,1,008d005a -1267435000,57,2,0043ff57 -1267445000,57,3,fe8901e8 -1267455000,57,4,00ecfc46 -1267465000,57,5,ff7e029d -1267475000,57,6,0218ff72 -1267485000,57,7,fce90235 -1267495000,57,8,00adfb9b -1267505000,57,9,01150416 -1267515000,57,10,010dff19 -1267525000,57,11,ff33fd36 -1267535000,57,12,fed2024e -1267545000,57,13,0058001b -1267555000,57,14,0040ff0e -1267565000,57,15,003b0085 -1269445000,57,16,ffd5ffa8 -1269455000,57,17,008a005f -1269465000,57,18,fe54ff5b -1269475000,57,19,018f0040 -1269485000,57,20,007cffbb -1269495000,57,21,ffd2fed8 -1269505000,57,22,004a0315 -1269515000,57,23,fe6b00af -1269525000,57,24,fff1ff56 -1269535000,57,25,0168fd75 -1269545000,57,26,fcf400cb -1269555000,57,27,05cbff86 -1269565000,57,28,fa2a0297 -1269575000,57,29,02b8fd1c -1269585000,57,30,ff42018d -1269595000,57,31,ffffffbb -1271475000,58,0,fff1ffec -1271485000,58,1,ff7300b0 -1271495000,58,2,01e8ff64 -1271505000,58,3,fdd50126 -1271515000,58,4,ffb4fe43 -1271525000,58,5,01a6003f -1271535000,58,6,0150016b -1271545000,58,7,fbddfff0 -1271555000,58,8,014ffe78 -1271565000,58,9,030d01fe -1271575000,58,10,fd46ffd4 -1271585000,58,11,0255fdaa -1271595000,58,12,fe800159 -1271605000,58,13,ff0effd3 -1271615000,58,14,01260015 -1271625000,58,15,ffadffc8 -1273505000,58,16,003effa5 -1273515000,58,17,0035fff1 -1273525000,58,18,ff7c00ea -1273535000,58,19,00c4fee3 -1273545000,58,20,fffaffed -1273555000,58,21,fea4fdbf -1273565000,58,22,01c105c6 -1273575000,58,23,00a1fc06 -1273585000,58,24,faf201b3 -1273595000,58,25,05d7fc2d -1273605000,58,26,fe5202e0 -1273615000,58,27,0180fe43 -1273625000,58,28,fec6017f -1273635000,58,29,ff28ffe7 -1273645000,58,30,0181fffc -1273655000,58,31,ff13ffe0 -1275535000,59,0,ffc0ffff -1275545000,59,1,002e00b6 -1275555000,59,2,001cfeb7 -1275565000,59,3,fea8014c -1275575000,59,4,0052fee7 -1275585000,59,5,015700e3 -1275595000,59,6,005900a9 -1275605000,59,7,fe66fed8 -1275615000,59,8,ffdcff1b -1275625000,59,9,011a030e -1275635000,59,10,ff5afd3f -1275645000,59,11,0182013c -1275655000,59,12,ffb60027 -1275665000,59,13,fe05fedd -1275675000,59,14,01850049 -1275685000,59,15,ffd4000c -1277565000,59,16,0088ffc2 -1277575000,59,17,0098ffd3 -1277585000,59,18,fd7601aa -1277595000,59,19,02bbfd44 -1277605000,59,20,febc001b -1277615000,59,21,00c00048 -1277625000,59,22,00990039 -1277635000,59,23,00ad0074 -1277645000,59,24,fcb2022e -1277655000,59,25,03bafaaf -1277665000,59,26,fdec031c -1277675000,59,27,01b7ff26 -1277685000,59,28,fdce0001 -1277695000,59,29,010a0016 -1277705000,59,30,0079ffc5 -1277715000,59,31,ff2d0042 -1279595000,60,0,ffb0ffc6 -1279605000,60,1,0097011d -1279615000,60,2,009afe82 -1279625000,60,3,fe010203 -1279635000,60,4,00e5fd4a -1279645000,60,5,0184022e -1279655000,60,6,ff91ff1c -1279665000,60,7,00460087 -1279675000,60,8,fbe2fe72 -1279685000,60,9,03fb009f -1279695000,60,10,01760112 -1279705000,60,11,fd19ff79 -1279715000,60,12,fee5fe82 -1279725000,60,13,01da0186 -1279735000,60,14,ffcb0064 -1279745000,60,15,ffe8ff75 -1281625000,60,16,0062ffa5 -1281635000,60,17,002500b7 -1281645000,60,18,fe5d009f -1281655000,60,19,010ffd9c -1281665000,60,20,013601b1 -1281675000,60,21,fbb8fc62 -1281685000,60,22,05e604af -1281695000,60,23,fcecfdfa -1281705000,60,24,00280109 -1281715000,60,25,0171fdbf -1281725000,60,26,0045001f -1281735000,60,27,fec900ea -1281745000,60,28,ffc801d9 -1281755000,60,29,fff2fddc -1281765000,60,30,0068006b -1281775000,60,31,ff74fffc -1283655000,61,0,ff95ffe2 -1283665000,61,1,00b1fff2 -1283675000,61,2,ff64006a -1283685000,61,3,ff9afebe -1283695000,61,4,01d400b1 -1283705000,61,5,fc8900a5 -1283715000,61,6,046dff69 -1283725000,61,7,fd25fdeb -1283735000,61,8,004f051c -1283745000,61,9,fedbfa5c -1283755000,61,10,030e0292 -1283765000,61,11,fd920048 -1283775000,61,12,ffc40029 -1283785000,61,13,00a3ff99 -1283795000,61,14,006d004b -1283805000,61,15,002ffffb -1285685000,61,16,00610066 -1285695000,61,17,ff5900e9 -1285705000,61,18,002bff1f -1285715000,61,19,ffaa0030 -1285725000,61,20,0144ff6e -1285735000,61,21,fc020098 -1285745000,61,22,04060002 -1285755000,61,23,0032015b -1285765000,61,24,fdfffeea -1285775000,61,25,0183feed -1285785000,61,26,fda500a9 -1285795000,61,27,0344002a -1285805000,61,28,fd3400ba -1285815000,61,29,015aff4a -1285825000,61,30,ff1a0156 -1285835000,61,31,0000fe8b -1287715000,62,0,ffe0ffb5 -1287725000,62,1,ffeb008c -1287735000,62,2,004effb6 -1287745000,62,3,ffe8ff5e -1287755000,62,4,ff090058 -1287765000,62,5,000b0020 -1287775000,62,6,0314001e -1287785000,62,7,fa80feee -1287795000,62,8,0398043f -1287805000,62,9,feedfb66 -1287815000,62,10,01ba0274 -1287825000,62,11,ffb2fe7c -1287835000,62,12,ff7b0134 -1287845000,62,13,fe81ff4e -1287855000,62,14,0230ff78 -1287865000,62,15,ff3a0098 -1289745000,62,16,0018ff95 -1289755000,62,17,ffdb00e0 -1289765000,62,18,fe62fe43 -1289775000,62,19,03f80169 -1289785000,62,20,fe91fdf0 -1289795000,62,21,ff3903f3 -1289805000,62,22,fec5fe71 -1289815000,62,23,026b001d -1289825000,62,24,fd98ffbf -1289835000,62,25,0299fe4a -1289845000,62,26,ff36fff3 -1289855000,62,27,ff20023f -1289865000,62,28,fefffd40 -1289875000,62,29,024f014b -1289885000,62,30,ff83ff15 -1289895000,62,31,000100f3 -1291775000,63,0,0050ffef -1291785000,63,1,000efff1 -1291795000,63,2,00060141 -1291805000,63,3,ffa2fe18 -1291815000,63,4,020500c3 -1291825000,63,5,fb86fe6f -1291835000,63,6,039a01db -1291845000,63,7,ff2fffd4 -1291855000,63,8,fffa02e1 -1291865000,63,9,fe24f9cb -1291875000,63,10,035c02db -1291885000,63,11,fece01e8 -1291895000,63,12,feedfe69 -1291905000,63,13,0004ff91 -1291915000,63,14,01500095 -1291925000,63,15,ff1dffe8 -1293805000,63,16,00820045 -1293815000,63,17,ffd0ff97 -1293825000,63,18,ff25ffc4 -1293835000,63,19,00a6ffc0 -1293845000,63,20,ffb0ff0e -1293855000,63,21,ff8a022b -1293865000,63,22,0276ffeb -1293875000,63,23,fed6fe67 -1293885000,63,24,fe760175 -1293895000,63,25,00aaff6d -1293905000,63,26,006dffe8 -1293915000,63,27,ff440068 -1293925000,63,28,0060ffd4 -1293935000,63,29,ff180105 -1293945000,63,30,0070fedd -1293955000,63,31,ff34001d diff --git a/9_Firmware/9_2_FPGA/tb/cosim/validate_mem_files.py b/9_Firmware/9_2_FPGA/tb/cosim/validate_mem_files.py index 8b9d79e..7f74d43 100644 --- a/9_Firmware/9_2_FPGA/tb/cosim/validate_mem_files.py +++ b/9_Firmware/9_2_FPGA/tb/cosim/validate_mem_files.py @@ -421,13 +421,13 @@ def test_latency_buffer(): # # For synthesis: the latency_buffer feeds ref data to the chain via # chirp_memory_loader_param → latency_buffer → chain. - # But wait — looking at radar_receiver_final.v: + # Looking at radar_receiver_final.v: # - mem_request drives valid_in on the latency buffer # - The buffer delays {ref_i, ref_q} by LATENCY valid_in cycles - # - The delayed output feeds long_chirp_real/imag → chain + # - The delayed output feeds ref_chirp_real/imag → chain # # The purpose: the chain in the SYNTHESIS branch reads reference data - # via the long_chirp_real/imag ports DURING ST_FWD_FFT (while collecting + # via the ref_chirp_real/imag ports DURING ST_FWD_FFT (while collecting # input samples). The reference data needs to arrive LATENCY cycles # after the first mem_request, where LATENCY accounts for: # - The fft_engine pipeline latency from input to output diff --git a/9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem b/9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem deleted file mode 100644 index ec09a18..0000000 --- a/9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem +++ /dev/null @@ -1,2176 +0,0 @@ -// 0x00000000 -0024ffdd -fff7002d -007d0098 -ff1afe23 -00130108 -ff530243 -0274fb9d -fee40370 -fe98ff6f -ff8bffa9 -03dffdd0 -fe3c042d -fdddfcc0 -00ff00cb -015400f7 -ff22ff4c -// 0x00000010 -ffedfff1 -00880078 -fe31ffb7 -026c00de -fd2afd6f -0293ffc3 -fef10677 -ff6efadf -008900ad -017a0014 -fdc301a1 -020cff8e -fce0ffbb -025f00b1 -fe73fff1 -008effbd -// 0x00000020 -ffcd0030 -009d0057 -fecbff41 -0110007a -0148ff8e -fd2e0229 -ffe5fd1c -0483ffb6 -fb2f02ce -02110069 -0095fb47 -ffd003b8 -fdfcfdac -011801c3 -0023003c -0001ff54 -// 0x00000030 -004fffd0 -0078fee5 -fed201e1 -0097fe5a -00ab0130 -ff73febb -00f301a4 -fea60124 -fe03fe84 -0184fea7 -ff1cffeb -03210146 -fc5fff84 -017d0025 -0053ff88 -fef600b0 -// 0x00000040 -00260082 -ff99ff96 -016e0095 -0034ff2d -fce100d7 -0276ff6c -00a0ffaa -fdc400b8 -01dcffc4 -fe1901ae -0304fcf3 -fe240203 -0031fe2f -fefc0150 -0182006a -ff18ff30 -// 0x00000050 -005bff79 -0004ffcc -fef70100 -0136fe70 -ffb80156 -01b1feff -fdac03d6 -fdfafa69 -0289032f -feacfecc -004dffb2 -00d60062 -fee0fe8e -020f0245 -fda4feac -006a0079 -// 0x00000060 -ffe10086 -0026ffcd -00990030 -ffe4ff8a -fe7100c5 -0179ffc6 -ff2ffd5e -01ed0473 -fbd9fdf4 -037800d1 -0033fe0a -ff4202c0 -ffa5fc5d -ffa90298 -00950004 -ffcdff0f -// 0x00000070 -00fdffc2 -ff790028 -ffa70037 -ff03000a -015cfe75 -00850151 -fe83fec3 -029e02b0 -f995fb6c -072302fc -fd0dfef3 -006300bc -ff8efe5d -00ef0193 -ff8dffbb -ff0cffba -// 0x00000080 -ffcb0066 -0050fffb -ffe0fed3 -ffa40100 -00b60022 -fe7cffd3 -0039000a -02ccfed9 -f9eb01a6 -061800f3 -fd90fe8d -00fa013e -fedcfd16 -015401e7 -fee700b2 -0086fee1 -// 0x00000090 -0016ffea -0041ffa2 -000b0138 -ff6aff83 -001fff0e -feb400ab -02910079 -fe2b01c7 -fd2afd74 -06d7ff6e -fb1d0056 -04a2003b -f9bd02cc -03c4fe85 -fef3ffa1 -ffb1005b -// 0x000000a0 -ffbd003f -0098007e -fed5fe93 -00f30177 -0051febd -fe7d0440 -019bfb1a -014cff8a -fd6b039f -0104fdc4 -ff77ffa3 -0059012b -ffa3ff59 -0073002a -ffcd0094 -000cff50 -// 0x000000b0 -00a20046 -006fff8c -fd68015d -02c6fcac -fffb02b4 -ff45fea6 -ff1200ce -02840190 -fdbcfc60 -02e10144 -0016fff3 -fd92012a -00af000e -ff4ffebe -02100082 -fe78ffbe -// 0x000000c0 -0082ff86 -ff1800e6 -0081fef2 -015c009b -fe04feb0 -009a013d -010efe57 -fc9002f3 -030aff5e -ffb8fc76 -fef904e4 -0254fd7b -fcf800d0 -019efe6f -00080137 -ffa00027 -// 0x000000d0 -00780011 -ff34004c -fffaff6d -00c70042 -fe0dfea3 -027d02f2 -fc5cfe46 -057b013c -f8b2fc3f -0562022c -002cfeeb -fe690180 -ffd5fe91 -008901b2 -ffcaff4e -ff91ffc6 -// 0x000000e0 -ff65ffee -00aa005c -ffd7003b -fffbffa2 -fe6cffd3 -031f022a -feccfb03 -00dd0534 -fcd3fe16 -01c8fd94 -01f902e7 -feb5fff0 -fdd4fde9 -02030176 -ff8c004b -003fff7a -// 0x000000f0 -00480050 -0009ff92 -fe4c01c7 -0141fc4b -00a20287 -ff50fe69 -0034009d -03840148 -fc3aff7e -007b0044 -fed2fda3 -02d1ffa5 -ff00039f -0050fd79 -ff220035 -00aeffb0 -// 0x00000100 -ffb70007 -0039007c -000c00ac -fed5fd66 -01630101 -004b045d -fddffb1d -013bfff2 -00670371 -019ffd88 -fd5c0286 -0261fc42 -fd5b0043 -02b9021b -fd8dff35 -0103ffaa -// 0x00000110 -0021ffc0 -0088000a -fedb011e -ffccfe84 -01a00014 -feccfc60 -01cc0642 -fd17fdb6 -0179fd86 -03b20270 -fc39fdda -03140372 -fc5efcbe -017202fa -fff8fdf6 -fff10068 -// 0x00000120 -ff89003d -00460071 -0076ffc4 -ff900112 -ff17fdeb -016f0256 -010bfd4a -ffd50316 -fc91fdf7 -02e4ffc9 -01aefebe -fca002ba -004ffe59 -00570004 -00410154 -001bfef2 -// 0x00000130 -004bffd7 -ff730074 -ffcdfeb5 -01fe0249 -fd93fdfa -00b7fe2f -0036028e -032fff58 -fbf10153 -01fdfeba -fe79fe5b -03e8039b -fb99fcb8 -0171022f -ff8cfece -00530000 -// 0x00000140 -0036004a -fee4ffae -01d300ba -ffc9ffc9 -fe13fee6 -02e90074 -fcdb01e8 -00f9fde3 -00e60036 -01de0198 -fbe9fed8 -02afffd1 -ff5dffa6 -004dffd2 -ff2d014a -0047ff27 -// 0x00000150 -002effb9 -0012006b -fdcfffcc -035bfe87 -fe2b007f -0139fe13 -00c50461 -feabfed4 -fe3aff77 -046afe17 -fc47020c -02b5fe7b -fc7d0085 -03b3ffe7 -fe350023 -004dfffe -// 0x00000160 -ffcc0042 -0019006f -00eaff0f -fe1f010a -0030febc -01aefffd -ff16027c -ff96fdaf -ff780078 -032d01ad -fc48fcef -02cf0088 -febc02ba -feb8fd1b -01a8016e -ffb0ff73 -// 0x00000170 -ffe2ff96 -00d7ffb3 -fe2d00f1 -00e5ff2e -fec4ff23 -02690026 -00aa0079 -fddf016f -ff1afe12 -039fff2f -fc8f0283 -02ddfe72 -fe440201 -0005fdbc -ffa6005f -002b0075 -// 0x00000180 -ffa5ffca -00830144 -ffc1fdb2 -ffbb02b0 -fff2fd05 -ff5f036f -032afd5a -fd540072 -fe6701c4 -0347ffbc -ffcdfd3a -004d015c -fdf6015d -fff3fda1 -012c015a -ffb0ffe2 -// 0x00000190 -00a8ff77 -00240110 -fe8efff4 -00a1fece -0169005a -fc73fddc -053c02e0 -fcc9fe6b -feda0131 -0490fda4 -fcf60178 -01bbfed4 -fe0901da -01a1fdfc -ff7c0198 -ff53ff27 -// 0x000001a0 -ffccffcd -00ed0068 -fe73ff6e -01130031 -feb2fe08 -0075056c -018ef9b3 -fe2e03c4 -00b60125 -ff0dfc72 -01d10050 -001902b9 -fd28fe6a -01d5002e -0072000b -ffc2fffe -// 0x000001b0 -00beffee -fefa0049 -005cffde -00d5ff4a -fe59006d -024c00d1 -fed2017e -0018ffd5 -fde2ff56 -fffafd19 -03580252 -fb8dff48 -039b00f7 -fe78ff55 -00e60082 -feee0029 -// 0x000001c0 -ff7d0027 -010fffea -ffa400f7 -fe85fee8 -021cffae -fea8016a -00e6fef6 -fe98ff05 -0165039f -fec7fdfe -01defe67 -ff650238 -0076fe14 -fdae0142 -01ecffa4 -ff8affc7 -// 0x000001d0 -0047ffd2 -0089003a -fda50108 -02ebfcb5 -fec601a2 -00c400ab -ff1cff9e -022c01dc -fac1fc2c -04250286 -ff6dfdf4 -0015fffb -002e005c -ffc6ff15 -00de01e2 -ff44feec -// 0x000001e0 -00120019 -0022ff0b -004701f6 -00cfffb0 -fcf1fdbf -02f800be -ffb501a5 -fce8ffb1 -03e400dd -fef8fdb1 -000f0000 -ffbb022e -ff99fdb3 -003e0146 -0065ff75 -ff4e0039 -// 0x000001f0 -007fffdd -ff23000f -00a7fffa -ff4fff4f -016bff4b -01ce0213 -f9ab01e7 -0532fd47 -fd7b001b -00dfff37 -ff49ff98 -013f0101 -fe9fffc9 -00f00087 -ffd1ff33 -ffd00041 -// 0x00000200 -0017002b -ffb20001 -00160008 -ffc5fefa -ffd900dd -fe9b0276 -02c6fc2a -005802e0 -fbbfffaf -03a6fceb -ffec04e2 -00ebfe32 -fc75fd51 -03bd021a -fe14ffec -0048ff70 -// 0x00000210 -003e002a -0072004f -fdf20013 -01f4ff78 -ff98ffb3 -fe16fede -0471018a -fd5701a8 -ff48fc3c -04b20227 -fcf4ff6d -026600f6 -fb6a000f -04260020 -fe21ffe6 -006fffae -// 0x00000220 -ffae0061 -0058ffd9 -0054fff0 -fe930079 -012fff0f -fe4bffcc -018500c9 -015300cd -fa94006f -0504fe0f -00ce00c4 -fdaf00b5 -ff5bfed1 -0181000c -ff350173 -009bfea5 -// 0x00000230 -00c50001 -ff720023 -feb5ffea -024a00b6 -fddcfdd9 -02ca00af -fc64025a -0329fdd5 -fca1022f -034efbf1 -00990436 -fddafe74 -ff62003f -008a0135 -0022fec6 -ff370061 -// 0x00000240 -ffe60003 -002dfff1 -00cd0039 -ffa2ffce -fd55003e -0451ff23 -febd0040 -fd4601b1 -023efea3 -ff23005b -02edffdf -fda4ffbe -ff8f0028 -0047ffc1 -0119fff4 -fef4003b -// 0x00000250 -ffbbff2a -002d00b0 -00c9fee7 -ffb00251 -ff06fd06 -0101011d -ff86ffc7 -0274010c -f9ff0130 -06edfc16 -fc050153 -01f4002b -ffdcfef8 -ff810101 -00a8ffbf -ffe4007c -// 0x00000260 -00420005 -fec50098 -02eefef1 -fe430108 -fde0ff13 -0241ffbe -0163ff90 -fcd203a7 -0026fc63 -01dd0170 -0024ffdd -002d0012 -fe88ff5d -ffe50006 -014b00e2 -ff66ff5b -// 0x00000270 -005effad -ffc80081 -fe430065 -026dfd90 -ff30011b -00d902bd -fe3cfd72 -027a02b0 -fb20fad7 -03480525 -ff27fbb7 -01e1018a -fe82009d -009ffea9 -ffa2017e -ffb8ff82 -// 0x00000280 -fffe0094 -ffbdffda -00bdff48 -003500aa -fe45ff6a -00dc0243 -007afc67 -ffaa0274 -fed800ea -02f3fd90 -fe53020c -00d5fec6 -fd9dfe8c -02d001cf -fe460059 -0068ff18 -// 0x00000290 -004eff71 -001b003a -fe44017f -0283fd90 -fd780030 -02b500d6 -fd7fff51 -0113030f -fd68faa3 -03bd0310 -ff32fd01 -015301c0 -fc82016c -02e3fdb4 -fec3016f -ffdfffbd -// 0x000002a0 -ffb40015 -ffc1006e -00d4fedd -ff1e01ec -ff9cfdaa -00a80392 -013bfb1a -fc35036c -03e40047 -ff1b0094 -fe92fe1f -0368fee4 -fdc00186 -ff640054 -007bff0e -004d002c -// 0x000002b0 -ffed0022 -005efef7 -004f0227 -004bff24 -fe6a0006 -fedcfef9 -0325ff9f -fe860265 -00d7fe50 -0050fed1 -fec90163 -004bfc56 -012204e4 -0042fd23 -ff230173 -0038ff35 -// 0x000002c0 -00240021 -ff74ffd7 -009dffe2 -00f6019f -ff44fd14 -fd2c02e5 -0348fc5a -ffaf0463 -000cff89 -ff5efcd7 -fff10160 -014a00e5 -fe9cfe2e -00c20169 -ff22ff88 -0049000d -// 0x000002d0 -0058ff8e -ff92000c -ff2f0013 -01f800a7 -fe59fc15 -01f10480 -fce7fd9a -035b0321 -fd84fd2a -01240066 -ff69ff2b -0054ff17 -ff3f015b -018dff26 -ffad0088 -ff850031 -// 0x000002e0 -ffceffb0 -ffab00d1 -005e0005 -0023ffb7 -0025fe43 -fe3d042f -02f0fab5 -fe44046e -0048005a -ffd7fa85 -004803af -014b013d -fce1fd8b -022d00a3 -ff4e0097 -0062ff9e -// 0x000002f0 -00750062 -ff2d0058 -ffbcffb5 -00edff63 -ff79008d -ffd4fe79 -008401fc -02d8fed7 -fced0208 -0073ff32 -ff52fc25 -026b04ad -fd1dfe75 -01cc0015 -fee6ffde -00b0ff61 -// 0x00000300 -fffd0025 -ff8700f7 -0118fe86 -ffc60049 -ffe2ffde -fdc00404 -02c2f902 -ff8c04da -ff71001f -0053fe9b -018c0074 -fef8ff8f -fe40fdc6 -025e030e -fe9aff6c -002eff5a -// 0x00000310 -0046fff0 -0084004a -fde000de -01fefe2b -0018ff7f -fcccff81 -0446028f -ff7cff0c -fc180060 -0562fc18 -fc980236 -041c0149 -fa0eff71 -035eff25 -ff86005d -ffd2ff88 -// 0x00000320 -ffa80057 -0053ffab -00c5013c -fde2ff7f -01affdc4 -fe260398 -0321fd50 -fcff0207 -011efff3 -00a1fe27 -ff990224 -0160fde9 -fd770072 -01ca0106 -ff05ff60 -006bff91 -// 0x00000330 -002bff62 -ff60015d -ff85fe6a -0182ff88 -ffd6ffd6 -0045ffad -ff8e03c7 -0176fd4a -fccb002a -0316006f -fd81fe9e -046e014e -fb3cfe8e -02c101c7 -ff0cfec1 -00860080 -// 0x00000340 -ff9d0003 -ffb20051 -016aff7c -fd290196 -0285fd5a -fe640101 -00c60267 -00e5fec5 -fe83fe45 -01a6030b -ff62fd18 -00dbff54 -ff2302f6 -fe90fdb3 -014e00bd -0023fff1 -// 0x00000350 -005effb6 -012e0039 -fc780011 -030200b8 -ffc3fdb8 -ffcc012d -0058ff4a -ffa60337 -fdb0fd06 -03feff9b -feda0067 -0210fef4 -fce30234 -017cfeb3 -001200b6 -ff24ffa9 -// 0x00000360 -ff9f0022 -0063006c -00c60044 -fcf7ff21 -013aff70 -024402f4 -fdf1fd3f -00ce01d4 -ff85ffb2 -002dfe60 -00960190 -006dff2f -ff1200b8 -ffc4fee0 -004300c9 -0036ff64 -// 0x00000370 -0040ffb1 -0114ff59 -fd000206 -0365fd54 -feba01b9 -fe99ff66 -03160142 -fc70fec2 -0022ff37 -01eefdd3 -004a0232 -0101ffd8 -fdc0ffbf -0251001e -febcffce -ffd6005a -// 0x00000380 -ff03002e -016dffd6 -fffc008d -fd54008f -02b2fe1c -ff2c0194 -022fffe9 -fcbbfdb7 -00af0446 -0081fbd2 -020e02ab -fceefd61 -017801cc -fea60020 -00ebffcb -0043ffb5 -// 0x00000390 -0000ffc5 -005b0042 -fe3700cd -01bdff07 -ff4afed6 -fe0aff2a -05c60139 -fd4e0244 -fc84fd79 -071dffb6 -fb61ffad -03270085 -fd6e00d4 -01f2ff62 -fe76fff5 -00baffec -// 0x000003a0 -ffbb0030 -0053ffcf -00b7ffbd -ff500108 -ff03fead -ffb30178 -03e2fde7 -fbcc00b1 -019103ae -fef5fabf -022701e5 -fef6012c -ff31fe21 -ffd90192 -01880003 -ff52ff4b -// 0x000003b0 -001b0040 -ffc600ee -000ffed1 -ffeb0076 -00a7004b -fee8ff6c -01b1019f -ff9c01cc -fcfbfcc4 -02120140 -0065fdb1 -01bd0108 -fd4b01c9 -0148fe82 -fffb01f7 -ffccfe9a -// 0x000003c0 -ffce0016 -00150077 -001ffe63 -ffe902d5 -ff6afbd3 -ff8504ab -018afd06 -007601e3 -fe8cff20 -ffe700bd -0153fdab -014f010f -fcf001d7 -0057fd19 -01300174 -ff9affd9 -// 0x000003d0 -007e0039 -ff7c002f -ff08ffdb -0362ffa0 -faf9fef4 -04a80136 -fc3000a9 -034fff3d -febefedd -00e6009f -0164fe75 -fcb801b0 -02e3ff6a -ff820080 -ff440083 -ffe3fedf -// 0x000003e0 -ffd10031 -0099fffb -ffcfff15 -ffd1018f -0072fd59 -fc9202af -04b9fd92 -fe530286 -fda3ffaf -00e1ff33 -03d5ff2f -fc570317 -0082fce3 -007c01ab -0093ffc6 -ffa5ff94 -// 0x000003f0 -0077003a -002a0072 -fda6ff64 -0396ff50 -fd7f0119 -0005fdf7 -018303aa -01a0fe53 -fc91ff7a -03dc00e8 -fbf0ff94 -022c00a8 -ff29ff3f -00550167 -0037ff4a -ff1efff5 -// 0x00000400 -0027004d -fff5fff4 -00a2ffc2 -fe3100b0 -024aff2c -fd64018f -0423fcf4 -ff36030c -fb19fe8d -034bfdf2 -018e01cc -fd5f02a6 -008efbea -ff800203 -0145004e -ff66ff66 -// 0x00000410 -0000ffd4 -0068ffef -fe5b0119 -0145feb0 -ff97ff54 -0001fff6 -016a00c0 -00ba03b3 -fb0cface -05be00e5 -fdf103ef -00fbfc7a -fd0d0166 -00d1ffda -003aff6c -ffae002f -// 0x00000420 -ffde0044 -007b003d -0011ffe9 -fe4f0036 -0115fe01 -003404bf -0036fbfd -01290152 -fe0aff8a -001b009b -00ddfe5b -00570288 -fffffd89 -fe020101 -01800077 -ffc5ff48 -// 0x00000430 -000cffd0 -0152ff0f -fd320301 -01d5fd8e -ff39ffb3 -006efe91 -013d03d9 -fd20fea5 -000cff42 -02cafe0b -fe08021b -026ffd92 -fda30267 -0116ffd1 -ff95ff7f -ff9c001f -// 0x00000440 -004b003f -ff7e0035 -0103ff59 -00b60059 -fbf20063 -03efff36 -ff9dff7e -ff1a035e -ff33fc47 -01f601c1 -fefdfeed -015600b1 -fde0ff63 -fff10068 -018b0030 -ff0effc4 -// 0x00000450 -ffa9ffbf -ffc9ffb9 -ff8600a0 -0274ffb7 -fbf5feb8 -04a6ffe1 -fd1a03f3 -0017fded -fe67fe9d -01c70125 -ff04fe92 -02b8ffe3 -fbb70080 -03a2fff1 -fd800017 -0135ffe9 -// 0x00000460 -00180073 -ff7fffb1 -0148005f -fff0ff7b -fe26006c -016900bc -ff47fc1d -01a104a6 -fc5cff6d -0369ff95 -0008fe07 -ffa002b5 -fe96fcac -00f302da -fff1ff45 -ffd3ff8e -// 0x00000470 -00e4ff58 -ff5500b1 -fffeffae -0006009d -0056fd93 -fff101fa -fee7ff08 -034a01fb -faa4fccc -05930227 -fd26fe84 -0118016d -ff66fe01 -000701a2 -00a9ffde -fea00007 -// 0x00000480 -0011006b -ffc8ffb1 -0139001f -ff11000f -fe28ff9d -01bb013f -012cfe5a -004101a5 -fbcd0093 -04b2fd27 -fe6b00a7 -01830293 -fbe6fbf1 -02f702c1 -ff74ffdc -ffcfff59 -// 0x00000490 -002fffc5 -005affa5 -fed10244 -00c2fd27 -006a00dd -fd69fe06 -02c003e0 -fe77fe5c -004d00e3 -0042fbb5 -0033030c -0262ff63 -fb2601e7 -022bfe88 -ffe0002c -ff95000a -// 0x000004a0 -ffd7fffa -fff2fff9 -ffdeffcc -0104003b -fddcff3b -00c3014b -0269fe32 -fd39015d -002b0116 -013cfd07 -fdac00c6 -03fa01e3 -fbdeff09 -015b0051 -00e1ffa8 -ffed0029 -// 0x000004b0 -0047ffde -009f002b -ff24017a -ffdcfdb3 -011b0075 -fc2b009b -044800c9 -fee400eb -fefffdd6 -ffd7ff89 -01aaffae -ffe60165 -ff6b00ff -fe8bff09 -023e005f -fe6effcd -// 0x000004c0 -001bfffe -0006ffff -ffda004d -01ae0091 -fe59fe3e -ff0601dc -0158fc02 -017f0598 -fce1ff00 -0212fc5b -ff6201bf -015201b7 -fdcffd10 -013e01f6 -ff58ff76 -00150024 -// 0x000004d0 -0087ff7c -002a00e4 -fec3ff40 -00c1fff8 -ffbcfe1c -fef6042e -0262fd4b -fdd70136 -ffd7fd3a -00b8fff2 -00250184 -013fffec -fd5200b6 -01fcfdfc -ff420171 -ff4dff6e -// 0x000004e0 -ffcc0004 -005100a7 -001affbf -ffd3ff8a -ff80ff63 -005e03b5 -0235f9db -fe850446 -fecc00be -ffc5f9a7 -02000561 -ff51ff88 -fd80ff13 -021c0039 -ffc100bd -001fff7c -// 0x000004f0 -fffffff3 -ff8e0083 -ff83fee9 -02a6000f -fb8a0071 -046afe97 -fd1e01c9 -03a6015d -fbebff03 -001afe81 -01f5fde9 -fd5c0275 -02a4ff89 -ff92ffdd -fefaffdd -007cffcf -// 0x00000500 -ff4affd2 -016400e4 -ff0dfff1 -ff5aff09 -0068ff79 -00f70385 -fe78fb3d -021103c4 -fdbc0042 -022afcf8 -fe570187 -03860043 -fc26fdeb -00670227 -0078ff1b -003b0020 -// 0x00000510 -0067ff87 -006affba -fe13021c -0184fd52 -ffb10118 -ff28fbfc -01c30565 -0060fd3d -fd130211 -0258fd9e -ff6ffed4 -023803a2 -fc2dfd78 -01620108 -004bfed3 -ff800083 -// 0x00000520 -0021ffec -ff5d00ec -01acfec9 -fefa0034 -ff1b0021 -ff990087 -02edff3b -fe3f0131 -ff59ffc4 -012bff22 -ff2a0069 -0314ff4c -fbff00df -00b7ff47 -0131005b -ff53fffb -// 0x00000530 -0053ff4e -ffac00cb -fedafef1 -022b0099 -ff0afffa -009efd4f -fead0474 -0279fe69 -fb99fffc -0412ffb1 -fd80fe6d -020101f1 -fd72fd98 -02e4018d -feb1ffc2 -ffeb0035 -// 0x00000540 -000affba -fef00074 -0134ffa8 -ffae001f -ffd500cf -ff2efd43 -01be0271 -ffbd01ad -fcd0fd2e -0512010e -fe2cfe02 -ff6202f3 -ffadff15 -00ecfde3 -ff0601c1 -0097fff1 -// 0x00000550 -0009ff70 -00d100c6 -fcc4ff70 -048bff5a -fc990022 -0302fe4b -feb80306 -0051ff2c -feb90138 -0111fd00 -0078ffca -00f5014c -fdbdffd2 -01840077 -ffe4fee4 -fff700c6 -// 0x00000560 -0016fff9 -ff50005a -01a5ff53 -fe4c021b -003cfcb0 -005fffda -0163048c -fccffe25 -00a6fdc3 -04a401d6 -fb83ff4b -00b6004b -009800d0 -ffddfe3a -001500fa -ffcfffd1 -// 0x00000570 -0026ff5f -006d0068 -fec30006 -012a00df -ff49fdc4 -ff6e0100 -0242ffec -fe0aff72 -00aafd8d -0441051a -fae5fde6 -025200af -fe1bfe08 -025c011e -fe82ffa8 -00420058 -// 0x00000580 -0005fffe -006f010f -ffc4feec -fffeffe6 -ff3dff63 -0079031c -015cfbb7 -ffb9022d -fb8101d4 -0499fd2b -00ce0076 -fef001b6 -fdfdfddf -0093001a -015201b3 -ff45fee7 -// 0x00000590 -00a6ffba -ffb300ce -fe9c000d -0279fe68 -fe67019a -ff10fd8b -017f024a -0121fed6 -fcd60026 -03ab0218 -fcaafcc7 -03a10234 -fc39ff8e -0162ffa3 -ffa700da -ff5dff2a -// 0x000005a0 -ffdd0038 -00280035 -0058ff3b -ff64013c -004cfe0b -fea1032d -02c3fbcc -ff0b028b -ff0d02f8 -ff90fa21 -023601c7 -007e010a -fbde0009 -0227fee5 -0053014e -ffdbff67 -// 0x000005b0 -00bd0060 -ff05004f -0041004b -004ffe10 -ffb6023d -fe5cfdd2 -01950222 -0140fed0 -fce900f6 -0235fe9b -ffb9feef -ff1b0062 -009c020d -006afe58 -fed9019c -ffb6fe42 -// 0x000005c0 -ffef000e -006e003b -0090fec7 -fd9b0048 -02620156 -fd95ff76 -00e7fe16 -023501df -fd0d0100 -fea8ff8b -0468fddb -fe5f036c -ff4efd6c -00790160 -006dff60 -ffb5ffe9 -// 0x000005d0 -00390013 -00b10010 -fd4a0112 -01effd5a -018201d5 -fc93ffa2 -00f70022 -00890084 -00150013 -0225fd80 -fc6c01ee -02150060 -ff50ff95 -ffa30066 -00830016 -ff57fff2 -// 0x000005e0 -00380043 -ff6c005c -01bcfeea -fde2001f -010000fc -feba018a -01d9fb42 -002f0220 -fde803c5 -0046fbb4 -010000ba -01ec01cb -fcd0fddc -016c00de -fff30022 -ffb3ff96 -// 0x000005f0 -00a1ffaf -fff4006c -fee8003a -ff5cfe50 -034e006e -fc0bff97 -0342025c -ff7efe11 -fed7015d -00cafbde -007a03aa -fef6feae -00820182 -ff57fe83 -0124ffec -fed00065 -// 0x00000600 -0023ffed -ffff011b -005efe65 -ff8c0006 -fff0ffda -ff100499 -0298f993 -ff4a03ba -fdf3ff1f -014ffea9 -019e028d -ff1aff0c -fda6fe16 -02ea012f -fea8007f -ffe0ffa8 -// 0x00000610 -0038001e -009affa5 -fdb8008d -017fff2b -0058ff07 -fec3fef0 -02790297 -ffca0220 -fc06fa18 -07b60213 -f9aa01bd -0473fd79 -fbee02ff -02b1fe64 -fef90043 -ffd8ffb0 -// 0x00000620 -ffa3fff3 -00cd0105 -ff0ffe57 -fee50111 -0276ff5b -fe840131 -ff0dfeb0 -03570103 -fabdfffd -02f100e7 -0359fde1 -fc4d023d -0062fe55 -0012ff4f -008301f0 -fff3fecb -// 0x00000630 -008d004c -0011ffad -feb20112 -0102fe58 -ffc8004f -0227ff78 -fdd403d8 -01ccfe11 -fb97ff30 -0609fecd -fb0c0268 -02c8ff56 -fd38ffad -02a7ffbe -ff2a007e -ff92ffa9 -// 0x00000640 -0027ffe4 -ff680075 -008bff50 -00930179 -fdb5fea8 -02d301b0 -ff9afc37 -fee7045c -010bfe80 -fdf0ff5f -02abff4e -00dd008f -fba500e0 -020dfefc -00d40087 -ff41ffd4 -// 0x00000650 -0035ff55 -ffbb00c3 -fef5feec -014000f1 -ff6afd66 -02e502d0 -fd82fec8 -00a800d3 -ff0500a1 -022ffd49 -fdd9024e -01e200d1 -fdc8fe00 -01b10054 -fec4ff52 -00d6012b -// 0x00000660 -00230072 -ffa5fffa -0200ff17 -fd7301b2 -ff03fdcd -0385017d -ff8bff81 -fdab0072 -ffaffdcc -01370268 -ff84ff9f -00bd01a4 -ff8ffdc5 -00230091 -00a500e1 -ff89fee0 -// 0x00000670 -00a1ffad -ffd40080 -fe7b008f -0277fe43 -fed70182 -ffcdffc3 -febb0072 -01d200e5 -fc5ffced -0416020c -fed3fdad -0071017d -ff89011c -ffd5fe59 -00770192 -fefaff6b -// 0x00000680 -fffc0056 -ff36004f -0257fef7 -fe0d008e -ff6d00b6 -ff8cffdd -0220fcd0 -003603e5 -fc4401de -02b0fbff -016b0071 -ff6f01be -fe93fde2 -002200ed -009600f4 -0002febf -// 0x00000690 -0018ff91 -00c300a7 -fe230115 -0238fc2d -fe4003a6 -0077fe46 -000b0322 -00e7fd24 -faf40143 -058dfd9f -fe0dff4f -01c40211 -fe30ff72 -0075005c -00b9004e -fef1fff6 -// 0x000006a0 -ffa7006b -00bf001d -fedcfee5 -0083018a -ffedfe20 -fee204f6 -0165f9e7 -005601aa -ffd10317 -fef5fe5b -ffb6fec9 -02e300f0 -fe9bff4a -ff5600c2 -0019ff97 -0048ff94 -// 0x000006b0 -006bffee -0063ff69 -fe1c0269 -02c7fb9c -fdc0034c -00b4fe4b -0066010b -00f90130 -fdb5fd0c -0297fff3 -007a006d -fe51ffc8 -00b40346 -001efcc9 -00280123 -ff7bfffc -// 0x000006c0 -004b0039 -00280058 -fee1ff0d -020d005e -ff4bfec0 -fe4804a7 -013ff95c -ff930344 -006b01ff -ff9efde6 -00950035 -011f0040 -fcf7fec8 -01ea011b -0023008a -ff79ff36 -// 0x000006d0 -0093ff78 -fff000a3 -ffa6fff3 -ff53fe9a -02c0007d -fd5600b5 -0198018a -ff2a000a -fed5ff9a -0084ff3d -ff5efed7 -002d0006 -00e80215 -fedafe5f -01bc00e8 -fe1a0012 -// 0x000006e0 -fff20019 -000a0015 -ffdbffcf -007d0164 -fe66fc74 -020a04dc -ff67fb95 -002e034a -fd9affdd -02acfd3f -00ef0279 -002f003e -fbd6fd06 -039801f4 -feefffd3 -ffe6ffd0 -// 0x000006f0 -001a009d -ff62ff1f -01200165 -fe6ffea5 -01d5ff37 -fe6a01d3 -01d8fed9 -013c02cd -fce4fcd9 -014400dd -fddcff35 -0239fe81 -001d022f -ffd0fea1 -ff840091 -0084ff2d -// 0x00000700 -ffa7ff88 -003400e3 -00810034 -fe66ff66 -0158fcc5 -ff16071e -ffdffa8b -01900282 -ff4d0056 -fe9afe23 -03430088 -ff1000fa -fdccfdc1 -019401fc -ff75feed -00520066 -// 0x00000710 -005c0004 -000e0053 -fdc40037 -0368ff16 -ff2d00a5 -fe6dfc7c -02d804db -ffa2fde0 -fdc2011e -04ccff23 -fc2afea5 -0442024a -fa4900dd -0225fe0a -003e006d -ffc0ffdc -// 0x00000720 -ff95ffe1 -008d005a -0043ff57 -fe8901e8 -00ecfc46 -ff7e029d -0218ff72 -fce90235 -00adfb9b -01150416 -010dff19 -ff33fd36 -fed2024e -0058001b -0040ff0e -003b0085 -// 0x00000730 -ffd5ffa8 -008a005f -fe54ff5b -018f0040 -007cffbb -ffd2fed8 -004a0315 -fe6b00af -fff1ff56 -0168fd75 -fcf400cb -05cbff86 -fa2a0297 -02b8fd1c -ff42018d -ffffffbb -// 0x00000740 -fff1ffec -ff7300b0 -01e8ff64 -fdd50126 -ffb4fe43 -01a6003f -0150016b -fbddfff0 -014ffe78 -030d01fe -fd46ffd4 -0255fdaa -fe800159 -ff0effd3 -01260015 -ffadffc8 -// 0x00000750 -003effa5 -0035fff1 -ff7c00ea -00c4fee3 -fffaffed -fea4fdbf -01c105c6 -00a1fc06 -faf201b3 -05d7fc2d -fe5202e0 -0180fe43 -fec6017f -ff28ffe7 -0181fffc -ff13ffe0 -// 0x00000760 -ffc0ffff -002e00b6 -001cfeb7 -fea8014c -0052fee7 -015700e3 -005900a9 -fe66fed8 -ffdcff1b -011a030e -ff5afd3f -0182013c -ffb60027 -fe05fedd -01850049 -ffd4000c -// 0x00000770 -0088ffc2 -0098ffd3 -fd7601aa -02bbfd44 -febc001b -00c00048 -00990039 -00ad0074 -fcb2022e -03bafaaf -fdec031c -01b7ff26 -fdce0001 -010a0016 -0079ffc5 -ff2d0042 -// 0x00000780 -ffb0ffc6 -0097011d -009afe82 -fe010203 -00e5fd4a -0184022e -ff91ff1c -00460087 -fbe2fe72 -03fb009f -01760112 -fd19ff79 -fee5fe82 -01da0186 -ffcb0064 -ffe8ff75 -// 0x00000790 -0062ffa5 -002500b7 -fe5d009f -010ffd9c -013601b1 -fbb8fc62 -05e604af -fcecfdfa -00280109 -0171fdbf -0045001f -fec900ea -ffc801d9 -fff2fddc -0068006b -ff74fffc -// 0x000007a0 -ff95ffe2 -00b1fff2 -ff64006a -ff9afebe -01d400b1 -fc8900a5 -046dff69 -fd25fdeb -004f051c -fedbfa5c -030e0292 -fd920048 -ffc40029 -00a3ff99 -006d004b -002ffffb -// 0x000007b0 -00610066 -ff5900e9 -002bff1f -ffaa0030 -0144ff6e -fc020098 -04060002 -0032015b -fdfffeea -0183feed -fda500a9 -0344002a -fd3400ba -015aff4a -ff1a0156 -0000fe8b -// 0x000007c0 -ffe0ffb5 -ffeb008c -004effb6 -ffe8ff5e -ff090058 -000b0020 -0314001e -fa80feee -0398043f -feedfb66 -01ba0274 -ffb2fe7c -ff7b0134 -fe81ff4e -0230ff78 -ff3a0098 -// 0x000007d0 -0018ff95 -ffdb00e0 -fe62fe43 -03f80169 -fe91fdf0 -ff3903f3 -fec5fe71 -026b001d -fd98ffbf -0299fe4a -ff36fff3 -ff20023f -fefffd40 -024f014b -ff83ff15 -000100f3 -// 0x000007e0 -0050ffef -000efff1 -00060141 -ffa2fe18 -020500c3 -fb86fe6f -039a01db -ff2fffd4 -fffa02e1 -fe24f9cb -035c02db -fece01e8 -feedfe69 -0004ff91 -01500095 -ff1dffe8 -// 0x000007f0 -00820045 -ffd0ff97 -ff25ffc4 -00a6ffc0 -ffb0ff0e -ff8a022b -0276ffeb -fed6fe67 -fe760175 -00aaff6d -006dffe8 -ff440068 -0060ffd4 -ff180105 -0070fedd -ff34001d diff --git a/9_Firmware/9_2_FPGA/tb/tb_matched_filter_processing_chain.v b/9_Firmware/9_2_FPGA/tb/tb_matched_filter_processing_chain.v index 61ea8d9..08d6a56 100644 --- a/9_Firmware/9_2_FPGA/tb/tb_matched_filter_processing_chain.v +++ b/9_Firmware/9_2_FPGA/tb/tb_matched_filter_processing_chain.v @@ -18,10 +18,8 @@ module tb_matched_filter_processing_chain; reg [15:0] adc_data_q; reg adc_valid; reg [5:0] chirp_counter; - reg [15:0] long_chirp_real; - reg [15:0] long_chirp_imag; - reg [15:0] short_chirp_real; - reg [15:0] short_chirp_imag; + reg [15:0] ref_chirp_real; + reg [15:0] ref_chirp_imag; wire signed [15:0] range_profile_i; wire signed [15:0] range_profile_q; wire range_profile_valid; @@ -83,10 +81,8 @@ module tb_matched_filter_processing_chain; .adc_data_q (adc_data_q), .adc_valid (adc_valid), .chirp_counter (chirp_counter), - .long_chirp_real (long_chirp_real), - .long_chirp_imag (long_chirp_imag), - .short_chirp_real (short_chirp_real), - .short_chirp_imag (short_chirp_imag), + .ref_chirp_real (ref_chirp_real), + .ref_chirp_imag (ref_chirp_imag), .range_profile_i (range_profile_i), .range_profile_q (range_profile_q), .range_profile_valid (range_profile_valid), @@ -133,10 +129,8 @@ module tb_matched_filter_processing_chain; adc_data_i = 16'd0; adc_data_q = 16'd0; chirp_counter = 6'd0; - long_chirp_real = 16'd0; - long_chirp_imag = 16'd0; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'd0; + ref_chirp_imag = 16'd0; cap_enable = 0; cap_count = 0; cap_max_abs = 0; @@ -168,10 +162,8 @@ module tb_matched_filter_processing_chain; angle = 6.28318530718 * tone_bin * k / (1.0 * FFT_SIZE); adc_data_i = $rtoi(8000.0 * $cos(angle)); adc_data_q = $rtoi(8000.0 * $sin(angle)); - long_chirp_real = $rtoi(8000.0 * $cos(angle)); - long_chirp_imag = $rtoi(8000.0 * $sin(angle)); - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = $rtoi(8000.0 * $cos(angle)); + ref_chirp_imag = $rtoi(8000.0 * $sin(angle)); adc_valid = 1'b1; @(posedge clk); #1; @@ -187,10 +179,8 @@ module tb_matched_filter_processing_chain; for (k = 0; k < FFT_SIZE; k = k + 1) begin adc_data_i = 16'sh1000; adc_data_q = 16'sh0000; - long_chirp_real = 16'sh1000; - long_chirp_imag = 16'sh0000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh1000; + ref_chirp_imag = 16'sh0000; adc_valid = 1'b1; @(posedge clk); #1; @@ -233,10 +223,8 @@ module tb_matched_filter_processing_chain; for (k = 0; k < FFT_SIZE; k = k + 1) begin adc_data_i = gold_sig_i[k]; adc_data_q = gold_sig_q[k]; - long_chirp_real = gold_ref_i[k]; - long_chirp_imag = gold_ref_q[k]; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = gold_ref_i[k]; + ref_chirp_imag = gold_ref_q[k]; adc_valid = 1'b1; @(posedge clk); #1; @@ -374,10 +362,8 @@ module tb_matched_filter_processing_chain; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'd0; adc_data_q = 16'd0; - long_chirp_real = 16'd0; - long_chirp_imag = 16'd0; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'd0; + ref_chirp_imag = 16'd0; adc_valid = 1'b1; @(posedge clk); #1; end @@ -449,10 +435,8 @@ module tb_matched_filter_processing_chain; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = $rtoi(8000.0 * $cos(6.28318530718 * 5 * i / 1024.0)); adc_data_q = $rtoi(8000.0 * $sin(6.28318530718 * 5 * i / 1024.0)); - long_chirp_real = $rtoi(8000.0 * $cos(6.28318530718 * 10 * i / 1024.0)); - long_chirp_imag = $rtoi(8000.0 * $sin(6.28318530718 * 10 * i / 1024.0)); - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = $rtoi(8000.0 * $cos(6.28318530718 * 10 * i / 1024.0)); + ref_chirp_imag = $rtoi(8000.0 * $sin(6.28318530718 * 10 * i / 1024.0)); adc_valid = 1'b1; @(posedge clk); #1; end @@ -568,10 +552,8 @@ module tb_matched_filter_processing_chain; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'sh7FFF; adc_data_q = 16'sh7FFF; - long_chirp_real = 16'sh7FFF; - long_chirp_imag = 16'sh7FFF; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh7FFF; + ref_chirp_imag = 16'sh7FFF; adc_valid = 1'b1; @(posedge clk); #1; end @@ -589,10 +571,8 @@ module tb_matched_filter_processing_chain; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'sh8000; adc_data_q = 16'sh8000; - long_chirp_real = 16'sh8000; - long_chirp_imag = 16'sh8000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh8000; + ref_chirp_imag = 16'sh8000; adc_valid = 1'b1; @(posedge clk); #1; end @@ -611,16 +591,14 @@ module tb_matched_filter_processing_chain; if (i % 2 == 0) begin adc_data_i = 16'sh7FFF; adc_data_q = 16'sh7FFF; - long_chirp_real = 16'sh7FFF; - long_chirp_imag = 16'sh7FFF; + ref_chirp_real = 16'sh7FFF; + ref_chirp_imag = 16'sh7FFF; end else begin adc_data_i = 16'sh8000; adc_data_q = 16'sh8000; - long_chirp_real = 16'sh8000; - long_chirp_imag = 16'sh8000; + ref_chirp_real = 16'sh8000; + ref_chirp_imag = 16'sh8000; end - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; adc_valid = 1'b1; @(posedge clk); #1; end @@ -641,10 +619,8 @@ module tb_matched_filter_processing_chain; for (i = 0; i < 512; i = i + 1) begin adc_data_i = 16'sh1000; adc_data_q = 16'sh0000; - long_chirp_real = 16'sh1000; - long_chirp_imag = 16'sh0000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh1000; + ref_chirp_imag = 16'sh0000; adc_valid = 1'b1; @(posedge clk); #1; end @@ -683,10 +659,8 @@ module tb_matched_filter_processing_chain; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'sh1000; adc_data_q = 16'sh0000; - long_chirp_real = 16'sh1000; - long_chirp_imag = 16'sh0000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh1000; + ref_chirp_imag = 16'sh0000; adc_valid = 1'b1; @(posedge clk); #1; diff --git a/9_Firmware/9_2_FPGA/tb/tb_mf_chain_synth.v b/9_Firmware/9_2_FPGA/tb/tb_mf_chain_synth.v index 890cb94..b94eb55 100644 --- a/9_Firmware/9_2_FPGA/tb/tb_mf_chain_synth.v +++ b/9_Firmware/9_2_FPGA/tb/tb_mf_chain_synth.v @@ -28,10 +28,8 @@ module tb_mf_chain_synth; reg [15:0] adc_data_q; reg adc_valid; reg [5:0] chirp_counter; - reg [15:0] long_chirp_real; - reg [15:0] long_chirp_imag; - reg [15:0] short_chirp_real; - reg [15:0] short_chirp_imag; + reg [15:0] ref_chirp_real; + reg [15:0] ref_chirp_imag; wire signed [15:0] range_profile_i; wire signed [15:0] range_profile_q; wire range_profile_valid; @@ -78,10 +76,8 @@ module tb_mf_chain_synth; .adc_data_q (adc_data_q), .adc_valid (adc_valid), .chirp_counter (chirp_counter), - .long_chirp_real (long_chirp_real), - .long_chirp_imag (long_chirp_imag), - .short_chirp_real (short_chirp_real), - .short_chirp_imag (short_chirp_imag), + .ref_chirp_real (ref_chirp_real), + .ref_chirp_imag (ref_chirp_imag), .range_profile_i (range_profile_i), .range_profile_q (range_profile_q), .range_profile_valid (range_profile_valid), @@ -130,10 +126,8 @@ module tb_mf_chain_synth; adc_data_i = 16'd0; adc_data_q = 16'd0; chirp_counter = 6'd0; - long_chirp_real = 16'd0; - long_chirp_imag = 16'd0; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'd0; + ref_chirp_imag = 16'd0; cap_enable = 0; cap_count = 0; cap_max_abs = 0; @@ -177,10 +171,8 @@ module tb_mf_chain_synth; for (k = 0; k < FFT_SIZE; k = k + 1) begin adc_data_i = 16'sh1000; // +4096 adc_data_q = 16'sh0000; - long_chirp_real = 16'sh1000; - long_chirp_imag = 16'sh0000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh1000; + ref_chirp_imag = 16'sh0000; adc_valid = 1'b1; @(posedge clk); #1; @@ -199,10 +191,8 @@ module tb_mf_chain_synth; angle = 6.28318530718 * tone_bin * k / (1.0 * FFT_SIZE); adc_data_i = $rtoi(8000.0 * $cos(angle)); adc_data_q = $rtoi(8000.0 * $sin(angle)); - long_chirp_real = $rtoi(8000.0 * $cos(angle)); - long_chirp_imag = $rtoi(8000.0 * $sin(angle)); - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = $rtoi(8000.0 * $cos(angle)); + ref_chirp_imag = $rtoi(8000.0 * $sin(angle)); adc_valid = 1'b1; @(posedge clk); #1; @@ -219,16 +209,14 @@ module tb_mf_chain_synth; if (k == 0) begin adc_data_i = 16'sh4000; // 0.5 in Q15 adc_data_q = 16'sh0000; - long_chirp_real = 16'sh4000; - long_chirp_imag = 16'sh0000; + ref_chirp_real = 16'sh4000; + ref_chirp_imag = 16'sh0000; end else begin adc_data_i = 16'sh0000; adc_data_q = 16'sh0000; - long_chirp_real = 16'sh0000; - long_chirp_imag = 16'sh0000; + ref_chirp_real = 16'sh0000; + ref_chirp_imag = 16'sh0000; end - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; adc_valid = 1'b1; @(posedge clk); #1; @@ -309,10 +297,8 @@ module tb_mf_chain_synth; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'd0; adc_data_q = 16'd0; - long_chirp_real = 16'd0; - long_chirp_imag = 16'd0; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'd0; + ref_chirp_imag = 16'd0; adc_valid = 1'b1; @(posedge clk); #1; end @@ -379,10 +365,8 @@ module tb_mf_chain_synth; for (i = 0; i < 512; i = i + 1) begin adc_data_i = 16'sh1000; adc_data_q = 16'sh0000; - long_chirp_real = 16'sh1000; - long_chirp_imag = 16'sh0000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh1000; + ref_chirp_imag = 16'sh0000; adc_valid = 1'b1; @(posedge clk); #1; end @@ -439,10 +423,8 @@ module tb_mf_chain_synth; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = $rtoi(8000.0 * $cos(6.28318530718 * 5 * i / 1024.0)); adc_data_q = $rtoi(8000.0 * $sin(6.28318530718 * 5 * i / 1024.0)); - long_chirp_real = $rtoi(8000.0 * $cos(6.28318530718 * 10 * i / 1024.0)); - long_chirp_imag = $rtoi(8000.0 * $sin(6.28318530718 * 10 * i / 1024.0)); - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = $rtoi(8000.0 * $cos(6.28318530718 * 10 * i / 1024.0)); + ref_chirp_imag = $rtoi(8000.0 * $sin(6.28318530718 * 10 * i / 1024.0)); adc_valid = 1'b1; @(posedge clk); #1; end @@ -469,10 +451,8 @@ module tb_mf_chain_synth; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'sh7FFF; adc_data_q = 16'sh7FFF; - long_chirp_real = 16'sh7FFF; - long_chirp_imag = 16'sh7FFF; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh7FFF; + ref_chirp_imag = 16'sh7FFF; adc_valid = 1'b1; @(posedge clk); #1; end @@ -495,10 +475,8 @@ module tb_mf_chain_synth; for (i = 0; i < FFT_SIZE; i = i + 1) begin adc_data_i = 16'sh1000; adc_data_q = 16'sh0000; - long_chirp_real = 16'sh1000; - long_chirp_imag = 16'sh0000; - short_chirp_real = 16'd0; - short_chirp_imag = 16'd0; + ref_chirp_real = 16'sh1000; + ref_chirp_imag = 16'sh0000; adc_valid = 1'b1; @(posedge clk); #1; diff --git a/9_Firmware/9_2_FPGA/tb/tb_mf_cosim.v b/9_Firmware/9_2_FPGA/tb/tb_mf_cosim.v index a313a8a..25fe325 100644 --- a/9_Firmware/9_2_FPGA/tb/tb_mf_cosim.v +++ b/9_Firmware/9_2_FPGA/tb/tb_mf_cosim.v @@ -88,10 +88,8 @@ reg [15:0] adc_data_i; reg [15:0] adc_data_q; reg adc_valid; reg [5:0] chirp_counter; -reg [15:0] long_chirp_real; -reg [15:0] long_chirp_imag; -reg [15:0] short_chirp_real; -reg [15:0] short_chirp_imag; +reg [15:0] ref_chirp_real; +reg [15:0] ref_chirp_imag; wire signed [15:0] range_profile_i; wire signed [15:0] range_profile_q; @@ -108,10 +106,8 @@ matched_filter_processing_chain dut ( .adc_data_q(adc_data_q), .adc_valid(adc_valid), .chirp_counter(chirp_counter), - .long_chirp_real(long_chirp_real), - .long_chirp_imag(long_chirp_imag), - .short_chirp_real(short_chirp_real), - .short_chirp_imag(short_chirp_imag), + .ref_chirp_real(ref_chirp_real), + .ref_chirp_imag(ref_chirp_imag), .range_profile_i(range_profile_i), .range_profile_q(range_profile_q), .range_profile_valid(range_profile_valid), @@ -157,10 +153,8 @@ task apply_reset; adc_data_q <= 16'd0; adc_valid <= 1'b0; chirp_counter <= 6'd0; - long_chirp_real <= 16'd0; - long_chirp_imag <= 16'd0; - short_chirp_real <= 16'd0; - short_chirp_imag <= 16'd0; + ref_chirp_real <= 16'd0; + ref_chirp_imag <= 16'd0; repeat(4) @(posedge clk); reset_n <= 1'b1; @(posedge clk); @@ -201,18 +195,16 @@ initial begin @(posedge clk); adc_data_i <= sig_mem_i[i]; adc_data_q <= sig_mem_q[i]; - long_chirp_real <= ref_mem_i[i]; - long_chirp_imag <= ref_mem_q[i]; - short_chirp_real <= 16'd0; - short_chirp_imag <= 16'd0; + ref_chirp_real <= ref_mem_i[i]; + ref_chirp_imag <= ref_mem_q[i]; adc_valid <= 1'b1; end @(posedge clk); adc_valid <= 1'b0; adc_data_i <= 16'd0; adc_data_q <= 16'd0; - long_chirp_real <= 16'd0; - long_chirp_imag <= 16'd0; + ref_chirp_real <= 16'd0; + ref_chirp_imag <= 16'd0; $display("All samples fed. Waiting for processing..."); diff --git a/9_Firmware/9_2_FPGA/tb/tb_multiseg_cosim.v b/9_Firmware/9_2_FPGA/tb/tb_multiseg_cosim.v index 4dcad33..8f18c28 100644 --- a/9_Firmware/9_2_FPGA/tb/tb_multiseg_cosim.v +++ b/9_Firmware/9_2_FPGA/tb/tb_multiseg_cosim.v @@ -56,10 +56,8 @@ reg [5:0] chirp_counter; reg mc_new_chirp; reg mc_new_elevation; reg mc_new_azimuth; -reg [15:0] long_chirp_real; -reg [15:0] long_chirp_imag; -reg [15:0] short_chirp_real; -reg [15:0] short_chirp_imag; +reg [15:0] ref_chirp_real; +reg [15:0] ref_chirp_imag; reg mem_ready; wire signed [15:0] pc_i_w; @@ -84,10 +82,8 @@ matched_filter_multi_segment dut ( .mc_new_chirp(mc_new_chirp), .mc_new_elevation(mc_new_elevation), .mc_new_azimuth(mc_new_azimuth), - .long_chirp_real(long_chirp_real), - .long_chirp_imag(long_chirp_imag), - .short_chirp_real(short_chirp_real), - .short_chirp_imag(short_chirp_imag), + .ref_chirp_real(ref_chirp_real), + .ref_chirp_imag(ref_chirp_imag), .segment_request(segment_request), .sample_addr_out(sample_addr_out), .mem_request(mem_request), @@ -123,11 +119,11 @@ end always @(posedge clk) begin if (mem_request) begin if (use_long_chirp) begin - long_chirp_real <= ref_mem_i[{segment_request, sample_addr_out}]; - long_chirp_imag <= ref_mem_q[{segment_request, sample_addr_out}]; + ref_chirp_real <= ref_mem_i[{segment_request, sample_addr_out}]; + ref_chirp_imag <= ref_mem_q[{segment_request, sample_addr_out}]; end else begin - short_chirp_real <= ref_mem_i[sample_addr_out]; - short_chirp_imag <= ref_mem_q[sample_addr_out]; + ref_chirp_real <= ref_mem_i[sample_addr_out]; + ref_chirp_imag <= ref_mem_q[sample_addr_out]; end mem_ready <= 1'b1; end else begin @@ -176,10 +172,8 @@ task apply_reset; mc_new_chirp <= 1'b0; mc_new_elevation <= 1'b0; mc_new_azimuth <= 1'b0; - long_chirp_real <= 16'd0; - long_chirp_imag <= 16'd0; - short_chirp_real <= 16'd0; - short_chirp_imag <= 16'd0; + ref_chirp_real <= 16'd0; + ref_chirp_imag <= 16'd0; mem_ready <= 1'b0; repeat(10) @(posedge clk); reset_n <= 1'b1; diff --git a/9_Firmware/9_3_GUI/GUI_PyQt_Map.py b/9_Firmware/9_3_GUI/GUI_PyQt_Map.py index 67b4555..1a6bd8f 100644 --- a/9_Firmware/9_3_GUI/GUI_PyQt_Map.py +++ b/9_Firmware/9_3_GUI/GUI_PyQt_Map.py @@ -108,7 +108,7 @@ class GPSData: @dataclass class RadarSettings: """Radar system configuration""" - system_frequency: float = 10e9 # Hz + system_frequency: float = 10.5e9 # Hz (PLFM TX LO) chirp_duration_1: float = 30e-6 # Long chirp duration (s) chirp_duration_2: float = 0.5e-6 # Short chirp duration (s) chirps_per_position: int = 32 @@ -116,8 +116,8 @@ class RadarSettings: freq_max: float = 30e6 # Hz prf1: float = 1000 # PRF 1 (Hz) prf2: float = 2000 # PRF 2 (Hz) - max_distance: float = 50000 # Max detection range (m) - coverage_radius: float = 50000 # Map coverage radius (m) + max_distance: float = 1536 # Max detection range (m) -- 64 bins x 24 m + coverage_radius: float = 1536 # Map coverage radius (m) class TileServer(Enum): @@ -198,7 +198,7 @@ class RadarMapWidget(QWidget): pitch=0.0 ) self._targets: list[RadarTarget] = [] - self._coverage_radius = 50000 # meters + self._coverage_radius = 1536 # meters (64 bins x 24 m, 3 km mode) self._tile_server = TileServer.OPENSTREETMAP self._show_coverage = True self._show_trails = False @@ -1088,7 +1088,7 @@ class TargetSimulator(QObject): new_range = target.range - target.velocity * 0.5 # 0.5 second update # Check if target is still in range - if new_range < 500 or new_range > 50000: + if new_range < 50 or new_range > 1536: # Remove this target and add a new one continue diff --git a/9_Firmware/9_3_GUI/GUI_V5.py b/9_Firmware/9_3_GUI/GUI_V5.py index 82505a6..4a1fa0f 100644 --- a/9_Firmware/9_3_GUI/GUI_V5.py +++ b/9_Firmware/9_3_GUI/GUI_V5.py @@ -81,7 +81,7 @@ class RadarTarget: @dataclass class RadarSettings: - system_frequency: float = 10e9 + system_frequency: float = 10.5e9 chirp_duration_1: float = 30e-6 # Long chirp duration chirp_duration_2: float = 0.5e-6 # Short chirp duration chirps_per_position: int = 32 @@ -89,8 +89,8 @@ class RadarSettings: freq_max: float = 30e6 prf1: float = 1000 prf2: float = 2000 - max_distance: float = 50000 - map_size: float = 50000 # Map size in meters + max_distance: float = 1536 + map_size: float = 1536 # Map size in meters (64 bins x 24 m) @dataclass @@ -1196,8 +1196,8 @@ class RadarGUI: ("Frequency Max (Hz):", "freq_max", 30e6), ("PRF1 (Hz):", "prf1", 1000), ("PRF2 (Hz):", "prf2", 2000), - ("Max Distance (m):", "max_distance", 50000), - ("Map Size (m):", "map_size", 50000), + ("Max Distance (m):", "max_distance", 1536), + ("Map Size (m):", "map_size", 1536), ("Google Maps API Key:", "google_maps_api_key", "YOUR_GOOGLE_MAPS_API_KEY"), ] diff --git a/9_Firmware/9_3_GUI/GUI_V5_Demo.py b/9_Firmware/9_3_GUI/GUI_V5_Demo.py index e9f785c..87df76a 100644 --- a/9_Firmware/9_3_GUI/GUI_V5_Demo.py +++ b/9_Firmware/9_3_GUI/GUI_V5_Demo.py @@ -77,7 +77,7 @@ class RadarTarget: @dataclass class RadarSettings: - system_frequency: float = 10e9 + system_frequency: float = 10.5e9 chirp_duration_1: float = 30e-6 # Long chirp duration chirp_duration_2: float = 0.5e-6 # Short chirp duration chirps_per_position: int = 32 @@ -85,8 +85,8 @@ class RadarSettings: freq_max: float = 30e6 prf1: float = 1000 prf2: float = 2000 - max_distance: float = 50000 - map_size: float = 50000 # Map size in meters + max_distance: float = 1536 + map_size: float = 1536 # Map size in meters (64 bins x 24 m) @dataclass @@ -1254,8 +1254,8 @@ class RadarGUI: ("Frequency Max (Hz):", "freq_max", 30e6), ("PRF1 (Hz):", "prf1", 1000), ("PRF2 (Hz):", "prf2", 2000), - ("Max Distance (m):", "max_distance", 50000), - ("Map Size (m):", "map_size", 50000), + ("Max Distance (m):", "max_distance", 1536), + ("Map Size (m):", "map_size", 1536), ] self.settings_vars = {} diff --git a/9_Firmware/9_3_GUI/GUI_V6.py b/9_Firmware/9_3_GUI/GUI_V6.py index 5688288..3ee36c1 100644 --- a/9_Firmware/9_3_GUI/GUI_V6.py +++ b/9_Firmware/9_3_GUI/GUI_V6.py @@ -64,7 +64,7 @@ class RadarTarget: @dataclass class RadarSettings: - system_frequency: float = 10e9 + system_frequency: float = 10.5e9 chirp_duration_1: float = 30e-6 # Long chirp duration chirp_duration_2: float = 0.5e-6 # Short chirp duration chirps_per_position: int = 32 @@ -72,8 +72,8 @@ class RadarSettings: freq_max: float = 30e6 prf1: float = 1000 prf2: float = 2000 - max_distance: float = 50000 - map_size: float = 50000 # Map size in meters + max_distance: float = 1536 + map_size: float = 1536 # Map size in meters (64 bins x 24 m) @dataclass class GPSData: @@ -1653,8 +1653,8 @@ class RadarGUI: ('Frequency Max (Hz):', 'freq_max', 30e6), ('PRF1 (Hz):', 'prf1', 1000), ('PRF2 (Hz):', 'prf2', 2000), - ('Max Distance (m):', 'max_distance', 50000), - ('Map Size (m):', 'map_size', 50000), + ('Max Distance (m):', 'max_distance', 1536), + ('Map Size (m):', 'map_size', 1536), ('Google Maps API Key:', 'google_maps_api_key', 'YOUR_GOOGLE_MAPS_API_KEY') ] diff --git a/9_Firmware/9_3_GUI/GUI_V65_Tk.py b/9_Firmware/9_3_GUI/GUI_V65_Tk.py index 6ac8007..48fb23f 100644 --- a/9_Firmware/9_3_GUI/GUI_V65_Tk.py +++ b/9_Firmware/9_3_GUI/GUI_V65_Tk.py @@ -98,9 +98,10 @@ class DemoTarget: __slots__ = ("azimuth", "classification", "id", "range_m", "snr", "velocity") - # Physical range grid: 64 bins x ~4.8 m/bin = ~307 m max - _RANGE_PER_BIN: float = (3e8 / (2 * 500e6)) * 16 # ~4.8 m - _MAX_RANGE: float = _RANGE_PER_BIN * NUM_RANGE_BINS # ~307 m + # Physical range grid: matched-filter receiver, 100 MSPS post-DDC, 16:1 decimation + # range_per_bin = c / (2 * 100e6) * 16 = 24.0 m + _RANGE_PER_BIN: float = (3e8 / (2 * 100e6)) * 16 # 24.0 m + _MAX_RANGE: float = _RANGE_PER_BIN * NUM_RANGE_BINS # 1536 m def __init__(self, tid: int): self.id = tid @@ -187,10 +188,10 @@ class DemoSimulator: mag = np.zeros((NUM_RANGE_BINS, NUM_DOPPLER_BINS), dtype=np.float64) det = np.zeros((NUM_RANGE_BINS, NUM_DOPPLER_BINS), dtype=np.uint8) - # Range/Doppler scaling (approximate) - range_per_bin = (3e8 / (2 * 500e6)) * 16 # ~4.8 m/bin + # Range/Doppler scaling -- matched-filter receiver, 100 MSPS, 16:1 decimation + range_per_bin = (3e8 / (2 * 100e6)) * 16 # 24.0 m/bin max_range = range_per_bin * NUM_RANGE_BINS - vel_per_bin = 1.484 # m/s per Doppler bin (from WaveformConfig) + vel_per_bin = 2.67 # m/s per Doppler bin (lam/(2*32*167us)) for t in targets: if t.range_m > max_range or t.range_m < 0: @@ -385,7 +386,9 @@ class RadarDashboard: UPDATE_INTERVAL_MS = 100 # 10 Hz display refresh # Radar parameters used for range-axis scaling. - BANDWIDTH = 500e6 # Hz — chirp bandwidth + # Matched-filter receiver: range_per_bin = c / (2 * fs_processing) * decimation + # = 3e8 / (2 * 100e6) * 16 = 24.0 m/bin + BANDWIDTH = 20e6 # Hz — chirp bandwidth (for display/info only) C = 3e8 # m/s — speed of light def __init__(self, root: tk.Tk, connection: FT2232HConnection, @@ -514,10 +517,9 @@ class RadarDashboard: self._build_log_tab(tab_log) def _build_display_tab(self, parent): - # Compute physical axis limits - range_res = self.C / (2.0 * self.BANDWIDTH) # ~0.3 m per FFT bin - # After decimation 1024→64, each range bin = 16 FFT bins - range_per_bin = range_res * 16 + # Compute physical axis limits -- matched-filter receiver + # Range per bin: c / (2 * fs_processing) * decimation_factor = 24.0 m + range_per_bin = self.C / (2.0 * 100e6) * 16 # 24.0 m max_range = range_per_bin * NUM_RANGE_BINS doppler_bin_lo = 0 diff --git a/9_Firmware/9_3_GUI/GUI_V6_Demo.py b/9_Firmware/9_3_GUI/GUI_V6_Demo.py index dd4135c..98e9222 100644 --- a/9_Firmware/9_3_GUI/GUI_V6_Demo.py +++ b/9_Firmware/9_3_GUI/GUI_V6_Demo.py @@ -45,7 +45,7 @@ class RadarSettings: range_bins: int = 1024 doppler_bins: int = 32 prf: float = 1000 - max_range: float = 5000 + max_range: float = 1536 max_velocity: float = 100 cfar_threshold: float = 13.0 @@ -577,7 +577,7 @@ class RadarDemoGUI: ('Range Bins:', 'range_bins', 1024, 256, 2048), ('Doppler Bins:', 'doppler_bins', 32, 8, 128), ('PRF (Hz):', 'prf', 1000, 100, 10000), - ('Max Range (m):', 'max_range', 5000, 100, 50000), + ('Max Range (m):', 'max_range', 1536, 100, 25000), ('Max Velocity (m/s):', 'max_vel', 100, 10, 500), ('CFAR Threshold (dB):', 'cfar', 13.0, 5.0, 30.0) ] diff --git a/9_Firmware/9_3_GUI/adi_agc_analysis.py b/9_Firmware/9_3_GUI/adi_agc_analysis.py deleted file mode 100644 index f52505a..0000000 --- a/9_Firmware/9_3_GUI/adi_agc_analysis.py +++ /dev/null @@ -1,338 +0,0 @@ -# ruff: noqa: T201 -#!/usr/bin/env python3 -""" -One-off AGC saturation analysis for ADI CN0566 raw IQ captures. - -Bit-accurate simulation of rx_gain_control.v AGC inner loop applied -to real captured IQ data. Three scenarios per dataset: - - Row 1 — AGC OFF: Fixed gain_shift=0 (pass-through). Shows raw clipping. - Row 2 — AGC ON: Auto-adjusts from gain_shift=0. Clipping clears. - Row 3 — AGC delayed: OFF for first half, ON at midpoint. - Shows the transition: clipping → AGC activates → clears. - -Key RTL details modelled exactly: - - gain_shift[3]=direction (0=amplify/left, 1=attenuate/right), [2:0]=amount - - Internal agc_gain is signed -7..+7 - - Peak is measured PRE-gain (raw input |sample|, upper 8 of 15 bits) - - Saturation is measured POST-gain (overflow from shift) - - Attack: gain -= agc_attack when any sample clips (immediate) - - Decay: gain += agc_decay when peak < target AND holdoff expired - - Hold: when peak >= target AND no saturation, hold gain, reset holdoff - -Usage: - python adi_agc_analysis.py - python adi_agc_analysis.py --data /path/to/file.npy --label "my capture" -""" - -import argparse -import sys -from pathlib import Path - -import matplotlib.pyplot as plt -import numpy as np - -from v7.agc_sim import ( - encoding_to_signed, - apply_gain_shift, - quantize_iq, - AGCConfig, - AGCState, - process_agc_frame, -) - -# --------------------------------------------------------------------------- -# FPGA AGC parameters (rx_gain_control.v reset defaults) -# --------------------------------------------------------------------------- -AGC_TARGET = 200 # host_agc_target (8-bit, default 200) -ADC_RAIL = 4095 # 12-bit ADC max absolute value - - -# --------------------------------------------------------------------------- -# Per-frame AGC simulation using v7.agc_sim (bit-accurate to RTL) -# --------------------------------------------------------------------------- - -def simulate_agc(frames: np.ndarray, agc_enabled: bool = True, - enable_at_frame: int = 0, - initial_gain_enc: int = 0x00) -> dict: - """Simulate FPGA inner-loop AGC across all frames. - - Parameters - ---------- - frames : (N, chirps, samples) complex — raw ADC captures (12-bit range) - agc_enabled : if False, gain stays fixed - enable_at_frame : frame index where AGC activates - initial_gain_enc : gain_shift[3:0] encoding when AGC enables (default 0x00 = pass-through) - """ - n_frames = frames.shape[0] - - # Output arrays - out_gain_enc = np.zeros(n_frames, dtype=int) - out_gain_signed = np.zeros(n_frames, dtype=int) - out_peak_mag = np.zeros(n_frames, dtype=int) - out_sat_count = np.zeros(n_frames, dtype=int) - out_sat_rate = np.zeros(n_frames, dtype=float) - out_rms_post = np.zeros(n_frames, dtype=float) - - # AGC state — managed by process_agc_frame() - state = AGCState( - gain=encoding_to_signed(initial_gain_enc), - holdoff_counter=0, - was_enabled=False, - ) - - for i in range(n_frames): - frame_i, frame_q = quantize_iq(frames[i]) - - agc_active = agc_enabled and (i >= enable_at_frame) - - # Build per-frame config (enable toggles at enable_at_frame) - config = AGCConfig(enabled=agc_active) - - result = process_agc_frame(frame_i, frame_q, config, state) - - # RMS of shifted signal - rms = float(np.sqrt(np.mean( - result.shifted_i.astype(np.float64)**2 - + result.shifted_q.astype(np.float64)**2))) - - total_samples = frame_i.size + frame_q.size - sat_rate = result.overflow_raw / total_samples if total_samples > 0 else 0.0 - - # Record outputs - out_gain_enc[i] = result.gain_enc - out_gain_signed[i] = result.gain_signed - out_peak_mag[i] = result.peak_mag_8bit - out_sat_count[i] = result.saturation_count - out_sat_rate[i] = sat_rate - out_rms_post[i] = rms - - return { - "gain_enc": out_gain_enc, - "gain_signed": out_gain_signed, - "peak_mag": out_peak_mag, - "sat_count": out_sat_count, - "sat_rate": out_sat_rate, - "rms_post": out_rms_post, - } - - -# --------------------------------------------------------------------------- -# Range-Doppler processing for heatmap display -# --------------------------------------------------------------------------- - -def process_frame_rd(frame: np.ndarray, gain_enc: int, - n_range: int = 64, - n_doppler: int = 32) -> np.ndarray: - """Range-Doppler magnitude for one frame with gain applied.""" - frame_i, frame_q = quantize_iq(frame) - si, sq, _ = apply_gain_shift(frame_i, frame_q, gain_enc) - - iq = si.astype(np.float64) + 1j * sq.astype(np.float64) - n_chirps, _ = iq.shape - - range_fft = np.fft.fft(iq, axis=1)[:, :n_range] - doppler_fft = np.fft.fftshift(np.fft.fft(range_fft, axis=0), axes=0) - center = n_chirps // 2 - half_d = n_doppler // 2 - doppler_fft = doppler_fft[center - half_d:center + half_d, :] - - rd_mag = np.abs(doppler_fft.real) + np.abs(doppler_fft.imag) - return rd_mag.T # (n_range, n_doppler) - - -# --------------------------------------------------------------------------- -# Plotting -# --------------------------------------------------------------------------- - -def plot_scenario(axes, data: np.ndarray, agc: dict, title: str, - enable_frame: int = 0): - """Plot one AGC scenario across 5 axes.""" - n = data.shape[0] - xs = np.arange(n) - - # Range-Doppler heatmap - if enable_frame > 0 and enable_frame < n: - f_before = max(0, enable_frame - 1) - f_after = min(n - 1, n - 2) - rd_before = process_frame_rd(data[f_before], int(agc["gain_enc"][f_before])) - rd_after = process_frame_rd(data[f_after], int(agc["gain_enc"][f_after])) - combined = np.hstack([rd_before, rd_after]) - im = axes[0].imshow( - 20 * np.log10(combined + 1), aspect="auto", origin="lower", - cmap="inferno", interpolation="nearest") - axes[0].axvline(x=rd_before.shape[1] - 0.5, color="cyan", - linewidth=2, linestyle="--") - axes[0].set_title(f"{title}\nL: f{f_before} (pre) | R: f{f_after} (post)") - else: - worst = int(np.argmax(agc["sat_count"])) - best = int(np.argmin(agc["sat_count"])) - f_show = worst if agc["sat_count"][worst] > 0 else best - rd = process_frame_rd(data[f_show], int(agc["gain_enc"][f_show])) - im = axes[0].imshow( - 20 * np.log10(rd + 1), aspect="auto", origin="lower", - cmap="inferno", interpolation="nearest") - axes[0].set_title(f"{title}\nFrame {f_show}") - - axes[0].set_xlabel("Doppler bin") - axes[0].set_ylabel("Range bin") - plt.colorbar(im, ax=axes[0], label="dB", shrink=0.8) - - # Signed gain history (the real AGC state) - axes[1].plot(xs, agc["gain_signed"], color="#00ff88", linewidth=1.5) - axes[1].axhline(y=0, color="gray", linestyle=":", alpha=0.5, - label="Pass-through") - if enable_frame > 0: - axes[1].axvline(x=enable_frame, color="yellow", linewidth=2, - linestyle="--", label="AGC ON") - axes[1].set_ylim(-8, 8) - axes[1].set_ylabel("Gain (signed)") - axes[1].set_title("AGC Internal Gain (-7=max atten, +7=max amp)") - axes[1].legend(fontsize=7, loc="upper right") - axes[1].grid(True, alpha=0.3) - - # Peak magnitude (PRE-gain, 8-bit) - axes[2].plot(xs, agc["peak_mag"], color="#ffaa00", linewidth=1.0) - axes[2].axhline(y=AGC_TARGET, color="cyan", linestyle="--", - alpha=0.7, label=f"Target ({AGC_TARGET})") - axes[2].axhspan(240, 255, color="red", alpha=0.15, label="Clip zone") - if enable_frame > 0: - axes[2].axvline(x=enable_frame, color="yellow", linewidth=2, - linestyle="--", alpha=0.8) - axes[2].set_ylim(0, 260) - axes[2].set_ylabel("Peak (8-bit)") - axes[2].set_title("Peak Magnitude (pre-gain, raw input)") - axes[2].legend(fontsize=7, loc="upper right") - axes[2].grid(True, alpha=0.3) - - # Saturation count (POST-gain overflow) - axes[3].fill_between(xs, agc["sat_count"], color="red", alpha=0.4) - axes[3].plot(xs, agc["sat_count"], color="red", linewidth=0.8) - if enable_frame > 0: - axes[3].axvline(x=enable_frame, color="yellow", linewidth=2, - linestyle="--", alpha=0.8) - axes[3].set_ylabel("Overflow Count") - total = int(agc["sat_count"].sum()) - axes[3].set_title(f"Post-Gain Overflow (total={total})") - axes[3].grid(True, alpha=0.3) - - # RMS signal level (post-gain) - axes[4].plot(xs, agc["rms_post"], color="#44aaff", linewidth=1.0) - if enable_frame > 0: - axes[4].axvline(x=enable_frame, color="yellow", linewidth=2, - linestyle="--", alpha=0.8) - axes[4].set_ylabel("RMS") - axes[4].set_xlabel("Frame") - axes[4].set_title("Post-Gain RMS Level") - axes[4].grid(True, alpha=0.3) - - -def analyze_dataset(data: np.ndarray, label: str): - """Run 3-scenario analysis for one dataset.""" - n_frames = data.shape[0] - mid = n_frames // 2 - - print(f"\n{'='*60}") - print(f" {label} — shape {data.shape}") - print(f"{'='*60}") - - # Raw ADC stats - raw_sat = np.sum((np.abs(data.real) >= ADC_RAIL) | - (np.abs(data.imag) >= ADC_RAIL)) - print(f" Raw ADC saturation: {raw_sat} samples " - f"({100*raw_sat/(2*data.size):.2f}%)") - - # Scenario 1: AGC OFF — pass-through (gain_shift=0x00) - print(" [1/3] AGC OFF (gain=0, pass-through) ...") - agc_off = simulate_agc(data, agc_enabled=False, initial_gain_enc=0x00) - print(f" Post-gain overflow: {agc_off['sat_count'].sum()} " - f"(should be 0 — no amplification)") - - # Scenario 2: AGC ON from frame 0 - print(" [2/3] AGC ON (from start) ...") - agc_on = simulate_agc(data, agc_enabled=True, enable_at_frame=0, - initial_gain_enc=0x00) - print(f" Final gain: {agc_on['gain_signed'][-1]} " - f"(enc=0x{agc_on['gain_enc'][-1]:X})") - print(f" Post-gain overflow: {agc_on['sat_count'].sum()}") - - # Scenario 3: AGC delayed - print(f" [3/3] AGC delayed (ON at frame {mid}) ...") - agc_delayed = simulate_agc(data, agc_enabled=True, - enable_at_frame=mid, - initial_gain_enc=0x00) - pre_sat = int(agc_delayed["sat_count"][:mid].sum()) - post_sat = int(agc_delayed["sat_count"][mid:].sum()) - print(f" Pre-AGC overflow: {pre_sat} " - f"Post-AGC overflow: {post_sat}") - - # Plot - fig, axes = plt.subplots(3, 5, figsize=(28, 14)) - fig.suptitle(f"AERIS-10 AGC Analysis — {label}\n" - f"({n_frames} frames, {data.shape[1]} chirps, " - f"{data.shape[2]} samples/chirp, " - f"raw ADC sat={100*raw_sat/(2*data.size):.2f}%)", - fontsize=13, fontweight="bold", y=0.99) - - plot_scenario(axes[0], data, agc_off, "AGC OFF (pass-through)") - plot_scenario(axes[1], data, agc_on, "AGC ON (from start)") - plot_scenario(axes[2], data, agc_delayed, - f"AGC delayed (ON at frame {mid})", enable_frame=mid) - - for ax, lbl in zip(axes[:, 0], - ["AGC OFF", "AGC ON", "AGC DELAYED"], - strict=True): - ax.annotate(lbl, xy=(-0.35, 0.5), xycoords="axes fraction", - fontsize=13, fontweight="bold", color="white", - ha="center", va="center", rotation=90) - - plt.tight_layout(rect=[0.03, 0, 1, 0.95]) - return fig - - -def main(): - parser = argparse.ArgumentParser( - description="AGC analysis for ADI raw IQ captures " - "(bit-accurate rx_gain_control.v simulation)") - parser.add_argument("--amp", type=str, - default=str(Path.home() / "Downloads/adi_radar_data" - "/amp_radar" - "/phaser_amp_4MSPS_500M_300u_256_m3dB.npy"), - help="Path to amplified radar .npy") - parser.add_argument("--noamp", type=str, - default=str(Path.home() / "Downloads/adi_radar_data" - "/no_amp_radar" - "/phaser_NOamp_4MSPS_500M_300u_256.npy"), - help="Path to non-amplified radar .npy") - parser.add_argument("--data", type=str, default=None, - help="Single dataset mode") - parser.add_argument("--label", type=str, default="Custom Data") - args = parser.parse_args() - - plt.style.use("dark_background") - - if args.data: - data = np.load(args.data) - analyze_dataset(data, args.label) - plt.show() - return - - figs = [] - for path, label in [(args.amp, "With Amplifier (-3 dB)"), - (args.noamp, "No Amplifier")]: - if not Path(path).exists(): - print(f"WARNING: {path} not found, skipping") - continue - data = np.load(path) - fig = analyze_dataset(data, label) - figs.append(fig) - - if not figs: - print("No data found. Use --amp/--noamp or --data.") - sys.exit(1) - - plt.show() - - -if __name__ == "__main__": - main() diff --git a/9_Firmware/9_3_GUI/test_v7.py b/9_Firmware/9_3_GUI/test_v7.py index 4f70ecd..b07bd2d 100644 --- a/9_Firmware/9_3_GUI/test_v7.py +++ b/9_Firmware/9_3_GUI/test_v7.py @@ -65,9 +65,9 @@ class TestRadarSettings(unittest.TestCase): def test_defaults(self): s = _models().RadarSettings() - self.assertEqual(s.system_frequency, 10e9) - self.assertEqual(s.coverage_radius, 50000) - self.assertEqual(s.max_distance, 50000) + self.assertEqual(s.system_frequency, 10.5e9) + self.assertEqual(s.coverage_radius, 1536) + self.assertEqual(s.max_distance, 1536) class TestGPSData(unittest.TestCase): @@ -425,26 +425,27 @@ class TestWaveformConfig(unittest.TestCase): def test_defaults(self): from v7.models import WaveformConfig wc = WaveformConfig() - self.assertEqual(wc.sample_rate_hz, 4e6) - self.assertEqual(wc.bandwidth_hz, 500e6) - self.assertEqual(wc.chirp_duration_s, 300e-6) - self.assertEqual(wc.center_freq_hz, 10.525e9) + self.assertEqual(wc.sample_rate_hz, 100e6) + self.assertEqual(wc.bandwidth_hz, 20e6) + self.assertEqual(wc.chirp_duration_s, 30e-6) + self.assertEqual(wc.pri_s, 167e-6) + self.assertEqual(wc.center_freq_hz, 10.5e9) self.assertEqual(wc.n_range_bins, 64) self.assertEqual(wc.n_doppler_bins, 32) self.assertEqual(wc.fft_size, 1024) self.assertEqual(wc.decimation_factor, 16) def test_range_resolution(self): - """range_resolution_m should be ~5.62 m/bin with ADI defaults.""" + """range_resolution_m should be ~24.0 m/bin with PLFM defaults.""" from v7.models import WaveformConfig wc = WaveformConfig() - self.assertAlmostEqual(wc.range_resolution_m, 5.621, places=1) + self.assertAlmostEqual(wc.range_resolution_m, 23.98, places=1) def test_velocity_resolution(self): - """velocity_resolution_mps should be ~1.484 m/s/bin.""" + """velocity_resolution_mps should be ~2.67 m/s/bin.""" from v7.models import WaveformConfig wc = WaveformConfig() - self.assertAlmostEqual(wc.velocity_resolution_mps, 1.484, places=2) + self.assertAlmostEqual(wc.velocity_resolution_mps, 2.67, places=1) def test_max_range(self): """max_range_m = range_resolution * n_range_bins.""" @@ -466,7 +467,8 @@ class TestWaveformConfig(unittest.TestCase): """Non-default parameters correctly change derived values.""" from v7.models import WaveformConfig wc1 = WaveformConfig() - wc2 = WaveformConfig(bandwidth_hz=1e9) # double BW → halve range res + # Matched-filter: range_per_bin = c/(2*fs)*dec — proportional to 1/fs + wc2 = WaveformConfig(sample_rate_hz=200e6) # double fs → halve range res self.assertAlmostEqual(wc2.range_resolution_m, wc1.range_resolution_m / 2, places=2) def test_zero_center_freq_velocity(self): @@ -925,18 +927,18 @@ class TestExtractTargetsFromFrame(unittest.TestCase): """Detection at range bin 10 → range = 10 * range_resolution.""" from v7.processing import extract_targets_from_frame frame = self._make_frame(det_cells=[(10, 16)]) # dbin=16 = center → vel=0 - targets = extract_targets_from_frame(frame, range_resolution=5.621) + targets = extract_targets_from_frame(frame, range_resolution=23.98) self.assertEqual(len(targets), 1) - self.assertAlmostEqual(targets[0].range, 10 * 5.621, places=2) + self.assertAlmostEqual(targets[0].range, 10 * 23.98, places=1) self.assertAlmostEqual(targets[0].velocity, 0.0, places=2) def test_velocity_sign(self): """Doppler bin < center → negative velocity, > center → positive.""" from v7.processing import extract_targets_from_frame frame = self._make_frame(det_cells=[(5, 10), (5, 20)]) - targets = extract_targets_from_frame(frame, velocity_resolution=1.484) - # dbin=10: vel = (10-16)*1.484 = -8.904 (approaching) - # dbin=20: vel = (20-16)*1.484 = +5.936 (receding) + targets = extract_targets_from_frame(frame, velocity_resolution=2.67) + # dbin=10: vel = (10-16)*2.67 = -16.02 (approaching) + # dbin=20: vel = (20-16)*2.67 = +10.68 (receding) self.assertLess(targets[0].velocity, 0) self.assertGreater(targets[1].velocity, 0) diff --git a/9_Firmware/9_3_GUI/v7/map_widget.py b/9_Firmware/9_3_GUI/v7/map_widget.py index fa0fcb1..a0c7db2 100644 --- a/9_Firmware/9_3_GUI/v7/map_widget.py +++ b/9_Firmware/9_3_GUI/v7/map_widget.py @@ -98,7 +98,7 @@ class RadarMapWidget(QWidget): ) self._targets: list[RadarTarget] = [] self._pending_targets: list[RadarTarget] | None = None - self._coverage_radius = 50_000 # metres + self._coverage_radius = 1_536 # metres (64 bins x 24 m, 3 km mode) self._tile_server = TileServer.OPENSTREETMAP self._show_coverage = True self._show_trails = False diff --git a/9_Firmware/9_3_GUI/v7/models.py b/9_Firmware/9_3_GUI/v7/models.py index c4b277c..4dfa22d 100644 --- a/9_Firmware/9_3_GUI/v7/models.py +++ b/9_Firmware/9_3_GUI/v7/models.py @@ -108,12 +108,12 @@ class RadarSettings: range_resolution and velocity_resolution should be calibrated to the actual waveform parameters. """ - system_frequency: float = 10e9 # Hz (carrier, used for velocity calc) - range_resolution: float = 781.25 # Meters per range bin (default: 50km/64) - velocity_resolution: float = 1.0 # m/s per Doppler bin (calibrate to waveform) - max_distance: float = 50000 # Max detection range (m) - map_size: float = 50000 # Map display size (m) - coverage_radius: float = 50000 # Map coverage radius (m) + system_frequency: float = 10.5e9 # Hz (PLFM TX LO, verified from ADF4382 config) + range_resolution: float = 24.0 # Meters per decimated range bin (c/(2*100MSPS)*16) + velocity_resolution: float = 2.67 # m/s per Doppler bin (lam/(2*32*167us)) + max_distance: float = 1536 # Max detection range (m) -- 64 bins x 24 m (3 km mode) + map_size: float = 1536 # Map display size (m) + coverage_radius: float = 1536 # Map coverage radius (m) @dataclass @@ -196,42 +196,44 @@ class TileServer(Enum): class WaveformConfig: """Physical waveform parameters for converting bins to SI units. - Encapsulates the radar waveform so that range/velocity resolution + Encapsulates the PLFM radar waveform so that range/velocity resolution can be derived automatically instead of hardcoded in RadarSettings. - Defaults match the ADI CN0566 Phaser capture parameters used in - the golden_reference cosim (4 MSPS, 500 MHz BW, 300 us chirp). + Defaults match the PLFM hardware: 100 MSPS post-DDC processing rate, + 20 MHz chirp bandwidth, 30 us long chirp, 167 us PRI, 10.5 GHz carrier. + The receiver uses matched-filter pulse compression (NOT deramped FMCW), + so range-per-bin = c / (2 * fs_processing) * decimation_factor. """ - sample_rate_hz: float = 4e6 # ADC sample rate - bandwidth_hz: float = 500e6 # Chirp bandwidth - chirp_duration_s: float = 300e-6 # Chirp ramp time - center_freq_hz: float = 10.525e9 # Carrier frequency - n_range_bins: int = 64 # After decimation + sample_rate_hz: float = 100e6 # Post-DDC processing rate (400 MSPS / 4) + bandwidth_hz: float = 20e6 # Chirp bandwidth (Phase 1 target: 30 MHz) + chirp_duration_s: float = 30e-6 # Long chirp ramp (informational only) + pri_s: float = 167e-6 # Pulse repetition interval (chirp + listen) + center_freq_hz: float = 10.5e9 # TX LO carrier (verified: ADF4382 config) + n_range_bins: int = 64 # After decimation (3 km mode) n_doppler_bins: int = 32 # After Doppler FFT fft_size: int = 1024 # Pre-decimation FFT length decimation_factor: int = 16 # 1024 → 64 @property def range_resolution_m(self) -> float: - """Meters per decimated range bin (FMCW deramped baseband). + """Meters per decimated range bin (matched-filter receiver). - For deramped FMCW: bin spacing = c * Fs * T / (2 * N_FFT * BW). + For matched-filter pulse compression: bin spacing = c / (2 * fs). After decimation the bin spacing grows by *decimation_factor*. + This is independent of chirp bandwidth (BW affects resolution, not + bin spacing). """ c = 299_792_458.0 - raw_bin = ( - c * self.sample_rate_hz * self.chirp_duration_s - / (2.0 * self.fft_size * self.bandwidth_hz) - ) + raw_bin = c / (2.0 * self.sample_rate_hz) return raw_bin * self.decimation_factor @property def velocity_resolution_mps(self) -> float: - """m/s per Doppler bin. lambda / (2 * n_doppler * chirp_duration).""" + """m/s per Doppler bin. lambda / (2 * n_doppler * PRI).""" c = 299_792_458.0 wavelength = c / self.center_freq_hz - return wavelength / (2.0 * self.n_doppler_bins * self.chirp_duration_s) + return wavelength / (2.0 * self.n_doppler_bins * self.pri_s) @property def max_range_m(self) -> float: diff --git a/9_Firmware/9_3_GUI/v7/workers.py b/9_Firmware/9_3_GUI/v7/workers.py index c29f3bd..f846751 100644 --- a/9_Firmware/9_3_GUI/v7/workers.py +++ b/9_Firmware/9_3_GUI/v7/workers.py @@ -368,7 +368,7 @@ class TargetSimulator(QObject): for t in self._targets: new_range = t.range - t.velocity * 0.5 - if new_range < 500 or new_range > 50000: + if new_range < 50 or new_range > 1536: continue # target exits coverage — drop it new_vel = max(-150, min(150, t.velocity + random.uniform(-2, 2))) diff --git a/9_Firmware/tests/cross_layer/test_cross_layer_contract.py b/9_Firmware/tests/cross_layer/test_cross_layer_contract.py index c3b950e..8929ee6 100644 --- a/9_Firmware/tests/cross_layer/test_cross_layer_contract.py +++ b/9_Firmware/tests/cross_layer/test_cross_layer_contract.py @@ -724,8 +724,8 @@ class TestTier3CStub: "freq_max": 30.0e6, "prf1": 1000.0, "prf2": 2000.0, - "max_distance": 50000.0, - "map_size": 50000.0, + "max_distance": 1536.0, + "map_size": 1536.0, } pkt = self._build_settings_packet(values) result = self._run_stub(stub_binary, pkt) @@ -784,11 +784,11 @@ class TestTier3CStub: def test_bad_markers_rejected(self, stub_binary): """Packet with wrong start/end markers must be rejected.""" values = { - "system_frequency": 10.0e9, "chirp_duration_1": 30.0e-6, + "system_frequency": 10.5e9, "chirp_duration_1": 30.0e-6, "chirp_duration_2": 0.5e-6, "chirps_per_position": 32, "freq_min": 10.0e6, "freq_max": 30.0e6, "prf1": 1000.0, "prf2": 2000.0, - "max_distance": 50000.0, "map_size": 50000.0, + "max_distance": 1536.0, "map_size": 1536.0, } pkt = self._build_settings_packet(values)