这是一个非常硬核的工程实现问题。在乌克兰的"利马"(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=fclkfdesired×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):
-
CPU 计算:CPU 根据 GAN 模型输出的 Δρ(t)曲线,计算出下一秒的码速率偏差。
-
正常 C/A 码率:1.023 MHz。
-
欺骗码率:1.023 MHz+δf。
-
其中 δf对应 0.5 m/s 的速度。
-
-
更新 FCW:CPU 将新的 FCW 写入 FPGA 寄存器。
-
NCO 微移:FPGA 的 NCO 在下一秒开始,以极细微的速率差累加相位。
-
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)。 |
时序流程:
-
初始化:CPU 将 GAN 生成的完整导航数据(含虚假星历)写入 DDR。
-
中断触发:FPGA 每 20ms(1 个导航数据位周期)向 CPU 请求下一个比特的数据。
-
DMA 传输:CPU 通过 DMA 将下一比特对应的 IQ 波形片段搬运到 FPGA 的 BRAM 中。
-
实时播放: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 波形的特殊处理
-
相位连续性(Phase Continuity):
-
在切换 GAN 生成的波形片段(例如从"对齐阶段"切换到"牵引阶段")时,必须确保 NCO 的相位累加器值无缝衔接。不能清零,否则会产生相位跳变(Phase Jump),导致接收机 PLL 失锁。
-
实现方法:CPU 在发送新配置时,读取当前 NCO 的累加器值,并将新任务的起始相位设置为该值。
-
-
插值(Interpolation):
-
如果 GAN 生成的波形采样率是 10MHz,而 DAC 的工作速率是 100MHz,FPGA 需要进行插值滤波(通常是 CIC 或 FIR 滤波器),在两个 GAN 样本之间插入 9 个新样本,以保证波形平滑。
-
-
功率控制(AGC):
-
在 Slow Pull-off 初期,欺骗信号功率必须小于真实信号。FPGA 内部会有一个数字乘法器,将 GAN 输出的 IQ 数据乘以一个系数(如 0.8),实现数字域的 AGC。
-
六、总结
此文由 怡心湖 编辑,若您觉得有益,欢迎分享转发!:首页 > 常识论 » GAN 生成波形的 FPGA 实现时序(NCO 相位累加与 RAM 查表)