怡心湖

GAN 生成波形的 FPGA 实现时序(NCO 相位累加与 RAM 查表)

这是一个非常硬核的工程实现问题。在乌克兰的"利马"(Lima)或 Pokrova 这类战术级 GNSS 诱骗系统中,FPGA 是绝对的核心。因为 GAN 生成的波形数据量巨大(几十 MB/s 的 IQ 流),且需要纳秒级的时序精度来维持相位连续性和多普勒牵引。

直接将 GAN 模型部署在 FPGA 上做实时推理(Inference)通常太慢且资源消耗过大。因此,实战中的标准做法是:CPU/GPU 离线生成或预计算波形片段,FPGA 作为高精度的"波形播放器"和"动态调制器",负责最关键的 NCO(数控振荡器)相位累加和 RAM 查表(Look-Up Table)。

以下是详细的 FPGA 实现时序逻辑:

一、总体架构:CPU + FPGA 协同

[Host PC / GPU]
   │ (PCIe / Ethernet)
   │  1. 下发 GAN 生成的基带 IQ 数据块
   │  2. 配置控制字 (PRN, Doppler, Code Phase Offset)
   ▼
[FPGA Logic]
   ├── Control Unit (接收指令)
   ├── NCO (Numerically Controlled Oscillator)  ←── 核心:载波与码相位生成
   ├── RAM / FIFO (存储 GAN 波形数据)
   ├── Interpolation Unit (插值器,平滑过渡)
   └── DAC Interface (数模转换接口)

二、核心模块详解

1. NCO(数控振荡器)—— 系统的心脏

NCO 负责生成两个东西:伪随机码(PRN)的时钟载波(Carrier)的相位。它不生成波形本身,而是生成"地址"和"相位"。

  • 工作原理:基于相位累加器(Phase Accumulator)。

  • 频率控制字(FCW):由 CPU 根据 GAN 设定的参数计算得出。

    FCW=fclk​fdesired​​×2N
    • fdesired​:目标频率(如 C/A 码 1.023MHz,或载波 1575.42MHz)。

    • fclk​:FPGA 主时钟(如 100MHz 或 500MHz)。

    • N:相位累加器位宽(通常 32~48 bit,决定频率分辨率)。

时序逻辑(Verilog 风格伪代码):

reg [31:0] phase_accumulator;
wire [31:0] fcw_doppler; // 来自CPU:包含牵引速度的动态Doppler FCW

always @(posedge sys_clk) begin
    // 每个时钟周期,相位累加器增加一个步长
    phase_accumulator <= phase_accumulator + fcw_doppler;
end

// 取相位累加器的高几位作为查表地址
wire [9:0] rom_address = phase_accumulator[31:22];

2. RAM 查表(ROM/LUT)—— 波形的载体

GAN 生成的波形(无论是 IQ 采样点,还是 PRN 码序列)被预先存储在 FPGA 的 Block RAM (BRAM) 或外部 DDR 中。

  • 存储内容

    • PRN 码表:存储 C/A 码的 1023 个码片(通常 1 bit 或 2 bit 量化)。

    • IQ 波形表:存储 GAN 生成的基带 IQ 数据(通常 8bit I + 8bit Q = 16bit 宽度)。

  • 寻址方式:RAM 的地址线直接连接 NCO 输出的 rom_address

3. 慢牵引(Slow Pull-off)的时序实现

这是 GAN + FPGA 结合最精妙的地方。GAN 负责"设计路径",FPGA 负责"精确执行"。

假设我们要将伪距每秒增加 0.5 米(即码相位每秒移动约 0.0017 个 chip):

  1. CPU 计算:CPU 根据 GAN 模型输出的 Δρ(t)曲线,计算出下一秒的码速率偏差

    • 正常 C/A 码率:1.023 MHz。

    • 欺骗码率:1.023 MHz+δf。

    • 其中 δf对应 0.5 m/s 的速度。

  2. 更新 FCW:CPU 将新的 FCW 写入 FPGA 寄存器。

  3. NCO 微移:FPGA 的 NCO 在下一秒开始,以极细微的速率差累加相位。

  4. RAM 读取偏移:由于 NCO 走得快了一点点,它从 RAM 中读取 PRN 码或 IQ 波形的速度也快了一点点。

    • 效果:接收机看到的码相位逐渐超前,解算出的伪距逐渐变大,位置慢慢被"拖"走。

⚠️ 关键点:FPGA 并不需要在每个时钟周期都重新生成波形,它只需要微调 NCO 的步进速度,就能实现对存储好的 GAN 波形的"拉伸"或"压缩",从而实现渐进牵引。


三、GAN 波形数据的组织与 DMA

由于 GAN 生成的波形很长(比如 1ms 的导航电文包含 20 个 C/A 码周期),不可能全部塞进 FPGA 内部 BRAM。

数据层级

存储位置

作用

Micro-code (PRN/Chip)

FPGA BRAM

存储 1023 个 C/A 码片,用于快速扩频调制。

Baseband IQ (Short Term)

FPGA BRAM

缓存当前 1ms 或 20ms 的 GAN 基带数据。

Navigation Bits (Long Term)

External DDR

存储完整的 GAN 生成的导航电文比特流(50bps)。

时序流程

  1. 初始化:CPU 将 GAN 生成的完整导航数据(含虚假星历)写入 DDR。

  2. 中断触发:FPGA 每 20ms(1 个导航数据位周期)向 CPU 请求下一个比特的数据。

  3. DMA 传输:CPU 通过 DMA 将下一比特对应的 IQ 波形片段搬运到 FPGA 的 BRAM 中。

  4. 实时播放:FPGA 内部逻辑以 1.023MHz 的码速率(经过 NCO 调制后)循环播放 BRAM 中的波形。


四、时序图示例(Single Channel)

假设系统时钟 100MHz,C/A 码率 1.023MHz,载波 1575.42MHz。

Time ---->
Sys_Clk:  ↑    ↑    ↑    ↑    ↑    ↑    ↑    ↑   ... (100MHz)
NCO_Acc:  [0]  [X]  [2X] [3X] [4X] [5X] [6X] [7X] ... (Phase Accumulation)
ROM_Addr: [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7] ... (Address from high bits of Acc)
IQ_Data:  [I0Q0][I1Q1][I2Q2][I3Q3]... (Read from BRAM)

Carrier_NCO: [0] [Y] [2Y] [3Y] ... (Accumulates faster for 1575.42MHz)
Carrier_Phase: Used to multiply with IQ_Data for up-conversion.

五、针对 GAN 波形的特殊处理

  1. 相位连续性(Phase Continuity)

    • 在切换 GAN 生成的波形片段(例如从"对齐阶段"切换到"牵引阶段")时,必须确保 NCO 的相位累加器值无缝衔接。不能清零,否则会产生相位跳变(Phase Jump),导致接收机 PLL 失锁。

    • 实现方法:CPU 在发送新配置时,读取当前 NCO 的累加器值,并将新任务的起始相位设置为该值。

  2. 插值(Interpolation)

    • 如果 GAN 生成的波形采样率是 10MHz,而 DAC 的工作速率是 100MHz,FPGA 需要进行插值滤波(通常是 CIC 或 FIR 滤波器),在两个 GAN 样本之间插入 9 个新样本,以保证波形平滑。

  3. 功率控制(AGC)

    • 在 Slow Pull-off 初期,欺骗信号功率必须小于真实信号。FPGA 内部会有一个数字乘法器,将 GAN 输出的 IQ 数据乘以一个系数(如 0.8),实现数字域的 AGC。


六、总结

此文由 怡心湖 编辑,若您觉得有益,欢迎分享转发!:首页 > 常识论 » GAN 生成波形的 FPGA 实现时序(NCO 相位累加与 RAM 查表)

()
分享到:

相关推荐