如何比对 FPGA 的,下面以一个同时使用传统 DSP 架构和 FPGA 架构的 FIR 滤波器实现方案为例,来说明每种架构的优劣。
实例:数字 FIR 滤波器
有限脉冲响应 (FIR) 滤波器是使用最广的数字信号处理元件之一。设计人员可用滤波器来改变数字信号的幅度或频谱,通常用于隔离或衰减样本数据频谱中的特定区域。从这个角度说,可以把滤波器视为信号的预处理方式。在典型的滤波器应用中,输入的数据样本通过精心同步的数学运算与滤波器系数相结合,不过这取决于滤波器的类型和实现策略,随后数据样本进入下一个处理阶段。如果数据源和终点都是模拟信号,则数据样本必须首先通过 A/D 转换器,结果则必须馈通给 D/A 转换器。
最简单的 FIR 滤波器的构造采用一系列延迟元件、乘法器和加法器树或加法器链来实现。
下面的等式是单通道 FIR 滤波器的数学表达式1:
该等式中的各项代表着输入样本、输出样本和系数。假设 S 为连续输入样本流,Y 为经滤波后产生的输出样本流,n 和 k 对应特定的瞬时时间。则如果要计算时间 n 时的输出样本 Y(n),需要在 N 各时间点的样本群组,即S(n)、S(n-1)、s(n-2)…s(n-N+1)。N 输入样本群组乘以 N系数,加总后得出最终结果 Y。
图 2 是一个简单的 31 抽头 FIR 滤波器(长度N=31)的方框图。
在选择滤波器的理想长度和系数值时,有多种设计工具可供使用。其目的是通过选择适当的参数来实现所需的滤波器性能。参数选择最常用的设计工具是 matlab®。一旦选定参数,就可以按照数学等式完成实现。
实现 FIR 滤波器的基本步骤包括:
1. 对输入的数据流采样
2. 在缓冲区组织输入样本,以便让每个采集到的样本与每项滤波器系数相乘
3. 让每个数据样本与每项系数相乘,并累加结果
4. 输出滤波结果。
使用“相乘累加法”在处理器上实现 FIR 滤波器的典型 C 语言程序,如下列代码所示:
/*
*采集输入的数据样本
*/
datasample = input();
/*
*将新数据样本导入缓冲器
*/
S[n] = datasample;
/*
*将每个数据样本与每项系数相乘并累加结果
*/
y = 0;
for (i = 0; i<n; i++)
{
y += k * S[(n + i) %N];
}
n = (n+1) %N;
/*
* 输出滤波结果
*/
output(y);
如果系统规范要求更高性能的 FIR 滤波器,则可采用并行结构来实现。图 5 显示了 Direct Form Type I 实现方案的方框图。
滤波器能够在 FPGA 中实现最高性能的设计。这种结构通常也称为收缩型 FIR 滤波器,它采用流水线和加法器链让 DSP48 Slice 发挥出最高性能。输入首先馈送到用作数据样本缓冲器的级联寄存器。每个寄存器随后向 DSP48 提供一个样本,随即乘以对应的系数。加法器链负责存储部分结果,然后顺序相加,得到最终结果。