Quick Start
本指南帮助你在国产FPGA平台上快速搭建一个实时语音降噪系统。以下步骤从零开始,涵盖硬件准备、工具链安装、工程创建、模块编写、综合实现与验证。
- 获取国产FPGA开发板,例如紫光同创Logos-2系列PGL22G开发板。确保板载音频编解码芯片(如WM8731或TLV320AIC23B),并具备麦克风/耳机接口。
- 安装PDS(PanGo Design Suite)2024.1及以上版本,并导入板级支持包(BSP)。
- 新建PDS工程,选择目标器件(如PGL22G-6BG256),添加顶层RTL文件与约束文件。
- 编写或导入I2C配置模块,初始化音频编解码芯片(采样率16kHz,16bit,单声道)。
- 实现一个简单的FIR低通滤波器(阶数64,截止频率4kHz),对麦克风采集的含噪语音进行滤波。
- 综合、实现并生成比特流,下载至FPGA,连接耳机,验证降噪效果(背景白噪声明显减弱,语音清晰度提升)。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | 紫光同创 Logos-2 PGL22G 开发板 | 板载音频编解码芯片与接口 | 安路 EG4S20、高云 GW2A-LV18 |
| EDA 版本 | PDS 2024.1(含 Synplify Pro 综合器) | 支持国产FPGA全流程 | Gowin YunGou IDE 1.9.9 |
| 仿真器 | ModelSim SE-64 2020.4(或 PDS 内置仿真器) | 用于功能仿真与时序验证 | Vivado Simulator(仅限 Xilinx 器件) |
| 时钟/复位 | 板载 50MHz 晶振,全局异步复位(低有效) | PLL 倍频至 100MHz 供核心逻辑 | 外部有源晶振 |
| 接口依赖 | I2S 音频总线(BCLK=256fs, LRCLK=fs, DATA 串行) | 与音频编解码芯片通信 | PDM 麦克风 + 抽取滤波器 |
| 约束文件 | SDC 时序约束(时钟周期 20ns,输入输出延迟 2ns) | 确保时序收敛 | PDS 物理约束(引脚分配) |
目标与验收标准
- 系统上电后自动初始化音频编解码芯片,无需手动干预。
- 麦克风采集含噪语音,经FPGA实时降噪后从耳机输出,延迟不超过10ms(满足实时通信要求)。
- 降噪效果:背景白噪声衰减≥15dB,语音清晰度(PESQ评分)提升≥0.5。
- 系统稳定运行24小时无异常,无音频中断或毛刺。
实施步骤
步骤1:硬件准备与连接
将麦克风插入开发板音频输入接口(Line-In或Mic-In),耳机插入音频输出接口(Headphone-Out)。确保板载跳线正确设置(如I2C地址选择、电源使能)。使用USB线连接开发板与PC,上电后检查电源指示灯。
步骤2:工具链安装与工程创建
安装PDS 2024.1,安装过程中选择包含Synplify Pro综合器与BSP。启动PDS,点击“New Project”,输入工程名(如“voice_denoise”),选择目标器件PGL22G-6BG256。添加顶层RTL文件(如top.v)与约束文件(如top.sdc)。
步骤3:编写I2C配置模块
音频编解码芯片(如WM8731)通过I2C总线配置寄存器。编写Verilog模块,实现I2C主控制器,按芯片数据手册写入初始化序列:采样率16kHz、16bit、单声道、使能麦克风输入与耳机输出。关键寄存器配置如下:
// I2C配置序列示例(WM8731)
// 寄存器地址0x00(左声道输入):0x0017(使能麦克风,增益0dB)
// 寄存器地址0x02(左声道耳机输出):0x0079(-6dB输出)
// 寄存器地址0x04(模拟路径控制):0x0010(使能DAC)
// 寄存器地址0x06(数字路径控制):0x0000(直通)
// 寄存器地址0x08(采样率控制):0x0002(16kHz,USB模式)
// 寄存器地址0x0A(激活接口):0x0001(激活)逐行说明
- 第1行:注释,说明这是WM8731的I2C配置序列示例。
- 第2行:配置左声道输入寄存器(地址0x00),值为0x0017,使能麦克风输入,增益设为0dB。
- 第3行:配置左声道耳机输出寄存器(地址0x02),值为0x0079,输出衰减-6dB。
- 第4行:配置模拟路径控制寄存器(地址0x04),值为0x0010,使能DAC路径。
- 第5行:配置数字路径控制寄存器(地址0x06),值为0x0000,设置为直通模式(不进行数字处理)。
- 第6行:配置采样率控制寄存器(地址0x08),值为0x0002,设置为16kHz采样率,USB模式。
- 第7行:配置激活接口寄存器(地址0x0A),值为0x0001,激活音频接口。
步骤4:实现FIR低通滤波器
使用Verilog编写64阶FIR低通滤波器,截止频率4kHz,采样率16kHz。滤波器系数通过MATLAB的fdatool生成(汉明窗,归一化)。实现采用直接型结构,使用移位寄存器与乘累加器。关键代码片段:
module fir_lpf #(
parameter ORDER = 64,
parameter DATA_WIDTH = 16,
parameter COEFF_WIDTH = 16
)(
input wire clk,
input wire rst_n,
input wire signed [DATA_WIDTH-1:0] data_in,
input wire valid_in,
output reg signed [DATA_WIDTH-1:0] data_out,
output reg valid_out
);
reg signed [DATA_WIDTH-1:0] shift_reg [0:ORDER-1];
reg signed [DATA_WIDTH+COEFF_WIDTH-1:0] mac;
integer i;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (i = 0; i < ORDER; i = i + 1)
shift_reg[i] <= 0;
mac <= 0;
data_out <= 0;
valid_out <= 0;
end else if (valid_in) begin
// 移位寄存器更新
for (i = ORDER-1; i > 0; i = i - 1)
shift_reg[i] <= shift_reg[i-1];
shift_reg[0] <= data_in;
// 乘累加
mac <= 0;
for (i = 0; i < ORDER; i = i + 1)
mac <= mac + shift_reg[i] * coeff[i];
data_out <= mac >>> COEFF_WIDTH;
valid_out <= 1;
end
end
endmodule逐行说明
- 第1行:模块声明,名称为fir_lpf,参数化阶数(ORDER=64)、数据位宽(DATA_WIDTH=16)、系数位宽(COEFF_WIDTH=16)。
- 第2行:端口声明开始,时钟clk、复位rst_n(低有效)。
- 第3行:输入数据data_in,有符号,位宽DATA_WIDTH。
- 第4行:输入有效标志valid_in,表示数据有效。
- 第5行:输出数据data_out,有符号,位宽DATA_WIDTH。
- 第6行:输出有效标志valid_out。
- 第8行:定义移位寄存器数组shift_reg,深度ORDER,每个元素位宽DATA_WIDTH。
- 第9行:定义乘累加器mac,位宽为DATA_WIDTH+COEFF_WIDTH,防止溢出。
- 第10行:循环变量i声明。
- 第12行:always块,敏感列表为时钟上升沿或复位下降沿。
- 第13行:复位条件,rst_n为低时执行。
- 第14-16行:复位操作,将移位寄存器、mac、data_out、valid_out清零。
- 第17行:非复位且valid_in有效时执行。
- 第18-20行:移位寄存器更新,从后向前移位,将新数据data_in存入shift_reg[0]。
- 第22-24行:乘累加操作,遍历所有阶数,将shift_reg[i]与对应系数coeff[i]相乘并累加。注意:coeff数组需在模块外部定义或作为参数传入。
- 第26行:输出数据为mac右移COEFF_WIDTH位(算术右移),恢复原始位宽。
- 第27行:valid_out置1,表示输出有效。
- 第30行:模块结束。
步骤5:顶层模块集成
在顶层模块top.v中例化I2C配置模块、FIR滤波器模块、以及I2S收发模块(用于与音频编解码芯片通信)。I2S收发模块负责将I2S串行数据转换为并行数据,并同步采样时钟。数据流:麦克风输入→I2S接收→FIR滤波器→I2S发送→耳机输出。顶层模块需包含PLL实例化,将50MHz时钟倍频至100MHz供核心逻辑使用。
步骤6:综合、实现与下载
在PDS中点击“Synthesize”进行综合,综合完成后查看资源利用率(LUT、FF、DSP48等)。然后点击“Implement”进行布局布线,检查时序报告,确保无时序违规。最后点击“Generate Bitstream”生成比特流文件。使用PDS的下载工具(或第三方工具如Flash Programmer)将比特流下载至FPGA。
验证结果
连接耳机后,播放含白噪声的语音文件(或使用真实麦克风采集环境噪声)。系统上电后,应能听到降噪后的语音,背景噪声明显减弱。使用示波器或逻辑分析仪抓取I2S数据总线,确认数据格式正确。使用音频分析软件(如Audacity)录制输出,对比输入信号,计算信噪比提升与PESQ评分。
排障
- 无声音输出:检查I2C配置是否正确,音频编解码芯片是否初始化成功;检查I2S时钟(BCLK、LRCLK)是否正常;检查耳机是否插入正确接口。
- 声音失真或噪声大:确认FIR滤波器系数是否计算正确;检查数据位宽是否匹配;检查时钟抖动是否过大,必要时添加时钟缓冲。
- 时序不收敛:在SDC约束文件中增加输入输出延迟约束;优化RTL代码,减少组合逻辑深度;考虑使用流水线结构。
- 下载失败:检查JTAG连接,确保驱动已安装;尝试降低下载速度;检查比特流文件是否完整。
扩展
- 自适应滤波器:将FIR滤波器替换为LMS自适应滤波器,实时更新系数,适应不同噪声环境。
- 多通道处理:扩展为双麦克风波束成形,提升定向降噪能力。
- 深度学习加速:在FPGA上部署轻量级神经网络(如DNN或RNN)进行语音增强,需使用DSP48与BRAM资源。
- 低功耗优化:使用门控时钟与动态电压调节,降低系统功耗,适用于便携设备。
参考
- 紫光同创Logos-2系列数据手册与用户指南
- WM8731音频编解码芯片数据手册
- PDS 2024.1用户手册(含Synplify Pro综合指南)
- MATLAB fdatool滤波器设计工具文档
- I2S总线规范(Philips半导体)
附录
附录A:FIR滤波器系数(64阶,汉明窗,截止频率4kHz,采样率16kHz)——可通过MATLAB脚本生成,此处略。附录B:I2C配置模块完整Verilog代码——见项目源码。附录C:PDS工程约束文件(top.sdc)示例——包含时钟周期约束与输入输出延迟约束。



