Verilog学习ing
这个问题我去年做吉他效果器时也纠结过。我的经验是,先别追求理论上的‘最优’,快速搭个可调的原型最重要。
定点精度方面,对于24bit音频,我建议从Q2.30格式开始试(2位整数,30位小数,总共32位)。这样动态范围足够,大部分中间运算结果用48位(比如36.12)来存,最后再截断回32位输出。关键是要在Simulink或Python里建个定点模型,灌一段大动态的音频(比如从无声到爆音)去仿真,看累加器会不会溢出。溢出就加保护位。
资源消耗上,FIR用对称结构省一半乘法器,IIR注意把直接型转成级联型,稳定性好,字长增长也慢。Xilinx的LogiCORE FIR Compiler其实挺好用,可以选定点系数,还能生成AXI4-Stream接口,方便后面接。
实时性反而不是大问题,96kHz对于FPGA来说很轻松。关键是设计好流水线,乘加运算拆开,保证时序能跑高主频。
参数调节,我用的笨办法:FPGA上实现几个带握手的寄存器,通过UART接个单片机,单片机读旋钮编码器或者MIDI,再写寄存器。开源的话,可以看看OpenCores的I2C或SPI控制器,改改就能用。
最后提醒个坑:系数量化后一定要重新算频率响应,有时候极点跑到单位圆外,滤波器就震荡了。先仿真,再上板,能省好多调试时间。
