乐于分享
好东西不私藏

数字 AGC(自动增益控制)模块设计文档

数字 AGC(自动增益控制)模块设计文档

数字 AGC(自动增益控制)模块设计文档

概述

本模块为 IQ 信号处理链的前端数字自动增益控制(AGC),将动态范围较大的 ADC 输出压缩到稳定的有效位范围,为下游电平检测提供一致的输入电平。

项目 | 内容 |

|------|------|

输入 | 16-bit signed IQ 数据(I/Q 双路) |

输入有效位范围 | 6 ~ 14  |

输出 | 16-bit signed IQ 数据(I/Q 双路) |

输出有效位范围 | 9 ~ 13 (死区) |

控制结构 | 闭环(测输出调增益) |

增益实现 | 桶式移位(粗调)+ 分数增益乘法(细调) |

语言 / 工具 | VHDL / Vivado 2018.3 + MATLAB R2023b |

设计需求

输入 IQ 信号幅度随 ADC 前端条件在 6~14 位有效位之间波动;

需通过 AGC 使输出稳定在 9~13 位有效位,避免弱信号精度不足、强信号削波;

- I/Q 两路必须共用同一增益,保持复信号相位不失真;

闭环收敛:自动、无振荡,响应速度可控。

有效位 ↔ 幅度对照

16-bit signed 数据:有效位 = MSB(幅度) + 1(含符号位):

有效位 | 峰值幅度范围 | 对应 dBFS |

| 6 (输入下限) | 32 ~ 63 | ~ -60 dB |

| 9 (输出下限) | 256 ~ 511 | ~ -42 dB |

| 11 (目标) | 1024 ~ 2047 | ~ -30 dB |

| 13 (输出上限) | 4096 ~ 8191 | ~ -18 dB |

| 14 (输入上限) | 8192 ~ 16383 | ~ -12 dB |

系统架构

- **前向数据通路**(固定 2 周期延迟):桶式移位分数增益乘法。

- **反馈环**(慢环,不阻塞数据流):αβ幅度估计滑动平均每窗口触发一次增益更新。

增益模型

G = 2^shift × frac/256

分量 | 类型 | 范围 | 说明 |

| `shift` | 6-bit signed | -16 ~ +15 | 粗调,6 dB/,闭环自动 |

| `frac` | 9-bit unsigned(Q1.8) | 256 ~ 511 | 细调,256=1.0,可配置固定 |

关键算法

6.1 桶式移位器(算术移位 + 饱和)

- `shift > 0`:`data << shift`,饱和到±32767

- `shift < 0`:`data >> |shift|`(算术右移,保持符号)

6.2 分数增益乘法器

out = (scaled × frac) >> 8-- 饱和到 16-bit signed

16-bit × 10-bit = 26-bit signed,`>>8`后饱和到 16-bit。最大 32767×511 < 2^24,不溢出。

6.3 增益更新(一步到位比例式控制)

每窗口 `avg_valid` 脉冲触发一次:

eff_bits = MSB(avg_mag) + 1

eff_bits > 13 : shift -= (eff_bits - 11)衰减到目标

eff_bits < 9: shift += (11 - eff_bits)放大到目标

否则保持(死区)

模块划分

文件 | 作用 | 状态 |

| `iq_agc.vhd` | AGC 顶层(移位+乘法+状态机) |  |

| `iq_magnitude_approx.vhd` | αβ幅度估计(复用,不改) | 已有 |

| `iq_level_detector.vhd` | 顶层(集成 AGC + dBFS LUT + 告警) | 修改 |

| `iq_agc_tb.vhd` | AGC 单元测试 |  |

| `iq_level_detector_tb.vhd` | 集成测试(AGC ) |  |

| `iq_level_detector_tb_bypass.vhd` | 集成测试(AGC ,直通) |  |

| `iq_agc_sim.m` | MATLAB 算法验证 |  |

接口定义(iq_agc)

generic

参数 | 默认值 | 说明 |

|------|--------|------|

| `AVG_SHIFT` | 10 | 滑动窗口 = 2^AVG_SHIFT 样本 |

| `LOW_BITS` | 9 | 死区下限(有效位) |

| `HIGH_BITS` | 13 | 死区上限(有效位) |

| `TARGET_BITS` | 11 | 目标有效位(死区中心) |

| `INIT_SHIFT` | 0 | 初始粗调移位 |

| `INIT_FRAC` | 256 | 初始分数增益(1.0) |

port

信号 | 方向 | 类型 | 说明 |

|------|------|------|------|

| `clk` / `rst_n` | in | std_logic | 时钟/复位(低有效) |

| `i_data` / `q_data` | in | signed(15:0) | 输入 IQ |

| `data_valid` | in | std_logic | 输入有效 |

| `i_out` / `q_out` | out | signed(15:0) | 输出 IQ |

| `out_valid` | out | std_logic | 输出有效 |

| `gain_shift` | out | signed(5:0) | 调试:当前粗调移位 |

| `gain_frac` | out | unsigned(8:0) | 调试:当前分数增益 |

集成到 iq_level_detector

顶层新增 generic:

参数 | 默认 | 说明 |

|------|------|------|

| `ENABLE_AGC` | true | AGC 开关 |

| `AGC_AVG_SHIFT` | 10 | AGC 窗口 |

| `AGC_LOW/HIGH/TARGET_BITS` | 9/13/11 | AGC 死区与目标 |

数据流:`i_data/q_data  [AGC] 幅度估计滑动平均 dBFS LUT 电平输出`

`ENABLE_AGC = false` 时自动直通,保持原行为。

10 dBFS LUT 与告警门限(匹配 AGC)

- **dBFS LUT**:预计算 256 条目常量表(Q4.4 定点,12-bit signed),范围 -96 ~ +6 dBFS,`avg_mag(15:8)` 索引。

- **告警门限**(线性幅度,匹配 9/13 位边界):

- `OVERLOAD_THRESH = 8192`(超过 13 告警)

- `UNDERLOAD_THRESH = 256`(低于 9 告警)

11 验证结果

11.1 MATLAB 算法验证(5 阶段全 PASS)

阶段 | 输入幅度 | 稳态输出幅度 | 有效位 | 结果 |

|------|---------|-------------|--------|------|

弱信号 | 32 | 2014 | 11  | PASS |

强信号 | 8192 | 2015 | 11  | PASS |

界内 | 1000 | 1968 | 11  | PASS |

阶跃→强 | 8192 | 2015 | 11  | PASS |

阶跃→弱 | 32 | 2014 | 11  | PASS |

11.2 VHDL 仿真(xvhdl/xelab/xsim)

11.2.1 **AGC 单元测试**:

阶段 | 输入幅度 | gain_shift | 结果 |

|------|---------|-----------|------|

弱信号 | 32 | +6 | 放大 64×  |

强信号 | 8192 | -3 | 衰减 8×  |

界内 | 1000 | +1 | 基本保持 |

阶跃→强 | 8192 | -2 | 衰减 |

阶跃→弱 | 32 | +5 | 放大 |

11.2.2 **集成测试(AGC )**:

阶段 | 输入 | level_magnitude | level_dbfs | 告警 |

|------|------|----------------|-----------|------|

弱信号 | 32 | 2021(11) | -24.6 dB |  |

强信号 | 8192 | 1011(10) | -31.3 dB |  |

11.2.3 **集成测试(AGC ,直通)**:

阶段 | 输入 | level_magnitude | level_dbfs | 告警 |

|------|------|----------------|-----------|------|

强信号 | 8192 | 8091(14) | -12.1 dB |  |

弱信号 | 32 | 31(6) | -96 dB | underload=1 |

数字 AGC(自动增益控制)模块设计文档.rar

数字 AGC(自动增益控制)-matlab.rar

数字 AGC(自动增益控制)-VHDL-prj.rar