From 7a44f1943259582c68a536d6959267987cc18757 Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Fri, 20 Mar 2026 17:16:12 +0200 Subject: [PATCH] Full-chain MTI+CFAR real-data co-simulation: bit-exact match across all 10247 checkpoints (decim->MTI->Doppler->DC notch->CFAR) using ADI CN0566 data --- .../tb/cosim/real_data/golden_reference.py | 338 +++ .../real_data/hex/fullchain_cfar_det.hex | 2048 +++++++++++++++++ .../hex/fullchain_cfar_detections.txt | 8 + .../real_data/hex/fullchain_cfar_flags.npy | Bin 0 -> 2176 bytes .../real_data/hex/fullchain_cfar_mag.hex | 2048 +++++++++++++++++ .../real_data/hex/fullchain_cfar_mag.npy | Bin 0 -> 16512 bytes .../real_data/hex/fullchain_cfar_thr.hex | 2048 +++++++++++++++++ .../real_data/hex/fullchain_cfar_thr.npy | Bin 0 -> 16512 bytes .../real_data/hex/fullchain_mti_doppler_i.npy | Bin 0 -> 16512 bytes .../real_data/hex/fullchain_mti_doppler_q.npy | Bin 0 -> 16512 bytes .../hex/fullchain_mti_doppler_ref_i.hex | 2048 +++++++++++++++++ .../hex/fullchain_mti_doppler_ref_q.hex | 2048 +++++++++++++++++ .../cosim/real_data/hex/fullchain_mti_i.npy | Bin 0 -> 16512 bytes .../cosim/real_data/hex/fullchain_mti_q.npy | Bin 0 -> 16512 bytes .../real_data/hex/fullchain_mti_ref_i.hex | 2048 +++++++++++++++++ .../real_data/hex/fullchain_mti_ref_q.hex | 2048 +++++++++++++++++ .../real_data/hex/fullchain_notched_ref_i.hex | 2048 +++++++++++++++++ .../hex/fullchain_notched_ref_packed.hex | 2048 +++++++++++++++++ .../real_data/hex/fullchain_notched_ref_q.hex | 2048 +++++++++++++++++ .../tb/tb_fullchain_mti_cfar_realdata.v | 651 ++++++ 20 files changed, 21477 insertions(+) create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_det.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_detections.txt create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_flags.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_doppler_i.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_doppler_q.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_doppler_ref_i.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_doppler_ref_q.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_i.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_q.npy create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_ref_i.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_ref_q.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_notched_ref_i.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_notched_ref_packed.hex create mode 100644 9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_notched_ref_q.hex create mode 100644 9_Firmware/9_2_FPGA/tb/tb_fullchain_mti_cfar_realdata.v 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 cc19548..8dce321 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 @@ -759,6 +759,243 @@ def run_doppler_fft(range_data_i, range_data_q, twiddle_file_32=None): return doppler_map_i, doppler_map_q +# =========================================================================== +# Stage 3c: MTI Canceller (2-pulse, bit-accurate) +# =========================================================================== +def run_mti_canceller(decim_i, decim_q, enable=True): + """ + Bit-accurate model of mti_canceller.v — 2-pulse canceller. + + Input: decim_i/q — shape (N_chirps, NUM_RANGE_BINS), 16-bit signed + Output: mti_i/q — shape (N_chirps, NUM_RANGE_BINS), 16-bit signed + + When enable=True: + - First chirp (chirp 0): output is all zeros (muted, no previous data) + - Subsequent chirps: out[c][r] = current[c][r] - previous[c-1][r], + with saturation to 16-bit. + When enable=False: + - Pass-through (output = input). + + RTL detail (from mti_canceller.v): + diff_full = {I_in[15], I_in} - {prev[15], prev} (17-bit signed) + saturate to 16-bit: clamp to [-32768, +32767] + """ + n_chirps, n_bins = decim_i.shape + mti_i = np.zeros_like(decim_i) + mti_q = np.zeros_like(decim_q) + + print(f"[MTI] 2-pulse canceller, enable={enable}, {n_chirps} chirps x {n_bins} bins") + + if not enable: + mti_i[:] = decim_i + mti_q[:] = decim_q + print(f" Pass-through mode (MTI disabled)") + return mti_i, mti_q + + for c in range(n_chirps): + if c == 0: + # First chirp: output muted (zeros) — no previous data + mti_i[c, :] = 0 + mti_q[c, :] = 0 + else: + for r in range(n_bins): + # Sign-extend to 17-bit, subtract, saturate back to 16-bit + diff_i = int(decim_i[c, r]) - int(decim_i[c - 1, r]) + diff_q = int(decim_q[c, r]) - int(decim_q[c - 1, r]) + mti_i[c, r] = saturate(diff_i, 16) + mti_q[c, r] = saturate(diff_q, 16) + + print(f" Chirp 0: muted (zeros)") + print(f" Chirps 1-{n_chirps-1}: I range [{mti_i[1:].min()}, {mti_i[1:].max()}], " + f"Q range [{mti_q[1:].min()}, {mti_q[1:].max()}]") + return mti_i, mti_q + + +# =========================================================================== +# Stage 3d: DC Notch Filter (post-Doppler, bit-accurate) +# =========================================================================== +def run_dc_notch(doppler_i, doppler_q, width=2): + """ + Bit-accurate model of the inline DC notch filter in radar_system_top.v. + + Input: doppler_i/q — shape (NUM_RANGE_BINS, NUM_DOPPLER_BINS), 16-bit signed + Output: notched_i/q — shape (NUM_RANGE_BINS, NUM_DOPPLER_BINS), 16-bit signed + + Zeros Doppler bins within ±width of DC (bin 0). + In a 32-point FFT, DC is bin 0; negative Doppler wraps to bins 31,30,... + width=0: pass-through + width=1: zero bins {0} + width=2: zero bins {0, 1, 31} + width=3: zero bins {0, 1, 2, 30, 31} etc. + + RTL logic (from radar_system_top.v lines 517-524): + dc_notch_active = (width != 0) && + (dop_bin < width || dop_bin > (31 - width + 1)) + notched_data = dc_notch_active ? 0 : doppler_data + """ + n_range, n_doppler = doppler_i.shape + notched_i = doppler_i.copy() + notched_q = doppler_q.copy() + + print(f"[DC NOTCH] width={width}, {n_range} range bins x {n_doppler} Doppler bins") + + if width == 0: + print(f" Pass-through (width=0)") + return notched_i, notched_q + + zeroed_count = 0 + for dbin in range(n_doppler): + # Replicate RTL comparison (unsigned 5-bit): + # dop_bin < width OR dop_bin > (31 - width + 1) + active = (dbin < width) or (dbin > (31 - width + 1)) + if active: + notched_i[:, dbin] = 0 + notched_q[:, dbin] = 0 + zeroed_count += 1 + + print(f" Zeroed {zeroed_count} Doppler bin columns") + return notched_i, notched_q + + +# =========================================================================== +# Stage 3e: CA-CFAR Detector (bit-accurate) +# =========================================================================== +def run_cfar_ca(doppler_i, doppler_q, guard=2, train=8, + alpha_q44=0x30, mode='CA', simple_threshold=500): + """ + Bit-accurate model of cfar_ca.v — Cell-Averaging CFAR detector. + + Input: doppler_i/q — shape (NUM_RANGE_BINS, NUM_DOPPLER_BINS), 16-bit signed + Output: detect_flags — shape (NUM_RANGE_BINS, NUM_DOPPLER_BINS), bool + magnitudes — shape (NUM_RANGE_BINS, NUM_DOPPLER_BINS), uint17 + thresholds — shape (NUM_RANGE_BINS, NUM_DOPPLER_BINS), uint17 + + CFAR algorithm per Doppler column: + 1. Compute magnitude |I| + |Q| for all range bins in that column + 2. For each CUT (Cell Under Test) at range index k: + a. Leading training cells: indices [k-G-T .. k-G-1] (clamped to valid) + b. Lagging training cells: indices [k+G+1 .. k+G+T] (clamped to valid) + c. noise_sum = sum of training cells (CA mode: both sides) + d. threshold = (alpha * noise_sum) >> 4 (Q4.4 shift) + e. detect if magnitude[k] > threshold + + RTL details (from cfar_ca.v): + - Magnitude: |I| + |Q| (L1 norm, 17-bit unsigned) + - Alpha in Q4.4 fixed-point (8-bit unsigned) + - ALPHA_FRAC_BITS = 4 + - Threshold saturates to 17 bits + - Edge handling: uses only available training cells at boundaries + - Pipeline: ST_CFAR_THR → ST_CFAR_MUL → ST_CFAR_CMP + + Modes: + CA: noise_sum = leading_sum + lagging_sum + GO: noise_sum = side with greater average (cross-multiply comparison) + SO: noise_sum = side with smaller average + """ + n_range, n_doppler = doppler_i.shape + ALPHA_FRAC_BITS = 4 + + # Ensure train >= 1 (RTL clamps 0 → 1) + if train == 0: + train = 1 + + print(f"[CFAR] mode={mode}, guard={guard}, train={train}, " + f"alpha=0x{alpha_q44:02X} (Q4.4={alpha_q44/16:.2f}), " + f"{n_range} range x {n_doppler} Doppler") + + # Compute magnitudes: |I| + |Q| (17-bit unsigned, matching RTL L1 norm) + # RTL: abs_i = I[15] ? (~I + 1) : I; abs_q = Q[15] ? (~Q + 1) : Q + # For I = -32768: ~(-32768 as 16-bit) + 1 = 32768 (unsigned) + magnitudes = np.zeros((n_range, n_doppler), dtype=np.int64) + for rbin in range(n_range): + for dbin in range(n_doppler): + i_val = int(doppler_i[rbin, dbin]) + q_val = int(doppler_q[rbin, dbin]) + abs_i = (-i_val) & 0xFFFF if i_val < 0 else i_val & 0xFFFF + abs_q = (-q_val) & 0xFFFF if q_val < 0 else q_val & 0xFFFF + magnitudes[rbin, dbin] = abs_i + abs_q # 17-bit unsigned + + detect_flags = np.zeros((n_range, n_doppler), dtype=np.bool_) + thresholds = np.zeros((n_range, n_doppler), dtype=np.int64) + + total_detections = 0 + + # Process each Doppler column independently (matching RTL column-by-column) + for dbin in range(n_doppler): + col = magnitudes[:, dbin] # 64 magnitudes for this Doppler bin + + for cut_idx in range(n_range): + # Compute leading sum (cells before CUT, outside guard zone) + leading_sum = 0 + leading_count = 0 + for t in range(1, train + 1): + idx = cut_idx - guard - t + if 0 <= idx < n_range: + leading_sum += int(col[idx]) + leading_count += 1 + + # Compute lagging sum (cells after CUT, outside guard zone) + lagging_sum = 0 + lagging_count = 0 + for t in range(1, train + 1): + idx = cut_idx + guard + t + if 0 <= idx < n_range: + lagging_sum += int(col[idx]) + lagging_count += 1 + + # Mode-dependent noise estimate + if mode == 'CA' or mode == 'CA-CFAR': + noise_sum = leading_sum + lagging_sum + elif mode == 'GO' or mode == 'GO-CFAR': + if leading_count > 0 and lagging_count > 0: + if leading_sum * lagging_count > lagging_sum * leading_count: + noise_sum = leading_sum + else: + noise_sum = lagging_sum + elif leading_count > 0: + noise_sum = leading_sum + else: + noise_sum = lagging_sum + elif mode == 'SO' or mode == 'SO-CFAR': + if leading_count > 0 and lagging_count > 0: + if leading_sum * lagging_count < lagging_sum * leading_count: + noise_sum = leading_sum + else: + noise_sum = lagging_sum + elif leading_count > 0: + noise_sum = leading_sum + else: + noise_sum = lagging_sum + else: + noise_sum = leading_sum + lagging_sum # Default to CA + + # Threshold = (alpha * noise_sum) >> ALPHA_FRAC_BITS + # RTL: noise_product = r_alpha * noise_sum_reg (31-bit) + # threshold = noise_product[ALPHA_FRAC_BITS +: MAG_WIDTH] + # saturate if overflow + noise_product = alpha_q44 * noise_sum + threshold_raw = noise_product >> ALPHA_FRAC_BITS + + # Saturate to MAG_WIDTH=17 bits + MAX_MAG = (1 << 17) - 1 # 131071 + if threshold_raw > MAX_MAG: + threshold_val = MAX_MAG + else: + threshold_val = int(threshold_raw) + + # Detection: magnitude > threshold + if int(col[cut_idx]) > threshold_val: + detect_flags[cut_idx, dbin] = True + total_detections += 1 + + thresholds[cut_idx, dbin] = threshold_val + + print(f" Total detections: {total_detections}") + print(f" Magnitude range: [{magnitudes.min()}, {magnitudes.max()}]") + + return detect_flags, magnitudes, thresholds + + # =========================================================================== # Stage 4: Detection (magnitude threshold) # =========================================================================== @@ -1060,6 +1297,105 @@ def main(): np.save(os.path.join(output_dir, "fullchain_doppler_i.npy"), fc_doppler_i) np.save(os.path.join(output_dir, "fullchain_doppler_q.npy"), fc_doppler_q) + # ----------------------------------------------------------------------- + # Full-chain with MTI + DC Notch + CFAR + # This models the complete RTL data flow: + # range FFT → decimator → MTI canceller → Doppler → DC notch → CFAR + # ----------------------------------------------------------------------- + print(f"\n{'=' * 72}") + print("Stage 3c: MTI Canceller (2-pulse, on decimated data)") + mti_i, mti_q = run_mti_canceller(decim_i, decim_q, enable=True) + write_hex_files(output_dir, mti_i, mti_q, "fullchain_mti_ref") + np.save(os.path.join(output_dir, "fullchain_mti_i.npy"), mti_i) + np.save(os.path.join(output_dir, "fullchain_mti_q.npy"), mti_q) + + # Doppler on MTI-filtered data + print(f"\n{'=' * 72}") + print("Stage 3b+c: Doppler FFT on MTI-filtered decimated data") + mti_doppler_i, mti_doppler_q = run_doppler_fft( + mti_i, mti_q, twiddle_file_32=twiddle_32 + ) + write_hex_files(output_dir, mti_doppler_i, mti_doppler_q, "fullchain_mti_doppler_ref") + np.save(os.path.join(output_dir, "fullchain_mti_doppler_i.npy"), mti_doppler_i) + np.save(os.path.join(output_dir, "fullchain_mti_doppler_q.npy"), mti_doppler_q) + + # DC notch on MTI-Doppler data + DC_NOTCH_WIDTH = 2 # Default test value: zero bins {0, 1, 31} + print(f"\n{'=' * 72}") + print(f"Stage 3d: DC Notch Filter (width={DC_NOTCH_WIDTH})") + notched_i, notched_q = run_dc_notch(mti_doppler_i, mti_doppler_q, width=DC_NOTCH_WIDTH) + write_hex_files(output_dir, notched_i, notched_q, "fullchain_notched_ref") + + # Write notched Doppler as packed 32-bit for RTL comparison + fc_notched_packed_file = os.path.join(output_dir, "fullchain_notched_ref_packed.hex") + with open(fc_notched_packed_file, 'w') as f: + for rbin in range(DOPPLER_RANGE_BINS): + for dbin in range(DOPPLER_FFT_SIZE): + i_val = int(notched_i[rbin, dbin]) & 0xFFFF + q_val = int(notched_q[rbin, dbin]) & 0xFFFF + packed = (q_val << 16) | i_val + f.write(f"{packed:08X}\n") + print(f" Wrote {fc_notched_packed_file} ({DOPPLER_RANGE_BINS * DOPPLER_FFT_SIZE} packed IQ words)") + + # CFAR on DC-notched data + CFAR_GUARD = 2 + CFAR_TRAIN = 8 + CFAR_ALPHA = 0x30 # Q4.4 = 3.0 + CFAR_MODE = 'CA' + print(f"\n{'=' * 72}") + print(f"Stage 3e: CA-CFAR (guard={CFAR_GUARD}, train={CFAR_TRAIN}, alpha=0x{CFAR_ALPHA:02X})") + cfar_flags, cfar_mag, cfar_thr = run_cfar_ca( + notched_i, notched_q, + guard=CFAR_GUARD, train=CFAR_TRAIN, + alpha_q44=CFAR_ALPHA, mode=CFAR_MODE + ) + + # Write CFAR reference files + # 1. Magnitude map (17-bit unsigned, row-major: 64 range x 32 Doppler = 2048) + cfar_mag_file = os.path.join(output_dir, "fullchain_cfar_mag.hex") + with open(cfar_mag_file, 'w') as f: + for rbin in range(DOPPLER_RANGE_BINS): + for dbin in range(DOPPLER_FFT_SIZE): + m = int(cfar_mag[rbin, dbin]) & 0x1FFFF + f.write(f"{m:05X}\n") + print(f" Wrote {cfar_mag_file} ({DOPPLER_RANGE_BINS * DOPPLER_FFT_SIZE} mag values)") + + # 2. Threshold map (17-bit unsigned) + cfar_thr_file = os.path.join(output_dir, "fullchain_cfar_thr.hex") + with open(cfar_thr_file, 'w') as f: + for rbin in range(DOPPLER_RANGE_BINS): + for dbin in range(DOPPLER_FFT_SIZE): + t = int(cfar_thr[rbin, dbin]) & 0x1FFFF + f.write(f"{t:05X}\n") + print(f" Wrote {cfar_thr_file} ({DOPPLER_RANGE_BINS * DOPPLER_FFT_SIZE} threshold values)") + + # 3. Detection flags (1-bit per cell) + cfar_det_file = os.path.join(output_dir, "fullchain_cfar_det.hex") + with open(cfar_det_file, 'w') as f: + for rbin in range(DOPPLER_RANGE_BINS): + for dbin in range(DOPPLER_FFT_SIZE): + d = 1 if cfar_flags[rbin, dbin] else 0 + f.write(f"{d:01X}\n") + print(f" Wrote {cfar_det_file} ({DOPPLER_RANGE_BINS * DOPPLER_FFT_SIZE} detection flags)") + + # 4. Detection list (text) + cfar_detections = np.argwhere(cfar_flags) + cfar_det_list_file = os.path.join(output_dir, "fullchain_cfar_detections.txt") + with open(cfar_det_list_file, 'w') as f: + f.write(f"# AERIS-10 Full-Chain CFAR Detection List\n") + f.write(f"# Chain: decim -> MTI -> Doppler -> DC notch(w={DC_NOTCH_WIDTH}) -> CA-CFAR\n") + f.write(f"# CFAR: guard={CFAR_GUARD}, train={CFAR_TRAIN}, alpha=0x{CFAR_ALPHA:02X}, mode={CFAR_MODE}\n") + f.write(f"# Format: range_bin doppler_bin magnitude threshold\n") + for det in cfar_detections: + r, d = det + f.write(f"{r} {d} {cfar_mag[r, d]} {cfar_thr[r, d]}\n") + print(f" Wrote {cfar_det_list_file} ({len(cfar_detections)} detections)") + + # Save numpy arrays + np.save(os.path.join(output_dir, "fullchain_cfar_mag.npy"), cfar_mag) + np.save(os.path.join(output_dir, "fullchain_cfar_thr.npy"), cfar_thr) + np.save(os.path.join(output_dir, "fullchain_cfar_flags.npy"), cfar_flags) + # Run detection on full-chain Doppler map print(f"\n{'=' * 72}") print("Stage 4: Detection on full-chain Doppler map") @@ -1148,6 +1484,8 @@ def main(): print(f" Detections (direct): {len(detections)} (threshold={args.threshold})") print(f" Full-chain decimator: 1024→64 peak detection") print(f" Full-chain detections: {len(fc_detections)} (threshold={args.threshold})") + print(f" MTI+CFAR chain: decim → MTI → Doppler → DC notch(w={DC_NOTCH_WIDTH}) → CA-CFAR") + print(f" CFAR detections: {len(cfar_detections)} (guard={CFAR_GUARD}, train={CFAR_TRAIN}, alpha=0x{CFAR_ALPHA:02X})") print(f" Hex stimulus files: {output_dir}/") print(f" Ready for RTL co-simulation with Icarus Verilog") diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_det.hex b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_det.hex new file mode 100644 index 0000000..121a610 --- /dev/null +++ b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_det.hex @@ -0,0 +1,2048 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_detections.txt b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_detections.txt new file mode 100644 index 0000000..b451996 --- /dev/null +++ b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_detections.txt @@ -0,0 +1,8 @@ +# AERIS-10 Full-Chain CFAR Detection List +# Chain: decim -> MTI -> Doppler -> DC notch(w=2) -> CA-CFAR +# CFAR: guard=2, train=8, alpha=0x30, mode=CA +# Format: range_bin doppler_bin magnitude threshold +2 27 40172 38280 +2 28 65534 40749 +2 29 58080 31302 +2 30 16565 13386 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_flags.npy b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_flags.npy new file mode 100644 index 0000000000000000000000000000000000000000..5574a210ffb791d4a2e55a74c186fa80fb810892 GIT binary patch literal 2176 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1JlVqr_qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$dCOQhnMw&VbwF+bcE(Y2GMj)V_>7yo(hQMeDjE2By2#kinXb6xU0stF& B8`A&) literal 0 HcmV?d00001 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.hex b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.hex new file mode 100644 index 0000000..87a9617 --- /dev/null +++ b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.hex @@ -0,0 +1,2048 @@ +00000 +00000 +007BD +02018 +02E0D +017A9 +00586 +009BE +005D7 +00837 +00384 +00D4A +00C54 +00669 +00833 +00571 +004AD +0079B +007D5 +0045C +007B3 +0098F +00A68 +00A2A +000D3 +0058F +0056A +00A2A +00FA0 +00947 +00149 +00000 +00000 +00000 +01038 +01A2F +01E4F +02080 +01EB2 +042F5 +03502 +030C9 +02848 +04E63 +042F6 +04FAD +03D2E +03827 +03BE7 +04480 +0452E +052CF +03179 +046A0 +032FE +0376F +03692 +03907 +016A6 +016BD +02840 +01FF7 +015F6 +00000 +00000 +00000 +005B9 +018FE +03D5C +03DCF +007AF +01C72 +0225B +01D7C +02721 +03E10 +01926 +00AFE +00D37 +0145C +00C0C +00B49 +00605 +00D38 +00C90 +02DFB +02A6F +01904 +020D1 +015AE +0273D +09CEC +0FFFE +0E2E0 +040B5 +00000 +00000 +00000 +02226 +0590F +05A0F +01400 +0369A +056C0 +03890 +03262 +03F9E +038E9 +04F16 +05152 +023AC +0144D +02EF5 +02434 +0295E +0546B +05C9F +02852 +02C06 +028B2 +03CC2 +07088 +03E5E +007F7 +041EA +04A6E +02008 +00000 +00000 +00000 +002EF +005EA +00545 +003F8 +001A5 +00290 +0055A +00359 +0008D +000EE +001E9 +00318 +002C1 +00105 +001E9 +00490 +00401 +00232 +004AF +00840 +0066D +001D0 +0019A +0011F +0027B +00AF2 +01C75 +0166A +006A1 +00000 +00000 +00000 +00065 +00119 +0021C +001CE +002D0 +002D4 +002A8 +00238 +002CE +001E6 +00239 +00257 +00291 +002E2 +001DB +000A8 +001BD +00287 +001A8 +00242 +0033A +001A4 +001EA +001BC +00208 +0030E +004FD +00313 +00183 +00000 +00000 +00000 +0014E +004D0 +005E9 +00240 +00137 +000B1 +0014B +001A9 +00196 +00220 +0015C +001B3 +0024C +003D5 +0047A +00193 +00116 +000CC +00063 +001BA +00245 +0027D +00281 +00207 +000B6 +0015E +0029E +0014B +000B8 +00000 +00000 +00000 +00209 +003F0 +00732 +005AA +00698 +00C4C +009F8 +003E2 +00564 +00976 +007B4 +002B0 +0054E +00322 +00C21 +007DF +003DF +0032A +00940 +00878 +0029C +00376 +00A08 +00B54 +00762 +007BA +00886 +003B8 +00192 +00000 +00000 +00000 +00B02 +018C3 +01602 +016FB +02195 +023C5 +0149B +03480 +035C3 +0246B +0289F +030ED +01F76 +0369F +04722 +0320D +02310 +03DAB +029FC +02147 +02D1B +02E85 +011F7 +025F4 +02267 +01431 +00DE3 +010F3 +006FE +00000 +00000 +00000 +0016F +000EA +00971 +009BD +00140 +00088 +0009C +003CC +0020A +00842 +00916 +008AD +00D2B +00AC3 +009F1 +009B3 +00B7D +00A3C +0078B +008CF +00508 +00436 +0041E +0017C +0035C +003EA +00B2A +00497 +001F3 +00000 +00000 +00000 +00253 +001BE +006C4 +0039E +0025E +00304 +0030B +001C9 +000A4 +003AF +002F5 +004B9 +0008E +0046F +008EC +009CB +0004B +00380 +002AA +003A2 +004BA +00270 +004A7 +001B3 +0030E +0056B +00443 +0039D +000F4 +00000 +00000 +00000 +00161 +00446 +0058E +00283 +0010C +00302 +00237 +00088 +001F7 +003AF +002F0 +0020E +00324 +002E1 +00390 +00543 +002A3 +000F4 +0013E +00343 +002EC +00262 +00369 +003B4 +00101 +00211 +00402 +0018C +000AE +00000 +00000 +00000 +0023C +00416 +00100 +00505 +0054E +001FD +0058C +002BB +0008B +001D1 +001F6 +001D9 +003EE +00288 +005E1 +0032E +0030E +00184 +001C8 +00181 +000A6 +00133 +00422 +00397 +00321 +0061B +0039C +005F9 +0030E +00000 +00000 +00000 +00704 +011AB +0167D +00F40 +0081A +00F1E +00F3D +00E48 +003F0 +006E6 +00EBC +00FAF +00C3E +007B1 +000F2 +0056B +01158 +00DE5 +00CF9 +00970 +00958 +01002 +00E0B +009CE +00880 +00B6A +010B6 +00EB7 +0068C +00000 +00000 +00000 +0056F +00E36 +013CE +006C8 +00475 +00F06 +015F9 +00B13 +0114A +017DB +013C7 +0153B +00F27 +01428 +0084E +01628 +01255 +00F1C +02186 +01B60 +00C8D +00E94 +0155D +00DE9 +00178 +00939 +00A3F +00B7B +00671 +00000 +00000 +00000 +0034A +00C31 +0107F +00DDE +0044F +00C41 +011E8 +00F8C +003A7 +0097E +0082A +003D9 +00357 +0021A +00481 +007B7 +00A34 +00981 +00B49 +00CE8 +00EE7 +00943 +001DC +0049C +007E7 +00D8E +00E5C +002D1 +000BF +00000 +00000 +00000 +00092 +0012F +0043E +0033C +00100 +00707 +0044A +0021C +00391 +00429 +00247 +00358 +00684 +006D5 +00871 +00686 +0056A +00451 +00348 +0061E +00326 +004B9 +00586 +00256 +00285 +00249 +001ED +000D6 +00162 +00000 +00000 +00000 +001D2 +00320 +0033D +006AC +00696 +00A50 +00A28 +00E12 +00AAF +00CE2 +01486 +0110D +00CF4 +0112A +0136F +01146 +00B0A +00F92 +00F11 +00D90 +00AB8 +0100E +01022 +0071C +00549 +009C0 +00972 +003D3 +00280 +00000 +00000 +00000 +000BF +00491 +0072D +00608 +00347 +0008E +00231 +003B1 +00093 +0045C +009CE +00FA0 +00E4A +00D70 +00A99 +00A35 +00C3F +00C01 +00969 +006E2 +00707 +00236 +00331 +00395 +002C7 +00602 +008CC +0029E +0015C +00000 +00000 +00000 +00543 +0093B +00DB8 +001B8 +009D6 +01011 +01B24 +01CCC +01063 +01DAE +00D06 +00D78 +013C3 +01D93 +011BC +00B24 +00FAF +00C3B +00D3A +00C04 +00E3E +0149F +02340 +010FA +009C7 +006A0 +00606 +00796 +00523 +00000 +00000 +00000 +00153 +003E5 +0070D +004F1 +001AE +00283 +00234 +001BC +00209 +001AD +00090 +003B3 +0068D +006D6 +0047B +00744 +00439 +002E1 +001A7 +0007D +000DA +0014B +003C6 +0030A +001F1 +002F5 +005A0 +00529 +0026D +00000 +00000 +00000 +003A6 +00AE1 +01833 +02585 +019CE +01217 +02538 +02F5E +02818 +030BC +02DEE +02460 +0278B +03A70 +035F9 +03B1A +02A54 +02BF1 +02D77 +03727 +03032 +0251B +022A2 +01380 +01AC2 +01D00 +01396 +0119E +00103 +00000 +00000 +00000 +0036D +00779 +00E79 +008D8 +0034D +00C0C +00D90 +007E0 +00467 +001F5 +004D0 +00C65 +00AA1 +003C4 +004F3 +00528 +00911 +00743 +00485 +00680 +00539 +0049C +00C6C +00C94 +0037F +0088F +011A8 +00D57 +00373 +00000 +00000 +00000 +00425 +007AD +008C8 +00B6B +008FF +00F70 +00F30 +00A94 +006C4 +00A25 +01028 +00EF3 +009DA +007A9 +008E1 +00796 +004AD +0044B +00CAE +01043 +00C89 +00E7A +00BAA +00C06 +00C8A +00E0B +00E18 +0081B +00330 +00000 +00000 +00000 +000B3 +001DC +0023A +0012E +000C2 +00220 +001CD +001A4 +0030D +003D4 +00662 +00363 +00252 +00083 +003D0 +002B8 +0029D +00510 +00520 +0035A +00248 +001CA +003D7 +002DA +00161 +001B8 +00412 +0014D +0005C +00000 +00000 +00000 +00236 +003F0 +00ACF +00CAE +00532 +001AF +00720 +00902 +0095B +00830 +00260 +0050C +00662 +00726 +0062D +00C6C +007FA +004C6 +00705 +005B8 +007C6 +0056F +001CE +002F0 +005AB +0097A +00D1A +0063A +0035A +00000 +00000 +00000 +00157 +00434 +007EE +003C7 +00282 +0047E +006B3 +004F6 +0022A +00326 +002D6 +0034A +00239 +000F6 +00165 +002A2 +00403 +0020E +0028A +003CF +0050A +00346 +00713 +0026A +00400 +00404 +00376 +003E4 +00241 +00000 +00000 +00000 +002B6 +0053C +00537 +004E5 +005B3 +00838 +00A5E +006E5 +00572 +0062B +003AA +0145A +01C5A +019C7 +018F0 +01749 +01582 +01502 +02145 +01FC5 +011A3 +0086A +001B8 +00481 +00930 +00FB5 +01184 +00BA6 +005F4 +00000 +00000 +00000 +002D1 +00756 +00E8E +005E0 +002FA +0082F +015D6 +01E78 +0244B +01DD8 +00EAE +007FA +00CD3 +015D6 +014BB +00938 +004D7 +01278 +01C8C +01D30 +01834 +0129B +00A42 +00A48 +01203 +00DFE +00CE4 +0046E +00165 +00000 +00000 +00000 +00258 +009AE +0133A +00BCC +00458 +00A10 +00667 +00C88 +00E94 +00998 +0032E +004CB +00A33 +006C0 +00138 +007B2 +00B48 +00716 +0014A +00A70 +00D2A +008B8 +007E5 +00948 +00272 +00C8A +0144A +00ABB +0029D +00000 +00000 +00000 +003A1 +00540 +00676 +00613 +004C8 +0034C +0042B +00688 +00606 +005F3 +00B12 +0077D +00180 +004E8 +00307 +00123 +0033B +00A98 +00718 +0058B +006B0 +00588 +002A1 +00376 +00418 +0040B +005E4 +005ED +00206 +00000 +00000 +00000 +0034E +005D7 +004D6 +0053C +00996 +00B75 +00C06 +00A11 +00661 +007B0 +00A8A +01275 +015E1 +012A0 +001D9 +00C54 +00776 +005BF +006FE +006B6 +00CDE +00E41 +010F6 +00E73 +00C55 +00B7A +00A08 +008FF +0053F +00000 +00000 +00000 +00080 +0040E +00B60 +00914 +0049B +00319 +004BB +0027A +0068A +009BE +0093A +005E0 +0073E +00953 +0087A +00C39 +0095E +00628 +00500 +000B6 +006F3 +00C23 +008F9 +00AC0 +0098E +002F0 +009C0 +00742 +003A6 +00000 +00000 +00000 +00263 +00812 +009E6 +00615 +009B2 +00C4F +00BE5 +008B8 +005BE +00706 +00254 +0073F +00CFE +00B0D +0099E +00EB6 +011FB +00AB0 +000E4 +0002F +0071C +00B5D +009A9 +00BA4 +00B20 +008A0 +004D2 +005A5 +00258 +00000 +00000 +00000 +001EE +005F8 +0076E +00272 +003D4 +003EC +00523 +0033F +00344 +005E2 +00801 +00B72 +005B7 +00FA5 +01012 +00D71 +009B0 +0083A +00338 +005A4 +006BC +004B4 +00661 +00615 +00328 +0032E +0069D +003A4 +00199 +00000 +00000 +00000 +001EB +0022F +002ED +0059B +004FA +00541 +00279 +003FE +00681 +00810 +005D3 +00394 +006DC +00867 +007CC +00701 +00B2F +00C89 +005E1 +00249 +007E4 +00715 +0052B +00498 +002D9 +004F0 +00929 +006AA +002E0 +00000 +00000 +00000 +0038E +005E9 +00B37 +00663 +004EB +001F4 +00502 +004BD +00554 +0060B +00462 +001AB +0015B +007F6 +00849 +00419 +0054C +0068B +003F9 +003E9 +0076F +00842 +005A0 +0044D +0021E +00349 +006AC +007CD +00165 +00000 +00000 +00000 +00238 +001FB +00091 +005DE +00271 +00AEE +00B22 +00C89 +011A6 +00C1E +00A74 +0050F +003DD +0046E +00895 +007A3 +00906 +00747 +007B5 +006AC +0060B +007E8 +00A66 +008CF +0091A +00C54 +00EF0 +00909 +00337 +00000 +00000 +00000 +003A2 +009D7 +011D2 +00B62 +00CA2 +013AC +0111A +01333 +0101E +00D53 +00EDB +00ADB +003E4 +00332 +00475 +0022B +003B6 +0084F +00D54 +00AF6 +00C76 +0127E +00F3A +01193 +00E9A +00F13 +011EB +00D45 +003E8 +00000 +00000 +00000 +003F6 +00FD3 +013DC +00EFB +01025 +0171F +016C5 +01613 +0180D +01772 +021ED +01CF4 +01359 +01D46 +02CA6 +01B78 +01790 +02133 +01BF8 +01CED +01C75 +015B9 +01145 +01763 +00BFD +00C70 +0107B +00F10 +0036F +00000 +00000 +00000 +00102 +0004D +00127 +001B5 +00290 +0017D +0043A +006FC +004B5 +000F2 +0057E +0058C +001EE +0013C +003A0 +0024B +00674 +00303 +0016F +002D9 +00298 +003FD +001D6 +003C2 +00243 +00268 +00222 +0046A +003D2 +00000 +00000 +00000 +003AB +00876 +00BF2 +00C5C +006F3 +00939 +00DE0 +00CB5 +00EF4 +00C94 +00420 +008FA +00BC9 +0011E +00121 +004C1 +007C3 +00604 +001D2 +009C6 +00EC5 +00697 +0082C +0082D +00676 +0080E +00BF4 +00970 +00343 +00000 +00000 +00000 +0005B +001BC +00D22 +00CAF +008DB +001BC +003FA +0032C +003EF +00B45 +00B69 +00701 +0098C +00F2E +01D4E +018E9 +00DA1 +0064C +00DB8 +00EF7 +00C4D +005B6 +00844 +005D0 +0039B +00789 +00B7F +0035B +001CC +00000 +00000 +00000 +00186 +00499 +00A6C +00D01 +00524 +0035B +00626 +00ACE +0115C +01938 +0151C +00B8B +009C3 +00CEF +005DB +0042A +00852 +00895 +00B3E +00A61 +006E2 +008FB +00430 +0007E +0012A +007D4 +0074C +0019D +0033F +00000 +00000 +00000 +0054B +00774 +00674 +00657 +0066D +0011A +001E8 +003A1 +00450 +00818 +000C6 +006BF +007BF +00DB0 +0019D +00722 +00579 +00C06 +00DF6 +004B1 +002C1 +00A8A +00B5A +001D3 +002CA +003B2 +004AE +006B9 +0046D +00000 +00000 +00000 +00197 +0031C +006A4 +0076E +00540 +00723 +00914 +0098C +00684 +0083B +00912 +0079A +00309 +00439 +004F9 +0053B +008F3 +008C2 +009C0 +009A2 +0084A +00D19 +00664 +00628 +004EE +00355 +00184 +00340 +00223 +00000 +00000 +00000 +004F2 +01475 +01DB7 +00D9F +0055B +00C76 +00975 +00F59 +00ABB +00509 +00897 +00BDA +01277 +017DC +00B68 +00F26 +0062C +00CC7 +01987 +01693 +0122F +01288 +00967 +0084D +001FF +01509 +02A0F +01C20 +008ED +00000 +00000 +00000 +0086F +01036 +01EB3 +0190C +00AFA +005B2 +0066F +00724 +00BA0 +01761 +0217A +01903 +00687 +001F3 +001B7 +009FC +00DDD +01696 +01E13 +012C8 +005D8 +00292 +00851 +008D6 +01066 +0142D +018C6 +013FB +008FF +00000 +00000 +00000 +00604 +00560 +013C1 +00A71 +00920 +00EA6 +0044F +00303 +008B2 +00E64 +010D8 +00F42 +00F76 +00DB9 +00B8C +00969 +01472 +01874 +00D41 +0061B +009DE +00A1C +005BD +009EF +012CA +01858 +010F6 +00392 +00250 +00000 +00000 +00000 +001BE +0050E +006AB +004C6 +001CF +00253 +00148 +00061 +001A4 +00221 +00151 +0021A +00467 +004DA +0016E +002B8 +0007C +00094 +000A5 +00082 +00111 +00129 +00148 +00051 +00074 +001B7 +00443 +002C4 +00145 +00000 +00000 +00000 +00217 +00355 +00522 +0050E +002B5 +0040F +006F9 +0052A +0079A +00632 +00453 +002E2 +00275 +002B3 +00285 +00534 +00657 +00311 +006B8 +00780 +006D9 +006B3 +0083F +00526 +00496 +006EC +00531 +00220 +00149 +00000 +00000 +00000 +00774 +00F06 +01936 +012D4 +01108 +017C6 +01CA4 +01261 +002EC +001C8 +00D2D +01117 +01A94 +01EC6 +00E33 +01663 +01228 +01120 +00D98 +00CD4 +00942 +0180C +01ED0 +017B7 +00BB2 +01B72 +0297B +01791 +00976 +00000 +00000 +00000 +00280 +0010F +00787 +008BF +00D06 +01863 +01B30 +00ACF +00C72 +00877 +01142 +01255 +00C29 +01518 +009A5 +013D5 +00DE0 +0082B +00A95 +00AB9 +008D4 +00E0D +017A0 +01139 +00B32 +00E91 +0172C +00CDD +0046F +00000 +00000 +00000 +00760 +008D0 +00B6D +0092B +0113E +0176D +01461 +008AA +00C50 +0066C +006EB +00ECF +00FAB +00469 +00C53 +0122F +011B0 +01220 +00CB3 +006D1 +003FA +005C7 +01239 +0110C +00396 +014DE +023C3 +0195D +0094B +00000 +00000 +00000 +000EA +0022A +00D67 +00EDF +0075C +0068D +00CF1 +009F8 +008EE +00507 +00F7C +00AAD +001AB +00B9A +004E7 +015C6 +00E96 +01928 +01101 +003F5 +01728 +012A7 +00F65 +0076E +004AC +01439 +0179E +0070D +0013B +00000 +00000 +00000 +0025D +0096D +011DD +00D04 +00661 +00543 +00BA8 +009CB +009A0 +00A71 +00C51 +00A38 +00AE5 +00DF2 +00AF5 +007FE +00BE9 +00CD1 +00781 +0094E +00C95 +00A15 +00712 +0075D +0058A +00355 +0055F +0082A +00417 +00000 +00000 +00000 +00563 +00F9E +0137F +006A7 +0022D +00368 +0034D +00181 +0041F +003B3 +00288 +00284 +0043E +00B2A +00EA7 +00812 +001E5 +000EA +002BF +003B5 +0023B +001A4 +00285 +002B1 +0009F +001EB +00646 +004A0 +0016A +00000 +00000 +00000 +02670 +0675B +0A4AF +06CFF +026C5 +03029 +0347E +0329A +01E76 +02394 +04776 +02943 +032CC +04B2D +07525 +0554D +02944 +037DF +0228F +01D4D +0177F +0314D +04298 +03226 +03716 +05718 +06FD8 +03FCD +0151C +00000 +00000 +00000 +00CD3 +00926 +017AC +006E1 +00954 +00976 +0039F +00302 +009BD +00CF1 +00A35 +00EBB +00837 +00075 +00E11 +01055 +001A9 +01294 +00A58 +009F3 +00A42 +00458 +002A5 +004C8 +0082F +013E5 +00625 +01129 +006FF +00000 +00000 +00000 +0056F +00C15 +005E0 +0096A +0075D +00A2C +006F8 +002AB +0011A +00291 +0054F +008B1 +00620 +00844 +00D3F +0051E +00665 +00721 +00744 +00146 +00389 +00320 +007F4 +00933 +00702 +0087B +00FB7 +0093D +0043C +00000 +00000 +00000 +00B1F +0200C +02138 +00CF4 +009E8 +00A4E +0091E +00C67 +00CD6 +00AB5 +00618 +00AA9 +00DFD +0164B +017D3 +013B7 +00A5B +010BE +00C26 +00B98 +0163C +0147E +0145A +01147 +0066A +009E7 +023E0 +02031 +008F1 +00000 +00000 +00000 +006CF +009B4 +00BAA +012DA +017DF +00DA5 +01616 +02BF0 +03692 +03618 +02220 +0086D +01963 +02871 +03F12 +03E49 +02D1B +01980 +023C4 +0315C +02401 +017C3 +01C72 +02084 +02564 +0242C +01216 +0044B +00299 +00000 +00000 +00000 +0062E +011A9 +02671 +034EC +02BDF +01F0D +02278 +01A38 +01AAC +01E20 +008B0 +00D68 +0284A +02367 +01937 +031AD +0384C +037C1 +023B9 +01826 +00755 +0202D +01EA4 +01418 +026FE +032D0 +02E4E +02070 +01A9A +00000 +00000 +00000 +00141 +00193 +0043A +00143 +001C3 +0030C +00377 +001A3 +0006C +00039 +000F8 +000BE +001A9 +001CE +00110 +001E8 +002CF +0045F +00440 +004F7 +00403 +002A4 +0036F +0040B +00436 +002F7 +0061A +00466 +00295 +00000 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.npy b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_mag.npy new file mode 100644 index 0000000000000000000000000000000000000000..11062d916ecce7e035bc502599029cb475d314cd GIT binary patch literal 16512 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 literal 0 HcmV?d00001 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.hex b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.hex new file mode 100644 index 0000000..f08148a --- /dev/null +++ b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.hex @@ -0,0 +1,2048 @@ +00000 +00000 +0A6BF +18CB7 +1BE46 +0D212 +13833 +1B156 +12C45 +166B9 +1872C +1670D +1B2D6 +1CC65 +11955 +12EF4 +1D7F9 +1693B +128BB +1F983 +1E25E +1403A +15441 +135CC +136A1 +1FDA3 +15B5E +0B5BF +1A370 +1863F +09D11 +00000 +00000 +00000 +04470 +08E5C +0C0C3 +09D9B +09789 +0B61C +0893A +0D12B +0CE37 +0C75F +0CE64 +0DE99 +0B7BD +0FAB0 +155CA +10C68 +0B48A +0FF1E +0D03B +0D10D +0D8F3 +0C2DC +08A96 +0B727 +0A347 +0A40D +0E9B8 +0AB99 +03F03 +00000 +00000 +00000 +04257 +088E0 +0B3F4 +0A0C2 +0A284 +0B463 +089D0 +0CF51 +0CE31 +0CA08 +0CE8B +0DADC +0BB44 +0FF39 +161B2 +10842 +0B1B1 +0FD14 +0C786 +0BCD0 +0C79E +0C105 +0922E +0BE8F +0A539 +09588 +09F2D +07A46 +0344A +00000 +00000 +00000 +06D6B +11ADE +17B3E +11013 +0C2F4 +0F67B +0C114 +10C26 +0DC23 +100E6 +11910 +1161F +0F0E4 +11DF9 +16CFE +12D5C +0F801 +12C42 +10092 +0EF07 +0F930 +10A9D +0B90A +0E772 +0C8DF +0CD1A +0F138 +0B907 +04740 +00000 +00000 +00000 +0AA76 +1859D +1FFDA +17F2B +128C4 +1EA59 +19E24 +1BABF +18417 +1FFFF +1FFFF +1FFFF +1CEFF +1F767 +1FFFF +1FFFF +1FB48 +1FFFF +1F866 +1FFFF +1B102 +1D52F +19554 +1B62D +10F17 +128E2 +180DB +1377C +09A4D +00000 +00000 +00000 +0BF64 +1E95A +1FFFF +1FFFF +138F6 +1FFFF +1FFFF +1FFFF +1F443 +1FFFF +1FFFF +1FFFF +1F0BF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1DF43 +1E30F +1865D +1FFFF +1FFFF +1FFFF +159F3 +00000 +00000 +00000 +10686 +1FFFF +1FFFF +1FFFF +17B05 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1DEEC +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1E1D1 +1FFFF +1FFFF +1FFFF +1A937 +00000 +00000 +00000 +1107C +1FFFF +1FFFF +1FFFF +18FF6 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1F530 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1EF09 +1FFFF +1FFFF +1FFFF +1BEC1 +00000 +00000 +00000 +10CEF +1FFFF +1FFFF +1FFFF +19B21 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1F44C +1FFFF +1FFFF +1FFFF +1C482 +00000 +00000 +00000 +11C7F +1FFFF +1FFFF +1FFFF +1B924 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D409 +00000 +00000 +00000 +11FDF +1FFFF +1FFFF +1FFFF +1C20C +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D6DC +00000 +00000 +00000 +11F94 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D760 +00000 +00000 +00000 +0ED33 +1FFFF +1FFFF +1FFFF +1EF87 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1925D +00000 +00000 +00000 +0E592 +1FFFF +1FFFF +1C335 +1EDA4 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1A36D +1FFFF +1FFFF +0DA6D +00000 +00000 +00000 +083A6 +12078 +1B35A +18894 +14C40 +19D8B +1D19C +1FFFF +1CA31 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1E62A +1FFFF +1FFFF +1FFFF +1FFFF +1E957 +1F54E +1A022 +16323 +19008 +1E99C +15E40 +0794D +00000 +00000 +00000 +082B9 +11D6C +1BD41 +19DC1 +1530F +181EF +1C91A +1FFFF +1C62F +1FFFF +1F7AF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1DA21 +1FFFF +1F0D1 +1FBED +1EE01 +1C7A3 +1D1EA +19B06 +1663B +180B1 +1AA09 +13422 +07122 +00000 +00000 +00000 +0985E +14E0B +1FCA7 +1BF54 +1609E +1B29D +1FC5F +1FFFF +1CE5A +1FFFF +1FFFF +1FFFF +1FC14 +1FFFF +1FFFF +1FFFF +1F03E +1FFFF +1FE27 +1FFFF +1FA64 +1F5ED +1FFFF +1AFBB +17D4E +193CB +1BD32 +15AE0 +082EC +00000 +00000 +00000 +09D1A +15E40 +1FFFF +1D673 +15DEF +1C611 +1FFFF +1FFFF +1DCA3 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1F593 +1D5EF +1ADF6 +17DCF +1C69B +1F68F +185A0 +0968A +00000 +00000 +00000 +0A557 +18156 +1FFFF +1F1DC +15AF8 +1D6F4 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D0DF +1AF88 +1AF94 +1F932 +1FFFF +180BA +090F9 +00000 +00000 +00000 +0821D +13701 +1FB06 +16974 +0B8D7 +168A5 +1CD67 +19770 +15B10 +19428 +15BF1 +190C8 +1A679 +18B64 +16FCB +1A562 +19437 +1831B +1FBD8 +1FFFF +1A763 +1685D +15B55 +12606 +106FE +19218 +1FC17 +13BBA +084F3 +00000 +00000 +00000 +083E2 +136F8 +1D061 +157F2 +0CD4A +16BBD +1CDDC +1B23A +179DC +1AE02 +19107 +19B30 +18A71 +1A205 +18681 +1B00C +1815C +19D1C +1FFFF +1FFFF +1BCD8 +18EA9 +16200 +11B8C +10E90 +1960E +1D3A3 +12330 +08253 +00000 +00000 +00000 +07CA1 +139EF +1C5C6 +14CA3 +0D1CA +1586A +1C1D0 +1B669 +17880 +1A8AA +194B8 +1C66B +1D7BA +1DDED +17670 +1BF84 +1AD93 +1BAFB +1FFFF +1FFFF +1C4BE +18D50 +16D82 +12879 +10D1C +19020 +1D50E +122DF +089B8 +00000 +00000 +00000 +087AE +14F64 +1F9B6 +161F4 +0F7B3 +18282 +1FFFF +1FFFF +1AE3B +1FFFF +1BB82 +1F020 +1FFFF +1FFFF +1AEF2 +1EDAA +1E8FA +1E018 +1FFFF +1FFFF +1F4B5 +1E312 +1DC6D +167FD +13FF5 +1A175 +1EC24 +146DC +0A0F5 +00000 +00000 +00000 +0857A +15B37 +1FFFF +14DED +0FA53 +1A3F4 +1FFFF +1FFFF +1A7DE +1FFFF +1B72C +1FC47 +1FFFF +1FFFF +1B513 +1FFFF +1FFFF +1F5ED +1FFFF +1FFFF +1F353 +1F524 +1F2EA +18072 +14CC4 +19575 +1D958 +142AD +09C0C +00000 +00000 +00000 +07D25 +14C25 +1FFFF +18CBD +13365 +1AB29 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1A889 +18102 +1C7B5 +1EB6D +14AA2 +08979 +00000 +00000 +00000 +074BE +12EC7 +1F5E7 +1950F +12DC2 +19956 +1FFFF +1FFFF +1F428 +1FFFF +1FDD9 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1E873 +1FFFF +1FFFF +1FFFF +1FFFF +1A4CF +17412 +1A568 +1E897 +14142 +07743 +00000 +00000 +00000 +07986 +11CF4 +1D4BD +18F3F +141A5 +19032 +1EB5B +1F992 +1A09A +1FFFF +1F6EF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FE36 +1A2E9 +1C935 +1FFFF +1FFFF +1FFFF +1A91C +1524C +186C0 +1D523 +15B3D +07E96 +00000 +00000 +00000 +07989 +107E2 +196B6 +1774B +13B36 +18417 +1F215 +1F82D +1A844 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1BBB2 +1B59D +1E85E +1FC2F +1FFFF +1A93D +162D8 +1846B +1CB84 +1578C +07D52 +00000 +00000 +00000 +07AB8 +11817 +1CF80 +1993E +14E98 +19B54 +1FFFF +1FFFF +1C290 +1FFFF +1EDFB +1FB63 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D9C7 +1B642 +1AE56 +1F0DA +1FFFF +1FFFF +1C710 +18384 +1A4B1 +1FA91 +174C9 +08586 +00000 +00000 +00000 +07E78 +134F4 +1FED5 +1AFB8 +15FF6 +1CA22 +1FFFF +1FFFF +1FC59 +1FFFF +1FFFF +1F5DE +1DB95 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1E093 +1E7C2 +1FFFF +1FFFF +1FFFF +1DE5F +18627 +1A199 +1FDE8 +18ACE +082C5 +00000 +00000 +00000 +07857 +11DB4 +1C6A7 +1A322 +14D6C +1ADC3 +1FFFF +1FFFF +1D607 +1E210 +1F7F4 +1FFFF +1E56A +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1DFBB +1BD7A +1A3FA +16E81 +1BB40 +1FFFF +18E76 +085BC +00000 +00000 +00000 +080A9 +12933 +1E34E +1B8C4 +14913 +1B585 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1F49D +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1CC77 +1AF4F +190B9 +1DAA5 +1FFFF +197A6 +08565 +00000 +00000 +00000 +07806 +118E6 +1E57F +18A50 +117C6 +196E0 +1EAA1 +1FC14 +1FFFF +1E1F8 +1B1AA +1AF7C +1A814 +1B39C +1FFFF +1C524 +1B7C8 +1CB96 +1FFFF +1FFFF +1FFFF +1B336 +181E9 +18FD8 +14922 +1B654 +1FFFF +18222 +08ACC +00000 +00000 +00000 +07773 +11979 +1E3F3 +19833 +11CB5 +176EE +1D979 +1FFFF +1FFFF +1FFFF +1F24B +1B8A9 +19566 +1C4A0 +1FFFF +1B090 +19DAF +1C9B9 +1FFFF +1FFFF +1FFFF +1BBAC +16197 +16830 +145E0 +1B174 +1FFFF +15CBD +087A2 +00000 +00000 +00000 +07A25 +11898 +1C9D4 +18582 +12300 +1686F +1C6AD +1FFFF +1FFFF +1FFFF +1D69D +1D26B +1CCA7 +1F6B3 +1E714 +1C7E5 +1A691 +1DE86 +1FFFF +1FFFF +1FFFF +1C1D9 +182A9 +16809 +14745 +1AAFC +1FFFF +15C2D +096E7 +00000 +00000 +00000 +077A9 +12291 +1F77F +1A1E4 +136F8 +15FF9 +1C94D +1FFFF +1FFFF +1FFFF +1DAFF +1E183 +1D8EF +1FFFF +1EA3E +1DD30 +1BA9B +1E63F +1FFFF +1FFFF +1FFFF +1F077 +18609 +177C6 +15348 +193A7 +1F335 +15CB1 +09D89 +00000 +00000 +00000 +07C20 +14ED1 +1FFFF +194D0 +12EA3 +16A37 +1C0AD +1F4BE +1FD2E +1FFFF +1C80F +1EB19 +1FFFF +1FFFF +1FFFF +1FFFF +1E000 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +18C21 +17610 +13DD6 +1A2FB +1FFFF +18783 +0A992 +00000 +00000 +00000 +08B50 +15546 +1FFFF +1AF04 +12318 +1343A +18AFB +1C2CC +1DB35 +1FFFF +1D637 +1F7BE +1FC80 +1FFFF +1B4A4 +1F6F8 +1D3EE +1F812 +1FFFF +1FFFF +1F4E8 +1CD34 +16F2F +1556A +14889 +1B7B0 +1FFFF +19584 +0B84A +00000 +00000 +00000 +097F5 +15B58 +1FFFF +1CB5A +1349D +152D0 +1738B +1AE2C +1EA59 +1FFFF +1FEC0 +1E28E +1E49E +1FFFF +198FC +1DB7A +1DEEF +1FFFF +1FFFF +1D8CE +1ED7D +1DB92 +1853D +16836 +16719 +1D931 +1FFFF +18408 +0AA88 +00000 +00000 +00000 +09465 +14CD9 +1FFFF +1B621 +12B04 +12B6D +11B47 +13BFF +16584 +1D931 +1D76F +1BB01 +1AC10 +1FFFF +1748D +1C602 +1CA79 +1EAE3 +1C986 +1712D +19212 +1AC3D +162AB +13EB1 +12564 +1A60D +1FFFF +17A21 +0A48E +00000 +00000 +00000 +09939 +13A8B +1FE93 +18D74 +112DD +13500 +13275 +141FC +179BB +1D18A +1D7FF +1AF70 +183C9 +1DACF +13A49 +18AB6 +1ADD5 +1E1C5 +1C7C7 +14F7C +16C59 +1ACC4 +16A1F +13B48 +13C4D +1A394 +1FFFF +1715A +0A4D3 +00000 +00000 +00000 +0AB06 +16797 +1FFFF +1AEDA +14E17 +1A361 +19CBC +17EB6 +16CB3 +1A15A +1CB8D +1CA2E +1BD68 +1FFFF +1579B +1C479 +1CCC8 +1F48B +1E189 +16716 +184CB +1FFFF +1DFCA +1AB4A +17B6B +1FF86 +1FFFF +1C93E +0BD1E +00000 +00000 +00000 +0A49D +1725C +1FFFF +1D34F +1758F +1FFFF +1FFFF +1B846 +1BA1D +1D1BD +1FFFF +1FFFF +1C30E +1FFFF +1F01A +1FFFF +1FFFF +1FFFF +1FFFF +1BBD3 +1C5C9 +1FFFF +1FFFF +1F44C +1939B +1FFFF +1FFFF +1EDDD +0B7B4 +00000 +00000 +00000 +0B77E +17835 +1FFFF +1C269 +19368 +1FFFF +1FFFF +1C326 +1C602 +1B1EC +1FFFF +1FFFF +1D904 +1FFFF +1F79A +1FFFF +1FFFF +1FFFF +1FFFF +1B9C9 +1ABC8 +1F362 +1FFFF +1FFFE +179B2 +1FFFF +1FFFF +1FFFF +0CDB0 +00000 +00000 +00000 +0AF3E +14280 +1FFFF +1D8FE +1912E +1FFFF +1FFFF +1BEFA +1DC3D +1C290 +1FFFF +1FFFF +1A301 +1E714 +1CAA0 +1FFFF +1FFFF +1FFFF +1FDB2 +19EB4 +1D1AE +1E56D +1FFFF +1F2FC +173BB +1FFFF +1FFFF +1F3D4 +0B95B +00000 +00000 +00000 +0984F +12171 +1FFFF +1D39D +19278 +1FFFF +1FFFF +1C6B6 +1D83E +1ABE9 +1FFFF +1E906 +1BB9A +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D97C +19E3F +1F698 +1FEFC +1FFFF +1EDC2 +15480 +1FFFF +1FFFF +1CF86 +0AB3C +00000 +00000 +00000 +0953D +14769 +1FFFF +1DE71 +17E1D +1EDFE +1FFFF +1D6A0 +1EB16 +1BF4E +1FFFF +1DAB1 +1A2A7 +1FFFF +1FFFF +1FFFF +1E813 +1EF8D +1CA0D +1AF55 +1DCA9 +1EB46 +1FFFF +1CBBA +118F2 +1F1D0 +1FFFF +1C389 +0A9A7 +00000 +00000 +00000 +1088A +1FFFF +1FFFF +1FFFF +1F185 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1BEDC +1FFFF +1FFFF +1FFFF +0EE44 +00000 +00000 +00000 +126DB +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1BD23 +1FFFF +1FFFF +1FFFF +0FC2A +00000 +00000 +00000 +124BC +1FFFF +1FFFF +1FFFF +1DAF9 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +18942 +1FFFF +1FFFF +1FFFF +0FB8B +00000 +00000 +00000 +14C04 +1FFFF +1FFFF +1FFFF +1C21E +1DCD0 +1FFFF +1F7D3 +1E9C9 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FCA4 +1FFFF +1FFFF +1FFFF +1DDE1 +18825 +1FFFF +1FFFF +1FFFF +119C1 +00000 +00000 +00000 +15957 +1FFFF +1FFFF +1FFFF +1E9B1 +1E6F3 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +10125 +00000 +00000 +00000 +1635C +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +14748 +00000 +00000 +00000 +1653C +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FA82 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +14139 +00000 +00000 +00000 +166DD +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FAF1 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +14FA0 +00000 +00000 +00000 +0EB2C +1C782 +1FFFF +1FFFF +1E423 +1FFFF +1FFFF +1DEF2 +1F68C +1FFFF +1FC56 +1D65B +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1C6AD +1FFFF +1FFFF +1F69E +1FFFF +1FFFF +1FFFF +1FFFF +11052 +00000 +00000 +00000 +0D60E +1BD2C +1FFFF +1FFFF +1EC21 +1FFFF +1FFFF +1D346 +1EAB9 +1F089 +1D742 +1BFC9 +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +19AF7 +1EF6C +1FFFF +1FFFF +1E825 +1FFFF +1FFFF +1FFFF +110CD +00000 +00000 +00000 +0B9A9 +1620C +1FFFF +1FFFF +1DC0D +1E8BB +1FFFF +1BB22 +1E204 +1E8D0 +1DC04 +1A22F +1F2BD +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1FFFF +1D7DB +19F47 +1E669 +1FFFF +1EABC +1DB26 +1FFFF +1FFFF +1FFD1 +0ED03 +00000 +00000 +00000 +08616 +0ED8D +1E3F3 +1D9CD +1B08A +1C884 +1FFFF +19DE2 +1B582 +1A1E1 +18A41 +155D3 +1D5E0 +1FFFF +1D69D +1FFFF +1FFFF +1FFFF +1D937 +198A5 +170CA +1BF78 +1FFFF +1B27C +1A754 +1FFFF +1FFFF +17BCB +0C378 +00000 +00000 +00000 +06FC6 +0EF2B +1C02F +195E1 +15414 +17DDB +1C2E1 +1158C +10413 +0DF86 +0F8F1 +11652 +1680F +19D3D +122B8 +1D93A +1B01E +1B639 +14E65 +0FD5F +0EDDE +15EC7 +1A7BD +13B36 +100A7 +1C44C +1FFFF +17214 +0B8FB +00000 +00000 +00000 +0CB52 +1E117 +1FFFF +1FFFF +13F59 +1AA36 +1F51B +15D8F +10A85 +0E97F +1B150 +16395 +17A60 +1FFFF +1FFFF +1FFFF +18192 +1B4D7 +148F8 +10B4E +11B29 +18EAC +1FFFF +1946D +12F93 +1FFFF +1FFFF +1C7DF +0A4B2 +00000 +00000 +00000 +0E7C3 +1EDD1 +1FFFF +1FFFF +14DED +1B147 +1E0A8 +1522E +10FAA +0FD11 +1C00E +184E6 +186AB +1F9DD +1FFFF +1FFFF +16B1B +1D643 +14718 +103C2 +1195B +17FAF +1F4A6 +18732 +12DBC +1FFFF +1FFFF +1E7C8 +0AE15 +00000 +00000 +00000 +0E1B4 +1E4FE +1FFFF +1FFFF +130EC +18879 +19FA4 +1230C +10A34 +0FF6C +1A874 +16BB4 +1494F +1B657 +1FFFF +1FFFF +147D2 +1B846 +1341C +0E118 +10830 +140EB +1B012 +15BA6 +11FAC +1FFFF +1FFFF +1BCCC +09E67 +00000 +00000 +00000 +0FB91 +1FFFF +1FFFF +1FFFF +12792 +15E3A +1696E +127D4 +10B60 +10626 +186F6 +154B0 +14ECB +1B9F0 +1FFFF +1FFFF +13D43 +1D1FF +138CF +0E3B5 +13068 +1543E +1A640 +15BD0 +11154 +1FFFF +1FFFF +1F6C8 +0ABED +00000 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.npy b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_cfar_thr.npy new file mode 100644 index 0000000000000000000000000000000000000000..2758e18ef1a5654263455d2c80e266e3a97fc8e9 GIT binary patch literal 16512 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 O+vq=|rwlz0g8v5^5a1~Q literal 0 HcmV?d00001 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_doppler_q.npy b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_doppler_q.npy new file mode 100644 index 0000000000000000000000000000000000000000..d0454634718f459986d4628ebb4fb4e194a7b191 GIT binary patch literal 16512 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 literal 0 HcmV?d00001 diff --git a/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_q.npy b/9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/fullchain_mti_q.npy new file mode 100644 index 0000000000000000000000000000000000000000..146a6ec4dd6287a92b256858d2f5880938a37f45 GIT binary patch literal 16512 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 o9=nmB+VsD)-sxwp>0QQeLleq+64) + * -> mti_canceller (2-pulse, mti_enable=1) + * -> doppler_processor_optimized (Hamming + 32-pt FFT) + * -> DC notch filter (width=2, inline logic) + * -> cfar_ca (CA mode, guard=2, train=8, alpha=0x30) + * + * and compares outputs bit-for-bit against the Python golden reference + * (golden_reference.py) at multiple checkpoints: + * + * Checkpoint 1: Decimator output matches + * Checkpoint 2: MTI canceller output matches + * Checkpoint 3: Doppler output (post-DC-notch) matches + * Checkpoint 4: CFAR magnitudes match + * Checkpoint 5: CFAR thresholds match + * Checkpoint 6: CFAR detection flags match + * + * Stimulus: + * tb/cosim/real_data/hex/fullchain_range_input.hex + * 32768 x 32-bit packed {Q[31:16], I[15:0]} -- 32 chirps x 1024 bins + * + * Golden reference files: + * fullchain_mti_ref_i.hex, fullchain_mti_ref_q.hex -- MTI output (2048) + * fullchain_notched_ref_i.hex, fullchain_notched_ref_q.hex -- DC-notched Doppler (2048) + * fullchain_cfar_mag.hex -- CFAR magnitudes (2048) + * fullchain_cfar_thr.hex -- CFAR thresholds (2048) + * fullchain_cfar_det.hex -- CFAR detection flags (2048) + * + * Pass criteria: ALL outputs match exactly. + * + * Compile: + * iverilog -Wall -DSIMULATION -g2012 \ + * -o tb/tb_fullchain_mti_cfar_realdata.vvp \ + * tb/tb_fullchain_mti_cfar_realdata.v \ + * range_bin_decimator.v mti_canceller.v doppler_processor.v \ + * xfft_32.v fft_engine.v cfar_ca.v + * + * Run from: 9_Firmware/9_2_FPGA/ + * vvp tb/tb_fullchain_mti_cfar_realdata.vvp + */ + +module tb_fullchain_mti_cfar_realdata; + +// ============================================================================ +// PARAMETERS +// ============================================================================ +localparam CLK_PERIOD = 10.0; // 100 MHz +localparam DOPPLER_FFT = 32; +localparam RANGE_BINS = 64; +localparam CHIRPS = 32; +localparam INPUT_BINS = 1024; +localparam DECIM_FACTOR = 16; + +localparam TOTAL_INPUT_SAMPLES = CHIRPS * INPUT_BINS; // 32768 +localparam TOTAL_MTI_SAMPLES = CHIRPS * RANGE_BINS; // 2048 +localparam TOTAL_DOPPLER_SAMPLES = RANGE_BINS * DOPPLER_FFT; // 2048 +localparam TOTAL_CFAR_CELLS = RANGE_BINS * DOPPLER_FFT; // 2048 + +// Generous timeout: decimator + MTI + Doppler + CFAR processing +localparam MAX_CYCLES = 3_000_000; + +// DC notch width for this test +localparam DC_NOTCH_WIDTH = 3'd2; + +// ============================================================================ +// CLOCK AND RESET +// ============================================================================ +reg clk; +reg reset_n; + +initial clk = 0; +always #(CLK_PERIOD / 2) clk = ~clk; + +// ============================================================================ +// DECIMATOR SIGNALS +// ============================================================================ +reg signed [15:0] decim_i_in; +reg signed [15:0] decim_q_in; +reg decim_valid_in; + +wire signed [15:0] decim_i_out; +wire signed [15:0] decim_q_out; +wire decim_valid_out; +wire [5:0] decim_bin_index; + +// ============================================================================ +// MTI CANCELLER SIGNALS +// ============================================================================ +wire signed [15:0] mti_i_out; +wire signed [15:0] mti_q_out; +wire mti_valid_out; +wire [5:0] mti_bin_out; +wire mti_first_chirp; + +// ============================================================================ +// DOPPLER SIGNALS +// ============================================================================ +// Wire MTI output into Doppler input (matching RTL system_top) +wire [31:0] range_data_32bit; +wire range_data_valid; + +assign range_data_32bit = {mti_q_out, mti_i_out}; +assign range_data_valid = mti_valid_out; + +reg new_chirp_frame; + +wire [31:0] doppler_output; +wire doppler_valid; +wire [4:0] doppler_bin; +wire [5:0] range_bin; +wire processing_active; +wire frame_complete; +wire [3:0] dut_status; + +// ============================================================================ +// DC NOTCH FILTER SIGNALS (inline, replicating radar_system_top.v logic) +// ============================================================================ +wire [4:0] dop_bin_unsigned; +wire dc_notch_active; +wire [31:0] notched_doppler_data; +wire notched_doppler_valid; +wire [4:0] notched_doppler_bin; +wire [5:0] notched_range_bin; + +assign dop_bin_unsigned = doppler_bin; +assign dc_notch_active = (DC_NOTCH_WIDTH != 3'd0) && + (dop_bin_unsigned < {2'b0, DC_NOTCH_WIDTH} || + dop_bin_unsigned > (5'd31 - {2'b0, DC_NOTCH_WIDTH} + 5'd1)); + +assign notched_doppler_data = dc_notch_active ? 32'd0 : doppler_output; +assign notched_doppler_valid = doppler_valid; +assign notched_doppler_bin = doppler_bin; +assign notched_range_bin = range_bin; + +// ============================================================================ +// CFAR SIGNALS +// ============================================================================ +wire cfar_detect_flag; +wire cfar_detect_valid; +wire [5:0] cfar_detect_range; +wire [4:0] cfar_detect_doppler; +wire [16:0] cfar_detect_magnitude; +wire [16:0] cfar_detect_threshold; +wire [15:0] cfar_detect_count; +wire cfar_busy; +wire [7:0] cfar_status_w; + +// ============================================================================ +// DUT INSTANTIATION: Range Bin Decimator +// ============================================================================ +range_bin_decimator #( + .INPUT_BINS(INPUT_BINS), + .OUTPUT_BINS(RANGE_BINS), + .DECIMATION_FACTOR(DECIM_FACTOR) +) range_decim ( + .clk(clk), + .reset_n(reset_n), + .range_i_in(decim_i_in), + .range_q_in(decim_q_in), + .range_valid_in(decim_valid_in), + .range_i_out(decim_i_out), + .range_q_out(decim_q_out), + .range_valid_out(decim_valid_out), + .range_bin_index(decim_bin_index), + .decimation_mode(2'b01), // Peak detection mode + .start_bin(10'd0), + .watchdog_timeout() +); + +// ============================================================================ +// DUT INSTANTIATION: MTI Canceller +// ============================================================================ +mti_canceller #( + .NUM_RANGE_BINS(RANGE_BINS), + .DATA_WIDTH(16) +) mti_inst ( + .clk(clk), + .reset_n(reset_n), + .range_i_in(decim_i_out), + .range_q_in(decim_q_out), + .range_valid_in(decim_valid_out), + .range_bin_in(decim_bin_index), + .range_i_out(mti_i_out), + .range_q_out(mti_q_out), + .range_valid_out(mti_valid_out), + .range_bin_out(mti_bin_out), + .mti_enable(1'b1), // MTI always enabled for this test + .mti_first_chirp(mti_first_chirp) +); + +// ============================================================================ +// DUT INSTANTIATION: Doppler Processor +// ============================================================================ +doppler_processor_optimized doppler_proc ( + .clk(clk), + .reset_n(reset_n), + .range_data(range_data_32bit), + .data_valid(range_data_valid), + .new_chirp_frame(new_chirp_frame), + .doppler_output(doppler_output), + .doppler_valid(doppler_valid), + .doppler_bin(doppler_bin), + .range_bin(range_bin), + .processing_active(processing_active), + .frame_complete(frame_complete), + .status(dut_status) +); + +// ============================================================================ +// DUT INSTANTIATION: CFAR Detector +// ============================================================================ +cfar_ca cfar_inst ( + .clk(clk), + .reset_n(reset_n), + .doppler_data(notched_doppler_data), + .doppler_valid(notched_doppler_valid), + .doppler_bin_in(notched_doppler_bin), + .range_bin_in(notched_range_bin), + .frame_complete(frame_complete), + .cfg_guard_cells(4'd2), + .cfg_train_cells(5'd8), + .cfg_alpha(8'h30), // Q4.4 = 3.0 + .cfg_cfar_mode(2'b00), // CA-CFAR + .cfg_cfar_enable(1'b1), // CFAR enabled + .cfg_simple_threshold(16'd500), + .detect_flag(cfar_detect_flag), + .detect_valid(cfar_detect_valid), + .detect_range(cfar_detect_range), + .detect_doppler(cfar_detect_doppler), + .detect_magnitude(cfar_detect_magnitude), + .detect_threshold(cfar_detect_threshold), + .detect_count(cfar_detect_count), + .cfar_busy(cfar_busy), + .cfar_status(cfar_status_w) +); + +// Internal DUT state (for debug) +wire [2:0] decim_state = range_decim.state; +wire [2:0] doppler_state = doppler_proc.state; + +// ============================================================================ +// INPUT DATA MEMORY (loaded from hex file) +// ============================================================================ +reg [31:0] input_mem [0:TOTAL_INPUT_SAMPLES-1]; + +initial begin + $readmemh("tb/cosim/real_data/hex/fullchain_range_input.hex", input_mem); +end + +// ============================================================================ +// REFERENCE DATA (loaded from hex files) +// ============================================================================ +// MTI reference: 2048 x 16-bit signed (32 chirps x 64 bins, row-major) +reg signed [15:0] ref_mti_i [0:TOTAL_MTI_SAMPLES-1]; +reg signed [15:0] ref_mti_q [0:TOTAL_MTI_SAMPLES-1]; + +// DC-notched Doppler reference: 2048 x 16-bit signed (64 range x 32 Doppler) +reg signed [15:0] ref_notched_i [0:TOTAL_DOPPLER_SAMPLES-1]; +reg signed [15:0] ref_notched_q [0:TOTAL_DOPPLER_SAMPLES-1]; + +// CFAR reference: magnitude, threshold, detection flags +reg [16:0] ref_cfar_mag [0:TOTAL_CFAR_CELLS-1]; +reg [16:0] ref_cfar_thr [0:TOTAL_CFAR_CELLS-1]; +reg [0:0] ref_cfar_det [0:TOTAL_CFAR_CELLS-1]; + +initial begin + $readmemh("tb/cosim/real_data/hex/fullchain_mti_ref_i.hex", ref_mti_i); + $readmemh("tb/cosim/real_data/hex/fullchain_mti_ref_q.hex", ref_mti_q); + $readmemh("tb/cosim/real_data/hex/fullchain_notched_ref_i.hex", ref_notched_i); + $readmemh("tb/cosim/real_data/hex/fullchain_notched_ref_q.hex", ref_notched_q); + $readmemh("tb/cosim/real_data/hex/fullchain_cfar_mag.hex", ref_cfar_mag); + $readmemh("tb/cosim/real_data/hex/fullchain_cfar_thr.hex", ref_cfar_thr); + $readmemh("tb/cosim/real_data/hex/fullchain_cfar_det.hex", ref_cfar_det); +end + +// ============================================================================ +// MTI OUTPUT CAPTURE +// ============================================================================ +integer mti_out_count; +reg signed [15:0] mti_cap_i [0:TOTAL_MTI_SAMPLES-1]; +reg signed [15:0] mti_cap_q [0:TOTAL_MTI_SAMPLES-1]; + +always @(posedge clk or negedge reset_n) begin + if (!reset_n) begin + mti_out_count <= 0; + end else if (mti_valid_out) begin + if (mti_out_count < TOTAL_MTI_SAMPLES) begin + mti_cap_i[mti_out_count] <= mti_i_out; + mti_cap_q[mti_out_count] <= mti_q_out; + end + mti_out_count <= mti_out_count + 1; + end +end + +// ============================================================================ +// DOPPLER OUTPUT CAPTURE (post DC-notch) +// ============================================================================ +reg signed [15:0] dop_cap_i [0:TOTAL_DOPPLER_SAMPLES-1]; +reg signed [15:0] dop_cap_q [0:TOTAL_DOPPLER_SAMPLES-1]; +reg [5:0] dop_cap_rbin [0:TOTAL_DOPPLER_SAMPLES-1]; +reg [4:0] dop_cap_dbin [0:TOTAL_DOPPLER_SAMPLES-1]; +integer dop_out_count; + +// ============================================================================ +// CFAR OUTPUT CAPTURE +// ============================================================================ +reg [16:0] cfar_cap_mag [0:TOTAL_CFAR_CELLS-1]; +reg [16:0] cfar_cap_thr [0:TOTAL_CFAR_CELLS-1]; +reg [0:0] cfar_cap_det [0:TOTAL_CFAR_CELLS-1]; +reg [5:0] cfar_cap_rbin [0:TOTAL_CFAR_CELLS-1]; +reg [4:0] cfar_cap_dbin [0:TOTAL_CFAR_CELLS-1]; +integer cfar_out_count; +integer cfar_det_count; + +// ============================================================================ +// PASS / FAIL TRACKING +// ============================================================================ +integer pass_count, fail_count, test_count; + +task check; + input cond; + input [511:0] label; + begin + test_count = test_count + 1; + if (cond) begin + pass_count = pass_count + 1; + end else begin + $display(" [FAIL] %0s", label); + fail_count = fail_count + 1; + end + end +endtask + +// ============================================================================ +// MAIN TEST SEQUENCE +// ============================================================================ +integer i, chirp, sample_idx, cycle_count; +integer n_exact, n_within_tol; +integer max_err_i, max_err_q; +integer abs_diff_i, abs_diff_q; +reg signed [31:0] diff_i, diff_q; +integer mismatches_printed; +reg [31:0] packed_iq; +integer cfar_ref_idx; +integer cfar_mag_mismatches, cfar_thr_mismatches, cfar_det_mismatches; + +initial begin + // ---- Init ---- + pass_count = 0; + fail_count = 0; + test_count = 0; + dop_out_count = 0; + cfar_out_count = 0; + cfar_det_count = 0; + decim_i_in = 0; + decim_q_in = 0; + decim_valid_in = 0; + new_chirp_frame = 0; + reset_n = 0; + + // ---- Reset ---- + #(CLK_PERIOD * 10); + reset_n = 1; + #(CLK_PERIOD * 5); + + $display("============================================================"); + $display(" Full-Chain Real-Data Co-Simulation (MTI + CFAR)"); + $display(" range_bin_decimator (peak, 1024->64)"); + $display(" -> mti_canceller (2-pulse, enable=1)"); + $display(" -> doppler_processor_optimized (Hamming + 32-pt FFT)"); + $display(" -> DC notch filter (width=%0d)", DC_NOTCH_WIDTH); + $display(" -> cfar_ca (CA, guard=2, train=8, alpha=0x30)"); + $display(" ADI CN0566 Phaser 10.525 GHz X-band FMCW"); + $display(" Input: %0d chirps x %0d range FFT bins = %0d samples", CHIRPS, INPUT_BINS, TOTAL_INPUT_SAMPLES); + $display(" Expected: %0d MTI outputs, %0d Doppler outputs, %0d CFAR cells", TOTAL_MTI_SAMPLES, TOTAL_DOPPLER_SAMPLES, TOTAL_CFAR_CELLS); + $display("============================================================"); + + // ---- Debug: check hex files loaded ---- + $display(" input_mem[0] = %08h", input_mem[0]); + $display(" input_mem[32767] = %08h", input_mem[32767]); + $display(" ref_mti_i[0]=%04h, ref_mti_q[0]=%04h", ref_mti_i[0], ref_mti_q[0]); + $display(" ref_notched_i[0]=%04h, ref_notched_q[0]=%04h", ref_notched_i[0], ref_notched_q[0]); + $display(" ref_cfar_mag[0]=%05h, ref_cfar_thr[0]=%05h, ref_cfar_det[0]=%01h", ref_cfar_mag[0], ref_cfar_thr[0], ref_cfar_det[0]); + + // ---- Check 1: DUTs start in expected states ---- + check(decim_state == 3'd0, "Decimator starts in ST_IDLE"); + check(doppler_state == 3'b000, "Doppler starts in S_IDLE"); + + // ---- Pulse new_chirp_frame to start Doppler accumulation ---- + @(posedge clk); + new_chirp_frame <= 1; + @(posedge clk); + @(posedge clk); + new_chirp_frame <= 0; + @(posedge clk); + + // ---- Feed input data: 32 chirps x 1024 range bins ---- + $display("\n--- Feeding %0d chirps x %0d bins = %0d samples ---", CHIRPS, INPUT_BINS, TOTAL_INPUT_SAMPLES); + + for (chirp = 0; chirp < CHIRPS; chirp = chirp + 1) begin + for (i = 0; i < INPUT_BINS; i = i + 1) begin + @(posedge clk); + sample_idx = chirp * INPUT_BINS + i; + packed_iq = input_mem[sample_idx]; + decim_i_in <= packed_iq[15:0]; + decim_q_in <= packed_iq[31:16]; + decim_valid_in <= 1; + end + + @(posedge clk); + decim_valid_in <= 0; + decim_i_in <= 0; + decim_q_in <= 0; + + // Wait for decimator to return to IDLE + cycle_count = 0; + while (decim_state != 3'd0 && cycle_count < 200) begin + @(posedge clk); + cycle_count = cycle_count + 1; + end + + if (chirp < 3 || chirp == CHIRPS - 1) begin + $display(" Chirp %0d: IDLE after %0d extra cycles, mti_out=%0d", chirp, cycle_count, mti_out_count); + end + end + + // Allow a few extra cycles for the last MTI output to propagate + repeat (10) @(posedge clk); + + $display(" All input fed. MTI outputs: %0d (expected %0d)", mti_out_count, TOTAL_MTI_SAMPLES); + + // ---- Check: MTI produced correct number of outputs ---- + check(mti_out_count == TOTAL_MTI_SAMPLES, "MTI output count == 2048"); + + // ---- Wait for Doppler processing to complete ---- + $display("\n--- Waiting for Doppler to process and emit %0d outputs ---", TOTAL_DOPPLER_SAMPLES); + + cycle_count = 0; + while (dop_out_count < TOTAL_DOPPLER_SAMPLES && cycle_count < MAX_CYCLES) begin + @(posedge clk); + cycle_count = cycle_count + 1; + + if (doppler_valid) begin + // Capture DC-notched Doppler output + dop_cap_i[dop_out_count] = notched_doppler_data[15:0]; + dop_cap_q[dop_out_count] = notched_doppler_data[31:16]; + dop_cap_rbin[dop_out_count] = notched_range_bin; + dop_cap_dbin[dop_out_count] = notched_doppler_bin; + dop_out_count = dop_out_count + 1; + end + end + + $display(" Collected %0d Doppler outputs in %0d cycles", dop_out_count, cycle_count); + check(dop_out_count == TOTAL_DOPPLER_SAMPLES, "Doppler output count == 2048"); + check(cycle_count < MAX_CYCLES, "Doppler processing within timeout"); + + // ---- Wait for CFAR to complete ---- + $display("\n--- Waiting for CFAR to process %0d cells ---", TOTAL_CFAR_CELLS); + + cycle_count = 0; + while (cfar_out_count < TOTAL_CFAR_CELLS && cycle_count < MAX_CYCLES) begin + @(posedge clk); + cycle_count = cycle_count + 1; + + if (cfar_detect_valid) begin + cfar_cap_mag[cfar_out_count] = cfar_detect_magnitude; + cfar_cap_thr[cfar_out_count] = cfar_detect_threshold; + cfar_cap_det[cfar_out_count] = cfar_detect_flag; + cfar_cap_rbin[cfar_out_count] = cfar_detect_range; + cfar_cap_dbin[cfar_out_count] = cfar_detect_doppler; + if (cfar_detect_flag) cfar_det_count = cfar_det_count + 1; + cfar_out_count = cfar_out_count + 1; + end + end + + $display(" Collected %0d CFAR outputs in %0d cycles (%0d detections)", cfar_out_count, cycle_count, cfar_det_count); + check(cfar_out_count == TOTAL_CFAR_CELLS, "CFAR output count == 2048"); + check(cycle_count < MAX_CYCLES, "CFAR processing within timeout"); + + // ================================================================== + // CHECKPOINT 1: MTI OUTPUT COMPARISON + // ================================================================== + $display(""); + $display("--- Checkpoint 1: MTI canceller output vs golden reference ---"); + + max_err_i = 0; + max_err_q = 0; + n_exact = 0; + mismatches_printed = 0; + + for (i = 0; i < TOTAL_MTI_SAMPLES; i = i + 1) begin + diff_i = mti_cap_i[i] - ref_mti_i[i]; + diff_q = mti_cap_q[i] - ref_mti_q[i]; + abs_diff_i = (diff_i < 0) ? -diff_i : diff_i; + abs_diff_q = (diff_q < 0) ? -diff_q : diff_q; + + if (abs_diff_i > max_err_i) max_err_i = abs_diff_i; + if (abs_diff_q > max_err_q) max_err_q = abs_diff_q; + + if (diff_i == 0 && diff_q == 0) + n_exact = n_exact + 1; + + if ((abs_diff_i > 0 || abs_diff_q > 0) && mismatches_printed < 10) begin + $display(" [%4d] chirp=%0d bin=%0d RTL=(%6d,%6d) REF=(%6d,%6d) ERR=(%4d,%4d)", i, i / RANGE_BINS, i % RANGE_BINS, $signed(mti_cap_i[i]), $signed(mti_cap_q[i]), $signed(ref_mti_i[i]), $signed(ref_mti_q[i]), diff_i, diff_q); + mismatches_printed = mismatches_printed + 1; + end + + check(abs_diff_i == 0 && abs_diff_q == 0, "MTI output bin match"); + end + + $display(" MTI: exact=%0d/%0d, max_err I=%0d Q=%0d", n_exact, TOTAL_MTI_SAMPLES, max_err_i, max_err_q); + + // ================================================================== + // CHECKPOINT 2: DC-NOTCHED DOPPLER OUTPUT COMPARISON + // ================================================================== + $display(""); + $display("--- Checkpoint 2: DC-notched Doppler output vs golden reference ---"); + + max_err_i = 0; + max_err_q = 0; + n_exact = 0; + mismatches_printed = 0; + + for (i = 0; i < TOTAL_DOPPLER_SAMPLES; i = i + 1) begin + diff_i = dop_cap_i[i] - ref_notched_i[i]; + diff_q = dop_cap_q[i] - ref_notched_q[i]; + abs_diff_i = (diff_i < 0) ? -diff_i : diff_i; + abs_diff_q = (diff_q < 0) ? -diff_q : diff_q; + + if (abs_diff_i > max_err_i) max_err_i = abs_diff_i; + if (abs_diff_q > max_err_q) max_err_q = abs_diff_q; + + if (diff_i == 0 && diff_q == 0) + n_exact = n_exact + 1; + + if ((abs_diff_i > 0 || abs_diff_q > 0) && mismatches_printed < 10) begin + $display(" [%4d] rbin=%2d dbin=%2d RTL=(%6d,%6d) REF=(%6d,%6d) ERR=(%4d,%4d)", i, dop_cap_rbin[i], dop_cap_dbin[i], $signed(dop_cap_i[i]), $signed(dop_cap_q[i]), $signed(ref_notched_i[i]), $signed(ref_notched_q[i]), diff_i, diff_q); + mismatches_printed = mismatches_printed + 1; + end + + check(abs_diff_i == 0 && abs_diff_q == 0, "Notched Doppler output bin match"); + end + + $display(" Notched Doppler: exact=%0d/%0d, max_err I=%0d Q=%0d", n_exact, TOTAL_DOPPLER_SAMPLES, max_err_i, max_err_q); + + // ================================================================== + // CHECKPOINT 3: CFAR MAGNITUDE, THRESHOLD, AND DETECTION COMPARISON + // ================================================================== + $display(""); + $display("--- Checkpoint 3: CFAR output vs golden reference ---"); + + cfar_mag_mismatches = 0; + cfar_thr_mismatches = 0; + cfar_det_mismatches = 0; + mismatches_printed = 0; + + // The CFAR outputs cells in Doppler-column order: + // column 0 (dbin=0): range bins 0..63 + // column 1 (dbin=1): range bins 0..63 + // ... + // But golden reference is in row-major order (rbin, dbin). + // We need to map CFAR output index to golden reference index. + for (i = 0; i < cfar_out_count; i = i + 1) begin + // CFAR output: range=cfar_cap_rbin[i], doppler=cfar_cap_dbin[i] + // Golden ref index: rbin * 32 + dbin (row-major) + cfar_ref_idx = cfar_cap_rbin[i] * DOPPLER_FFT + cfar_cap_dbin[i]; + + if (cfar_cap_mag[i] != ref_cfar_mag[cfar_ref_idx]) begin + cfar_mag_mismatches = cfar_mag_mismatches + 1; + if (mismatches_printed < 10) begin + $display(" MAG[%4d] rbin=%2d dbin=%2d RTL=%0d REF=%0d", i, cfar_cap_rbin[i], cfar_cap_dbin[i], cfar_cap_mag[i], ref_cfar_mag[cfar_ref_idx]); + mismatches_printed = mismatches_printed + 1; + end + end + + if (cfar_cap_thr[i] != ref_cfar_thr[cfar_ref_idx]) begin + cfar_thr_mismatches = cfar_thr_mismatches + 1; + if (mismatches_printed < 10) begin + $display(" THR[%4d] rbin=%2d dbin=%2d RTL=%0d REF=%0d", i, cfar_cap_rbin[i], cfar_cap_dbin[i], cfar_cap_thr[i], ref_cfar_thr[cfar_ref_idx]); + mismatches_printed = mismatches_printed + 1; + end + end + + if (cfar_cap_det[i] != ref_cfar_det[cfar_ref_idx]) begin + cfar_det_mismatches = cfar_det_mismatches + 1; + if (mismatches_printed < 10) begin + $display(" DET[%4d] rbin=%2d dbin=%2d RTL=%0d REF=%0d (mag=%0d thr=%0d)", i, cfar_cap_rbin[i], cfar_cap_dbin[i], cfar_cap_det[i], ref_cfar_det[cfar_ref_idx], cfar_cap_mag[i], cfar_cap_thr[i]); + mismatches_printed = mismatches_printed + 1; + end + end + end + + // Per-cell pass/fail for CFAR + for (i = 0; i < cfar_out_count; i = i + 1) begin + cfar_ref_idx = cfar_cap_rbin[i] * DOPPLER_FFT + cfar_cap_dbin[i]; + check(cfar_cap_mag[i] == ref_cfar_mag[cfar_ref_idx], "CFAR magnitude match"); + check(cfar_cap_thr[i] == ref_cfar_thr[cfar_ref_idx], "CFAR threshold match"); + check(cfar_cap_det[i] == ref_cfar_det[cfar_ref_idx], "CFAR detection flag match"); + end + + $display(" CFAR mag mismatches: %0d / %0d", cfar_mag_mismatches, cfar_out_count); + $display(" CFAR thr mismatches: %0d / %0d", cfar_thr_mismatches, cfar_out_count); + $display(" CFAR det mismatches: %0d / %0d", cfar_det_mismatches, cfar_out_count); + $display(" CFAR total detections: RTL=%0d", cfar_det_count); + + // ================================================================== + // SUMMARY + // ================================================================== + $display(""); + $display("============================================================"); + $display(" SUMMARY: Full-Chain Real-Data Co-Simulation (MTI + CFAR)"); + $display("============================================================"); + $display(" Chain: decim(peak) -> MTI -> Doppler -> DC notch(w=%0d) -> CFAR(CA)", DC_NOTCH_WIDTH); + $display(" Input samples: %0d (%0d chirps x %0d bins)", TOTAL_INPUT_SAMPLES, CHIRPS, INPUT_BINS); + $display(" MTI outputs: %0d (expected %0d)", mti_out_count, TOTAL_MTI_SAMPLES); + $display(" Doppler outputs: %0d (expected %0d)", dop_out_count, TOTAL_DOPPLER_SAMPLES); + $display(" CFAR outputs: %0d (expected %0d)", cfar_out_count, TOTAL_CFAR_CELLS); + $display(" CFAR detections: %0d", cfar_det_count); + $display(" Pass: %0d Fail: %0d Total: %0d", pass_count, fail_count, test_count); + $display("============================================================"); + + if (fail_count == 0) + $display("RESULT: ALL TESTS PASSED (%0d/%0d)", pass_count, test_count); + else + $display("RESULT: %0d TESTS FAILED", fail_count); + + $display("============================================================"); + + #(CLK_PERIOD * 10); + $finish; +end + +// ============================================================================ +// WATCHDOG +// ============================================================================ +initial begin + #(CLK_PERIOD * MAX_CYCLES * 2); + $display("[TIMEOUT] Simulation exceeded %0d cycles -- aborting", MAX_CYCLES * 2); + $display("SOME TESTS FAILED"); + $finish; +end + +endmodule