在 FPGA 中转换音频采样率
2008-08-21
作者:Philipp Jacobsoh
如今,即使低成本 FPGA 也能提供远远大于 DSP 的计算能力。目前的 FPGA 具有专用乘法器" title="乘法器">乘法器甚至 DSP 乘累加 (MAC) 模块,能以 550 MHz 以上的时钟速度处理信号。
不过,直到现在,音频信号" title="音频信号">音频信号处理中还很少需要这些功能。串行实现千赫级音频算法使用的资源与三位数兆赫级信号处理所需的完全相同。
因此,像 PLD 和 FPGA 这类可编程逻辑元件很少用来处理低频信号。毕竟,与基于传统 DSP 的实现相比,在硬件中并行处理数学运算无益可言;对于如此低的采样率,大多数串行 DSP 实现都是绰绰有余。其实,音频应用所含乘法运算之多曾使其只能使用很大的 FPGA 实现。因此,用 DSP 实现低采样率音频应用曾经比使用大型 FPGA 更有效——成本较低,而且有成熟的软件支持。
近些时期,使用 Synplicity 公司推出的 Synplify DSP 综合工具,甚至可以将具有大量乘法运算和低采样率的算法有效地映射到 FPGA 中的专用 DSP 模块上。该工具基于 The MathWorks 推出的流行的 MATLAB 和 Simulink 工具。
算法是用专用模块集或专有的“M”脚本语言描述定义,然后转换成 RTL 硬件描述语言。该模块集可用于单速率和多速率实现。它不仅生成 VHDL 和 Verilog 代码,还可以处理定点量化、流水线和循环展开这类任务,并且能连接到 Simulink 开发环境中的模块集进行仿真(见图 1)。
应用示例:采样率转换
我们用音频采样率转换器作为示例。这种转换器可以将信号从一种采样率转换成另一种,对信号的影响极小。处理具有不同采样率的信号时需要这种转换器。
例如,光盘的采样率是 44.1 kHz,而数字音频磁带的采样率通常是 48 kHz。但当带有数据格式转换时,用新采样率播放源数据就不够了。以数字音频磁带使用的采样率播放光盘资料会引起失真。因此,必须对采样率加以转换。
处理音频信号使用的采样频率" title="采样频率">采样频率有多种,常见的有 44.1 kHz、48 kHz、96 kHz 和 192 kHz。转换过程必须慎重,务必保持 0-20 kHz 可听频率信号的完整性。应保持信号所含信息的变化尽量小,以免音质下降(图 2)。
无疑,实现音频采样率转换器存在FPGA实现有两个问题:
1. 算法问题:
a. 可能的最高信噪比
b. 原始信号所载信息的可能最小变化
c. 算法的有效描述,因为 FPGA 中的资源消耗在很大程度上取决于描述的质量
d. 量化
2. 实现问题:
a. 算法实现的逻辑正确性
b. FPGA 资源限制
c. 速度优化实现
d. 延迟
转换需要较高的时钟速度,因为实现要依靠所转换信号的足够过采样" title="过采样">过采样。FPGA 系统时钟频率与所转换信号频率之间的差异必须相对较大。
FDA 工具可帮助生成和验证各种 FIR 和 IIR 滤波器。该工具是 Simulink 的信号处理工具箱的组成部分,Synplify DSP 使用此工具箱实现滤波器结构
对于 CD 质量的音频信号,还要求信噪比不得低于 100 dB。专业应用甚至需要 >120 dB 的音频信号。就信号质量而言,其他低频信号(如控制电子算法)远不如音频信号那样苛刻。
算法
多相 FIR 滤波器结构转换采样率(异步重采样)。算法包括两步。第一步是频率过采样。第二步是线性插值,这是从给定频率生成不同频率时需要的。这两个频率相互异步。
以单步进行信号重采样所需资源较多,因为滤波器会较复杂。这种实现会造成数百万次乘法运算。这样的描述效率很低,应当避免。如果用第二步实现线性插值,所产生的结构就会简单得多(图 3)。
有效地描述过采样(第一步)是让 FPGA 实现节省资源的唯一方法。如果用若干级联" title="级联">级联级而非单一运算步骤来实现这部分电路,所需运算数量就会大大减少。
实现算法时,必须确定将执行运算的目标架构(DSP 或 FPGA)。与具有固定架构的数字信号处理器不同,FPGA 可实现任何架构。不过,当实现大量单独的乘法运算时,FPGA 最终会受到器件尺寸的限制。
所需乘法器的数量随着滤波器的 tap 增多而增大。每个 tap 都需要使用一个 DSP 模块或乘法器。当级联重采样级时,各滤波器必须执行复杂程度很低的功能。从理论上讲,单独的级越多,滤波器的实现就越好。
减少运算次数之方法的数学推导在技术文献中已有广泛论述。实践结果表明,尽管有必要级联滤波器的级,但必须对级联的级数加以限制。如果使用级联级数过多,就可能超过实现设计的可用资源。如果用 FPGA 作为目标架构,实践证明两个级最好。
整个电路由用于过采样的两个相对简单的滤波器和一个简单的线性插值器组成。这种结构可以有效地映射到 FPGA。
实现
可以在 Simulink 中用 Synplify DSP 模块集和 Simulink 的滤波器设计与分析 (FDA) 工具实现该电路。FDA 工具可帮助生成和验证各种 FIR 和 IIR 滤波器。该工具是 Simulink 的信号处理工具箱的组成部分,Synplify DSP 使用此工具箱实现滤波器结构。
Synplify DSP 模块集或 FDA 工具提供的所有电路元件(在 PortIN 和 PortOUT 描述之间定义)都能生成 VHDL 或 Verilog 代码。Simulink 模块集中的 FFT 和 SCOPE 元件对动态响应进行频谱分析和验证。这些模块专门用于功能验证,包括浮点到定点转换的效果(量化)。这些模块不在硬件中实现。
算法实现的第一部分包括两个 FIR 滤波器:第一个滤波器有 512 个 tap,第二个滤波器有 64 个 tap。因此,由过采样生成的 RTL 代码共含有 576 个乘法运算,这正是使用 FPGA 显得并不具有商业可行性的原因。这么大的 FPGA 需要具有 640 个 DSP48 模块的特大 Xilinx? Virtex?-5 XC5VSX95T 器件,因此会受到成本制约。
未映射到专用硬件结构(DSP 模块)的所有乘法运算都必须用通用逻辑资源(LUT 或寄存器)构建。这样会导致资源要求上升而最高时钟速度下降。与通用逻辑单元相比,专用的 DSP48 模块作为乘法器会有效得多(图 4)。
优化
Synplify DSP 的折叠选项可用来尽量减少所用乘法器的数量。在低采样频率下工作的电路尤其可从这一优化中受益。
其原理很简单。通常,每个乘法运算使用一个硬件乘法器,即使对于千赫级采样频率也是如此。然而,FPGA 能以三位数兆赫级的时钟速度工作。如果硬件乘法器在 FPGA 的系统频率下工作,就可以用时间多路复用过程按时序处理乘法运算。
假设电路的采样频率是 3 MHz,而 FPGA 最高可以在 120 MHz 频率下运行。如果以系统频率运行乘法器,则每个硬件乘法器可以执行 40 个运算。因而所需硬件可以减少到 40 分之一。也就是说可以将上述采样率转换器(或使用低采样频率的任何其他电路)“折叠”到仅需要很少硬件乘法器的程度。所以,也可以在现有最小的低成本 FPGA 中实现这种转换器,从而真正取代 DSP。
当然,还可能将计算特别密集的算法从 DSP 卸载到 FPGA,从而减轻处理器的负荷。如果您的 DSP 应用已经超过性能极限,而且您已经为针对特定 DSP 架构的应用源代码作出重大投入,那么这种方法尤其有用(图 5)。
因为 Synplify DSP 中的折叠功能还支持多速率系统,所以,与只有一种采样频率的系统相比,您可以进一步减少所需乘法器的数量。过采样使用两个 FIR 滤波器完成。这两个滤波器以不同的采样频率运行。以较高采样频率运行的滤波器用您指定的折叠系数折叠。
以较低采样频率运行的滤波器用相对较高的系数折叠。获得此系数的方法是用两个滤波器的采样频率之比乘以折叠系数。例如,如果一个滤波器的采样频率是另一滤波器的 8 倍,则较快的滤波器用系数 8 折叠,而较慢的滤波器用系数 64 折叠。
这样甚至可能生成以通常不能折叠的很高的采样率运行的空间优化电路。例如,如果系统以 200 MHz 采样率运行并使用折叠系数 2,那么系统频率就可以提高到 400 MHz。
您还可以将折叠系数定义为 1。以最高采样率运行的电路元件不折叠。但是,以较低采样频率运行的多速率系统的所有电路元件都可从折叠和空间优化实现中受益。您只需将系统作为整体为其定义折叠系数即可。然后,折叠会自动传播到所有采样频率。
可以把折叠功能与另一优化功能结合起来,这就是重定时功能。如果系统不满足目标频率要求,就可以增加流水线级数,直到获得所需速率。这种做法对于使用高折叠系数的电路尤为重要,这类电路需要以相对较高的系统速度工作。
您还可以为折叠很少或没有折叠的电路使用重定时,除非已经达到 FPGA 的性能极限。可以通过增加流水线级数来减少两个寄存器之间的组合逻辑门的数量(逻辑级数),这样可以提高系统时钟速度。
在生成 RTL 代码时,Synplify DSP 工具进行时序分析,其中要考虑所需的采样频率、折叠系数和 FPGA 的目标架构。例如,与在较慢的低成本 Spartan-3A DSP FPGA 中实现的完全相同的电路相比,可以使用较少的流水线级数优化映射到快速 Virtex-5 FPGA 的电路。
可以用 FPGA 提供的大量寄存器进行这种优化。寄存器可以大量使用,不像乘法器或 LUT(查找表)那样可以很快用光,这意味着可以使用寄存器轻而易举的显著提高系统时钟速度。
当然,增加流水线级数会增加系统延迟。例如,如果使用重定时系数 8,计算结果就会晚八个系统时钟周期(不是采样频率周期)出现在 FPGA 的输出上。向系统中嵌入电路时必须考虑到这一点(图 6)。
特别重要的是,务必确保上述优化不会影响 Simulink 中描述的原始 MATLAB 模型。通过验证可以对算法进行鉴定,并且对量化效应的影响予以表述。Synplify DSP 软件模块集允许使用截断(去除无关位)、圆整(在下溢情况下)或饱和(在上溢情况下)进行从浮点到定点的转换。一旦仿真显示算法工作正常,即可生成 RTL 代码。优化 VHDL 或 Verilog 代码可能改变延迟,但不会改变电路的操作。
结论
Synplify DSP 工具基于 The MathWorks 推出的行业标准 MATLAB/Simulink 软件。模块集提供的标准元件库可用于实现复杂算法。除了加法、增益和延迟等基本元件,该库还包含 FIR 或 IIR 滤波器等许多复杂功能和 CORDIC 算法。所有功能(包括高度复杂的 FFT 或 Viterbi 解码器)均可任意参数化。还可以创建用户定义库,或者将现有的 VHDL 或 Verilog 代码集成到 Simulink 模型中。
用 Synplify DSP 可以实现单速率和多速率系统。使用折叠、多通道化或重定时功能可以针对尺寸或速度优化代码。生成的 RTL 代码都是未加密的通用代码,可以使用常用工具综合。
为了取得 FPGA 的最佳结果,Synplicity 推荐使用其 Synplify Pro 综合工具。现在还可以使用该开发环境的 ASIC 变量。