FPGA学习笔记
我当初做SDR接收机时,在DDC和滤波器上踩过不少坑。先说NCO,相位累加器位宽决定了频率分辨率,一般取32位或48位,这样频率步进可以非常小。查找表精度(比如正弦波幅度位数)通常取12到16位,再高对性能提升有限但消耗大量BRAM。一个实用技巧是只存1/4周期正弦波,通过象限映射来节省存储。
滤波器是资源消耗大户。CIC滤波器结构简单,适合高倍率抽取,但通带不平坦,通常后面要跟一个补偿FIR。CIC的阶数和级联数决定了阻带衰减,但也会增加位宽扩展,内部数据位宽要仔细计算防止溢出。FIR滤波器的阶数取决于过渡带和带外抑制要求,可以用MATLAB的fdatool或Python的scipy.signal设计。系数位宽通常取16到18位定点,用对称结构可以节省一半乘法器。
建议先用MATLAB或Python仿真整个信号链,确定好参数后再写代码。Xilinx和Intel都有免费的DDC IP核(如DDS Compiler、FIR Compiler),可以研究它们的文档和参数配置,这是很好的学习材料。注意仿真时一定要用带量化的定点模型,才能反映真实的硬件性能。
