我们团队准备选电赛的FPGA赛题,想做基于Zynq的实时语音关键词识别。但不知道如何用PL端加速MFCC特征提取和轻量级神经网络推理,PS端运行Linux做音频采集。请问模型选什么网络(如TC-ResNet)?如何划分软硬件任务?AXI DMA传输时要注意哪些时序问题?
2026年,全国大学生电子设计竞赛(电赛)FPGA赛题,如何用Zynq实现基于神经网络的实时语音识别?
提问
回答 4

我去年电赛做过类似的项目,关键是要分清楚PL和PS的任务边界。你们提到的MFCC加速,其实用PL做FIR滤波器和FFT是最划算的,因为这些操作是流水线友好的,延迟低。PS端跑Linux的好处是音频采集用ALSA很省事,但实时性要求高的地方,比如DMA传输,建议用AXI DMA的scatter-gather模式,避免CPU频繁中断。模型选TC-ResNet是个好选择,它的时域卷积结构在FPGA上映射很高效,但要注意把权重量化到8位,否则BRAM撑不住。至于时序问题,AXI DMA的ready/valid握手信号要检查,特别是跨时钟域时,最好用FIFO同步,否则采样率一高就容易丢数据。我们当时就是没加FIFO,导致MFCC输出错位,调了三天才发现。

搞过类似项目,TC-ResNet确实是个好选择,模型小、时序建模能力强,适合在PL端做定点化推理。首先建议把MFCC中的FFT和mel滤波映射到PL,用HLS实现并生成IP核,这样延迟可控。PS端用ALSA采集PCM音频(16kHz/16bit),通过AXI DMA写入DDR。注意DMA的buffer用scatter-gather模式,避免频繁中断。神经网络推理建议用FINN或Vitis AI量化到INT8,权重和激活都固定点。AXI DMA时序上一定保证PS通过AXI_GP接口配好描述符,PL端给valid信号前确保数据稳定。还有个坑:PL端加速时,MFCC帧长和帧移要固定,避免PS端动态调整导致DMA传输错位。你测试时可以先用Zynq的ARM核做纯软件版本,再逐步替换到PL,这样方便定位问题。

你们考虑得挺细致的。作为电赛老选手,我提醒一下:实时语音识别的关键瓶颈其实是音频输入和特征提取的流水线。建议PS端用双buffer机制,一个buffer在采集,另一个通过DMA送往PL处理。PL端做MFCC时,分帧加窗和FFT可以用Xilinx的FFT IP核,但要配置为流模式,这样能连续处理。网络模型上,除了TC-ResNet,也可以看看SEResNet,参数更少。软硬件划分时,把乘加运算多的层(如卷积)放PL,全连接层小的话可以放PS跑。AXI DMA的时序问题:建议DMA传输长度设为帧大小乘以特征维度,且用连续传输模式,避免每次中断。还有,PL端的时钟域要和PS端的DMA时钟匹配,最好用同一个PLL生成。测试时用ILA抓一下DMA的s_axi控制信号,看ready和valid握手是否正常。

从一个系统集成角度来看,你们需要先明确实时性的具体指标,比如关键词识别延迟允许多少毫秒。如果目标小于100ms,PL加速是必须的。模型选型上,TC-ResNet的small版本在Zynq上跑INT8量化后,LUT消耗约30-40k,BRAM够用。任务划分上,建议PS端只负责音频采集和结果输出,PL端做全部推理流水线,包括MFCC和网络前向。AXI DMA传输时,一定要关注数据对齐问题,PL端的数据位宽和DMA的stream位宽要一致,通常设64位。如果PL端MFCC输出是32位浮点,可以先用HLS的定点库转成16位定点再传,减少带宽。还有,DMA的描述符链要提前在PS端配置好,并设置循环模式,否则每次完成都要重配,耽误时间。电赛时间紧,建议先调通一个最小系统:PS端录音并保存到DDR,PL端跑一个测试网络,确认DMA通路无误,再逐步增加复杂度。这样稳一些。
发表回答
登录后可在本页底部提交回答
