做数字信号处理,平时多在MATLAB或者C上跑,一旦要上高速、低延迟的场合,就轮到FPGA出场了。FPGA做DSP的本质,是把算法里的乘加运算变成一片片并行的硬件电路,用面积换速度。
第一件事是定点化。MATLAB里都是浮点,FPGA里做浮点运算资源消耗大,通常要转成定点。要确定每个信号的位宽和小数位,既要保证精度,又要控制资源。做法是先浮点仿真出结果,再逐级定点化对比误差,误差超标就加位宽。
结构上要考虑并行和流水。一个N阶FIR滤波器,串行结构只用一个乘法器分时复用,速度慢但省资源;全并行结构用N个乘法器同时算,一个时钟出一个结果,速度快但资源多;折叠结构介于两者之间。选哪种取决于采样率和器件规模。
FFT是另一个典型。基2的流水线结构把N点FFT拆成log2N级蝶形运算,每级之间加缓冲,吞吐率能做到每个时钟一个样点。实现时要处理旋转因子的存储、位反转、溢出和截位,这些细节没处理好,算出来的频谱全是错的。
时序是绕不过去的坎。代码写完要先做功能仿真,再跑综合看时序报告,建立时间和保持时间不满足就得加流水级或者降频。跨时钟域的信号要做同步处理,不然偶发的亚稳态会让系统跑几天才崩一次,极难排查。
验证方法建议软硬对照。用MATLAB生成激励和参考结果,导入仿真环境逐点比较,误差在允许范围内才算通过。上板之后再抓实际信号看,很多时候仿真对了板子不对,是接口时序或者时钟质量的问题。FPGA做DSP不难在算法,难在把这些工程细节都做扎实。
下一篇:没有了