PLFM_RADAR FPGA 黄金参考数据(Golden Reference Hex)管理与再生成指南:AERIS-10 多普勒处理链位精确回归测试实战

PLFM_RADAR FPGA 黄金参考数据(Golden Reference Hex)管理与再生成指南:AERIS-10 多普勒处理链位精确回归测试实战 PLFM_RADAR FPGA 黄金参考数据Golden Reference Hex管理与再生成指南AERIS-10 多普勒处理链位精确回归测试实战【免费下载链接】PLFM_RADAROpen-source, low-cost 10.5 GHz PLFM phased array RADAR system项目地址: https://gitcode.com/GitHub_Trending/pl/PLFM_RADAR本文以 STALE_NOTICE.md 为骨架讲解 PLFM_RADARAERIS-10 10.5 GHz PLFM 相控阵雷达FPGA 工程中已提交黄金参考 Hex 文件的用途、失效条件与再生成流程。读完本文你将掌握何时必须重新生成tb/cosim/real_data/hex/下的黄金数据、如何用 golden_reference.py 一键重建刺激与参考文件、如何用 tb_doppler_realdata.v 等测试台做位精确比对以及双 16 点 FFT 多普勒架构与定点位宽的底层实现细节。一、这些 Hex 文件是什么已提交的黄金参考数据在9_Firmware/9_2_FPGA/tb/cosim/real_data/hex/目录下存放着一批.hex与.npy文件它们是已提交committed的黄金参考数据Golden Reference专供两条严格的真实数据位精确回归测试使用tb_doppler_realdata.v—— 直接路径喂入 range-FFT 之后的数据单独验证多普勒处理器tb_fullchain_realdata.v—— 全链路路径range FFT → 距离维抽取peak detection→ 多普勒 FFT验证整条处理链。所谓黄金参考意味着这些文件由独立的 Python 定点模型golden_reference.py基于真实雷达数据ADI CN0566 Phaser10.525 GHz X 波段 FMCW4 MSPS生成并与 RTL 仿真输出做**逐比特bit-for-bit**比对误差容限为 0MAX_ERROR 0。与自我祝福式self-blessing的 golden-generate/compare 测试不同这些已提交的黄金数据一旦生成便固定下来RTL 若发生架构级改动如 32 点 FFT 改成双 16 点 FFT而黄金数据未同步更新回归测试就会立刻失败。这正是 run_regression.sh 中把这两条用例标记为exact match required的原因。二、何时必须重新生成STALE 判定条件原文档明确列出四条触发条件——只要多普勒处理管线发生以下任一变更就必须重新生成黄金数据触发条件对应 RTL 文件影响面FFT 尺寸、窗函数、子帧结构变化doppler_processor.v输入输出布局、bin 含义全部改变蝶形运算、旋转因子查表变化xfft_16.v / fft_engine.v定点算术精度、截断/舍入行为改变抽取模式、峰值检测逻辑变化range_bin_decimator.v64 个距离 bin 的选择结果改变旋转因子 ROM 变化fft_twiddle_16.mem及fft_twiddle_1024.mem所有 FFT 输出数值改变判定准则只要上述任一文件被改动hex/目录下的对应.hex文件即为过期STALE必须按第三节流程重新生成并提交。反之若只改动了无关模块如 USB 接口、CDC则黄金数据无需变动。三、如何重新生成完整命令与逐步解析原文档给出的标准流程分为两步先运行 Python 黄金参考模型再执行一段内联 Python 脚本复制多普勒专用文件。3.1 第一步运行黄金参考模型cd 9_Firmware/9_2_FPGA python3 tb/cosim/real_data/golden_reference.py该脚本golden_reference.py默认处理第 0 帧数据并支持以下命令行参数--frame N选择要处理的帧索引默认0--plot生成 Range-Doppler 图谱、固定点 vs 浮点参考对比与检测点叠加图保存为golden_reference_plots.png--threshold N检测门限L1 幅度默认10000。输入数据依赖脚本默认从~/Downloads/adi_radar_data/amp_radar/加载 ADI Phaser 数据集phaser_amp_4MSPS_500M_300u_256_m3dB.npy及其_config.npy。这是仓库外的本地数据集重新生成前需确认该路径存在。脚本输出内容全部写入tb/cosim/real_data/hex/类别文件说明刺激文件post_ddc_i/q.hex、chirp0_i/q.hex、adc_chirp0.hex供 DDC / Range FFT 测试台使用Range FFTrange_fft_chirp0_i/q.hex、range_fft_all_i/q.npy单 chirp 与 32 chirp 全量结果多普勒直接路径doppler_map_i/q.hex、doppler_map_i/q.npy直接对前 64 bin 做多普勒 FFT全链路路径fullchain_range_input.hex、decimated_range_i/q.hex、fullchain_doppler_ref_i/q.hex模拟 RTL 真实数据流range FFT → 抽取 → DopplerMTI / DC Notchfullchain_mti_ref_*.hex、fullchain_mti_doppler_ref_*.hex、fullchain_notched_ref_*.hex带 2 脉冲 MTI 与 DC 陷波的全链路参考CFAR 检测fullchain_cfar_mag/thr/det.hex、fullchain_cfar_detections.txt、fullchain_detections.txtCA-CFAR 幅度图、门限图、检测标志与检测列表打包参考doppler_ref_i/q.hex、fullchain_doppler_ref_packed.hex、fullchain_notched_ref_packed.hex32-bit 打包格式{Q[31:16], I[15:0]}直接供 RTL 比对3.2 第二步复制多普勒专用参考文件python3 -c import numpy as np, os, shutil h tb/cosim/real_data/hex # Regenerate packed stimulus from range FFT npy ri np.load(f{h}/range_fft_all_i.npy) rq np.load(f{h}/range_fft_all_q.npy) with open(f{h}/doppler_input_realdata.hex,w) as f: for c in range(32): for r in range(64): iint(ri[c,r])0xFFFF; qint(rq[c,r])0xFFFF f.write(f{(q16)|i:08X}\n) shutil.copy2(f{h}/doppler_map_i.hex, f{h}/doppler_ref_i.hex) shutil.copy2(f{h}/doppler_map_q.hex, f{h}/doppler_ref_q.hex) 这段内联脚本做三件事需要结合源码理解其数据格式约定从range_fft_all_i/q.npy重建打包刺激golden_reference.py的main()只写了 Range FFT 的 npy 参考而tb_doppler_realdata.v需要的是 32 chirp × 64 range bin、32-bit 打包{Q[31:16], I[15:0]}的doppler_input_realdata.hex共 2048 行chirp-major 顺序复制 I/Q 参考doppler_map_i/q.hex由write_hex_files写成扁平 16-bit 有符号格式需复制为测试台读取的doppler_ref_i/q.hex格式保证write_hex_files使用signed_to_hex()负数按二补码输出且位数按(bits3)//4补齐确保$readmemh正确加载。补充golden_reference.py的main()中已经为全链路测试生成了fullchain_range_input.hex、fullchain_doppler_ref_i/q.hex、fullchain_doppler_ref_packed.hex等文件因此tb_fullchain_realdata.v无需额外复制步骤第二段脚本只针对直接路径tb_doppler_realdata.v补齐缺失的打包刺激。四、架构基础双 16 点 FFT 多普勒处理器原文档指明黄金数据是针对双 16 点 FFT 多普勒架构2 个交错 PRI 子帧 × 16 点 Hamming 加窗 FFT生成的。这一点必须与代码交叉印证否则很容易误用旧的 32 点单 FFT 黄金数据。4.1 子帧结构doppler_processor.v从 doppler_processor.v 源码可确认CHIRPS_PER_FRAME 32每帧总 chirp 数CHIRPS_PER_SUBFRAME 16每子帧 16 个 chirp子帧 0长 PRIlong PRIchirp 0..15 → Hamming 加窗 → 16 点 FFT → 输出 Doppler bin 0-15子帧 1短 PRIshort PRIchirp 16..31 → Hamming 加窗 → 16 点 FFT → 输出 Doppler bin 16-31输出端口doppler_bin打包为{sub_frame, bin[3:0]}同时提供独立的sub_frame信号0长 PRI1短 PRI。对应地golden_reference.py 中的run_doppler_fft()逐距离 bin 处理对每个子帧独立做windowed chirp * hamming与 16 点 FFT输出维度为(DOPPLER_RANGE_BINS64, DOPPLER_TOTAL_BINS32)。4.2 Hamming 窗系数Q15 格式16 点 Hamming 窗以 Q15 定点保存在golden_reference.py的HAMMING_Q15中与doppler_processor.v的窗系数一致0x0A3D, 0x0E5C, 0x1B6D, 0x3088, 0x4B33, 0x6573, 0x7642, 0x7F62, 0x7F62, 0x7642, 0x6573, 0x4B33, 0x3088, 0x1B6D, 0x0E5C, 0x0A3D加窗乘法按 RTL 语义实现(data * hamming (114)) 15即 Q15 乘法加 0.5 舍入后算术右移 15 位结果饱和到 16 位。注意系数左右对称镜像结构与窗的偶对称性一致。4.3 16 点 FFT 的定点细节多普勒 FFT 复用xfft_16.v/fft_engine.v的蝶形单元其定点约定golden_reference.py中run_doppler_fft与fft_twiddle_lookup完整复刻位反转输入加载旋转因子乘法32-bit × 16-bit 48-bit算术右移 15 位TWIDDLE_W - 1蝶形加减在 32 位内部宽度完成输出饱和回 16 位有符号。旋转因子 ROM 来自 fft_twiddle_16.mem四分一余弦 ROM按cos_rom[k]、cos_rom[N/4-k]及象限取反规则查表因此该 .mem 文件是黄金数据正确性的关键依赖——这就是原文档把fft_twiddle_16.mem列为再生成触发条件之一的原因。五、真实数据如何进入管线AD9484 量化与 IF 上变频golden_reference.py的load_and_quantize_adi_data()展示了黄金数据的源头处理值得单独说明取帧从 ADI 数据取一帧256 chirp × 1079 采样仅使用前 32 个 chirp匹配DOPPLER_CHIRPS与前 1024 个采样匹配FFT_SIZE缩放1024 点 FFT 前向模式无 /N 缩放相干信号处理增益可达约 300 倍为避免 16 位输出大量饱和破坏动态范围输入峰值目标设为约 200相当于满量程 ADC 以下约 -40 dB 的典型雷达回波保证 0.01% 的 FFT bin 饱和8 位 ADC 刺激对第 0 chirp 的实部归一化后量化到 8 位无符号round(x*127128)后 clip 到 0..255生成adc_chirp0.hex用于 DDC 链路验证。值得一提的设计取舍ADI 原始数据是 4 MSPS 基带复 IQ而 AERIS-10 是 400 MSPS 采样、120 MHz 中频的真实 ADC 架构。脚本注释明确说明不将基带数据上变频到 400 MSPS 中频而是直接把基带 IQ 作为post-DDC 等效输入注入 FFT 之后的阶段。理由很务实——DDC 已由独立的tb_ddc_cosim.v协同仿真覆盖本数据集聚焦验证FFT 多普勒 检测在真实回波数据上的位精确性。这也是刺激文件被命名为post_ddc_i.hex的由来。六、位精确比对测试台如何运行与判定6.1 直接路径测试台 tb_doppler_realdata.v测试台 的关键参数输入doppler_input_realdata.hex2048 × 32-bit 打包chirp-major期望doppler_ref_i.hex/doppler_ref_q.hex2048 × 16-bit 有符号range-majorrbin0 × 32 Doppler通过准则全部 2048 个输出 bin 与黄金参考完全一致MAX_ERROR 0超时保护MAX_CYCLES 500_000100 MHz 下 5 ms另有双倍周期的看门狗。编译与运行需在9_Firmware/9_2_FPGA/下执行iverilog -Wall -DSIMULATION -g2012 \ -o tb/tb_doppler_realdata.vvp \ tb/tb_doppler_realdata.v doppler_processor.v xfft_16.v fft_engine.v vvp tb/tb_doppler_realdata.vvp测试台内置 7 项结构检查复位后进入 IDLE、喂入 2048 样本后进入处理态、输出计数恰为 2048、无超时、处理结束回到 IDLE、首/末输出 bin 地址正确随后逐样本比对 I/Q 误差统计Exact match与Max error (I/Q)任何失配打印前 20 个差异点。6.2 全链路测试台 tb_fullchain_realdata.v全链路测试台 将range_bin_decimatorINPUT_BINS1024、OUTPUT_BINS64、DECIMATION_FACTOR16decimation_mode2b01即峰值检测的输出直接接入doppler_processor_optimized复刻 RTL 真实数据流iverilog -Wall -DSIMULATION -g2012 \ -o tb/tb_fullchain_realdata.vvp \ tb/tb_fullchain_realdata.v \ range_bin_decimator.v doppler_processor.v xfft_16.v fft_engine.v vvp tb/tb_fullchain_realdata.vvp其输入为fullchain_range_input.hex32768 × 32-bit 打包期望为fullchain_doppler_ref_i/q.hex超时放宽到2_000_000周期抽取 多普勒处理需要更长流水时间通过准则同样是全部 2048 个 Doppler bin 精确匹配。6.3 在回归套件中的位置run_regression.sh 在 Phase 2集成测试中注册了这两条用例并明确注释其价值Real-data co-simulation: committed golden hex vs RTL (exact match required). These catch architecture mismatches (e.g. 32-pt → dual 16-pt Doppler FFT) that self-blessing golden-generate/compare tests cannot detect.即已提交黄金数据与 RTL 的精确比对能捕获自生成/自比对测试无法发现的架构级漂移例如从单 32 点 FFT 改成双 16 点 FFT。执行整套回归cd 9_Firmware/9_2_FPGA ./run_regression.sh # 完整回归含 receiver golden、system top、E2E ./run_regression.sh --quick # 跳过耗时集成测试仅跑单元 两条真实数据协同仿真七、与定点模型配套的其它链级参考除多普勒外golden_reference.py还以位精确方式建模了整条接收链理解这些有助于判断改动波及范围链级Python 模型函数对应 RTL关键位宽/参数ADCload_and_quantize_adi_dataAD9484 接口8-bit 无符号NCObuild_nco_lut/nco_lookupnco_400m_enhanced.v相位累加 32-bitNCO_PHASE_INC0x4CCCCCCD400 MHz 采样下的 120 MHz IF64 项四分之一波正弦 LUT输出 16-bit 有符号混频器run_ddcddc_400m18-bit × 16-bit 34-bit截取[33:16]CICrun_ddccic_decimator_4x_enhanced.v5 级、4 倍抽取、差分延迟 1积分器 48-bit、梳状 28-bit增益右移 10补偿 4⁵1024饱和到 18-bitFIRrun_ddcfir_lowpass.v32 抽头、18-bit 系数源码中 32 个 18sh 十六进制系数在 Python 中逐项复刻、36-bit 累加器取[34:17]DDC 接口run_ddcddc_input_interface18→16 bit收敛舍入 饱和Range FFTrun_range_fftfft_engine.v1024 点 radix-2 DIT位反转加载32-bit 内部宽度twiddle 乘右移 15输出饱和 16-bit距离抽取run_range_bin_decimatorrange_bin_decimator.v三种模式0简单抽取取组内中心样点、1峰值检测IQ最大、2平均求和 4黄金数据用峰值检测模式MTIrun_mti_cancellermti_canceller.v2 脉冲对消首 chirp 输出置零差分饱和 16-bitDC 陷波run_dc_notchradar_system_top.v 内联逻辑将两子帧中距 DC 为 ±width 的 bin 清零width2时清零{0,1,15,16,17,31}CA-CFARrun_cfar_cacfar_ca.v幅度 |I||Q|L1 范数 17-bitguard2、train8、alpha0x30Q4.4即 3.0阈值饱和 17-bit支持 CA/GO/SO 三种模式需要说明的是golden_reference.py的定点模型刻意**忽略 NCO 抖动dithering**以保持位精确可比性这是黄金数据与 RTL 之间唯一有意的差异来源其余每个环节截断位、舍入方式、饱和边界都严格对齐 RTL 源码中的注释约定。八、实操清单何时该跑、跑完看什么改代码前先git确认hex/目录下黄金文件未被意外改动若改动涉及第四节表格中的文件运行回归前必须重新生成。重新生成的完整流程cd 9_Firmware/9_2_FPGA # 1. 确保 ADI 数据集存在于 ~/Downloads/adi_radar_data/amp_radar/ # 2. 重新生成全部黄金参考与刺激文件 python3 tb/cosim/real_data/golden_reference.py --plot # 3. 复制/重建多普勒专用打包文件 python3 -c ... # 见 3.2 节内联脚本 # 4. 本地验证直接路径与全链路路径 iverilog ... vvp ... # tb_doppler_realdata iverilog ... vvp ... # tb_fullchain_realdata # 5. 跑全套回归 ./run_regression.sh跑完看什么两条真实数据测试的输出应显示Exact match: 2048 / 2048、Max error (I): 0、Max error (Q): 0、RESULT: ALL TESTS PASSED。若出现失配测试台会打印前 20 个差异点的(rbin, dbin, RTL值, REF值, 误差)据此定位是 RTL 漂移还是黄金数据过期——前者查doppler_processor.v/xfft_16.v等实现后者按本文第二节触发条件重新生成。九、结论PLFM_RADAR 的黄金参考 Hex 机制是一套数据驱动 位精确的回归保障体系以真实 ADI CN0566 雷达回波为输入用独立 Python 定点模型生成不可篡改的参考再用两条 iverilog 测试台对 RTL 输出做零容差比对。理解 STALE_NOTICE.md 所规定的何时重生成、如何重生成、基于何种架构是维护 AERIS-10 多普勒处理链正确性的关键能力——任何 FFT 架构、抽取逻辑或 twiddle ROM 的变更都必须同步重建黄金数据并验证全部 2048 个输出 bin 的位精确一致。【免费下载链接】PLFM_RADAROpen-source, low-cost 10.5 GHz PLFM phased array RADAR system项目地址: https://gitcode.com/GitHub_Trending/pl/PLFM_RADAR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考