数字 AGC(自动增益控制)模块设计文档
1 概述
本模块为 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 |
2 设计需求
- 输入 IQ 信号幅度随 ADC 前端条件在 6~14 位有效位之间波动;
- 需通过 AGC 使输出稳定在 9~13 位有效位,避免弱信号精度不足、强信号削波;
- I/Q 两路必须共用同一增益,保持复信号相位不失真;
- 闭环收敛:自动、无振荡,响应速度可控。
3 有效位 ↔ 幅度对照
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 |
4 系统架构

- **前向数据通路**(固定 2 周期延迟):桶式移位→分数增益乘法。
- **反馈环**(慢环,不阻塞数据流):αβ幅度估计→滑动平均→每窗口触发一次增益更新。
5 增益模型
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 关键算法
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)# 放大到目标
否则: 保持(死区)
7 模块划分
| 文件 | 作用 | 状态 |
| `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 算法验证 | 新 |
8 接口定义(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) | 调试:当前分数增益 |
9 集成到 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 |
夜雨聆风