我们团队用安路FPGA做AI语音识别,MFCC特征提取模块占用了大量DSP,导致后面DNN推理的DSP不够了。想尝试时分复用让一个DSP处理多个乘法,但时序老是跑不过。有没有具体的流水线重排策略或者资源分时复用方案,能平衡MFCC和DNN的资源需求?
2026年FPGA大赛做实时AI语音识别,MFCC特征提取硬件化时DSP资源不够用,怎么通过时分复用和流水线重排优化?求具体方案
提问
回答 5

MFCC里那个滤波器组计算,其实是典型的乘累加,用状态机控制地址轮询,一个DSP分8个周期做完一组滤波器,流水线插两拍寄存器切断长路径,时序就能过。DNN那边的权重,小于2的幂次用移位代替乘法,省下来的DSP全给MFCC用。你们安路芯片的DSP结构是18×18还是27×18?这个会影响分时复用的粒度。

其实你这个问题核心是MFCC的滤波器组和DNN推理在争DSP,但两者对乘法精度的要求不一样。滤波器组需要高精度累加,容易跑出长关键路径;DNN那边激活值已经量化为int8了,很多乘法可以用移位加法替代。我的建议是:先拿掉DNN里所有2的幂次权重乘法,剩下的非幂次权重用CSD编码压缩到最多4个非零位,这样每个乘法变成至多4次移位加。省下的DSP全留给MFCC,然后MFCC那边做两阶段流水——第一级是滤波器系数乘输入,第二级是累加,中间插一级寄存器。这样流水深度从1变2,时序压力小很多,一个DSP可以分时处理4路乘法。你们安路具体型号是哪个?不同系列DSP的输入延迟不同。

先别急着上时分复用,你们得先确认MFCC里哪些乘法是真正跑在关键路径上的。很多团队一上来就把所有乘法都塞给DSP,其实MFCC里那个预加重滤波和加窗操作,用移位加就能搞定,根本不用DSP。滤波器组的三角滤波器计算,每个频带也就几个乘累加,用状态机控制读ROM里的系数,一个DSP做4个频带的分时复用,流水线切成三拍:第一拍读系数和输入,第二拍乘法,第三拍累加回写。关键是累加那步不要用DSP的级联功能,自己用寄存器搭累加器,这样DSP只做乘法,时序能到200MHz以上。DNN那边更简单,你们如果是8bit量化,把权重做成两个4bit的查表乘法器,用LUT代替DSP,虽然会多占几百个LUT但资源够的话很划算。不过有个风险要注意:安路的LUT结构是6输入还是4输入?如果是4输入,查表乘法器面积会翻倍。另外MFCC输出帧率和DNN推理帧率不一定要一致,你们可以在MFCC和DNN之间加一个FIFO做异步处理,MFCC用一个DSP拼命算,DNN那边慢慢从FIFO取数据推理,这样DSP占用率反而能降下来。如果你们现在时序跑不过,八成是MFCC的累加路径太长,试试把累加拆成两个周期:先算低16位,再算高16位,最终合并。你们当前MFCC模块的时钟频率设的多少?安路FPGA的PLL输出范围有限制,有时候降频反而能腾出余量做更多分时复用。

先抓主要矛盾:MFCC里最占DSP的不是预加重和加窗,而是那几十个三角滤波器的乘累加。我踩过差不多的坑,做法是把每个三角滤波器的乘累加拆成4拍,用一个DSP轮流算,中间插三级寄存器做流水线缓冲,这样DSP的乘法器利用率从12.5%提到50%,时序能从120MHz拉到180MHz。DNN那边如果权重已经量化到8bit,非2的幂次权重用CSD编码转成移位加,基本不用DSP。你们安路具体是哪个系列?不同系列的DSP硬核级联延迟不一样,方案要微调。

我的思路和楼上不太一样。先别急着复用DSP,看看DNN那边能不能用LUT替代大部分乘法。你们如果是8bit量化,把权重拆成高4bit和低4bit,用两个4输入LUT做查表乘法,面积大概多800个LUT,但能省下四五个DSP。省下来的DSP全给MFCC做滤波器组,每个滤波器组计算分成4个周期,用状态机控制地址轮询,一个DSP处理8个滤波器,流水线切三拍:第一拍读ROM系数和FIFO输入,第二拍做乘法,第三拍累加。累加器用寄存器自己搭,别用DSP自带的级联链,那个在安路上容易引入额外延迟。时序卡在150MHz左右就没问题。不过要小心:如果你们的MFCC帧长是512点,每帧有40个滤波器,每个滤波器20个乘累加,总计算量其实不大,关键是控制好ROM读取的节拍别浪费空泡。你们现在DSP具体缺几个?缺得少的话,还可以考虑把MFCC的汉明窗系数预先存成定点常量,用移位加算窗函数,开窗阶段能再省一个DSP。
发表回答
登录后可在本页底部提交回答
