LabVIEW FPGA高级篇:实验73-通用FPGA上利用LabVIEW DFDT实现DSD音频解码器

1、概述
本节实验向大家展示了如何使用LabVIEW数字滤波器设计工具包(DFDT)在通用FPGA平台(比如黑金的Spartan6、Artix7、Kintex7)上实现直接比特流数字解码DSD音频解码器
2、简介
Super Audio CD® (SACD)是由索尼和飞利浦开发的高分辨率CD音频格式,SACD使用Direct Stream Digital® (DSD)技术对音频信号进行过采样并将它们存储为 delta-sigma调制的数字音频。DSD的采样率为2.82MHz,是CD音频采样率44.1kHz的64倍。由于采样率高,DSD信号相比于普通CD可以更准确地还原出原始模拟信号。
要检索音频信号,DSD解码器先通过低通滤波,然后对DSD流进行1/64抽取。我们可以使用LabVIEW数字滤波器设计工具包(DFDT)在市面上能买到或者自己做的通用FPGA板子(例如,黑金的Spartan6、A7、K7开发板)上实现DSD解码器。
DSD解码器从数字输入 (DI)端口获取原始DSD信号,然后抽取信号,最后将提取出来的音频信号通过USB或者千兆以太网或者PCIe发送到主机PC进行播放、存储、流盘,或者直接通过AO模块进行模拟输出。下面的图1显示了整个操作过程。

由于DSD解码需要处理不同的采样率,因此我们必须要为DSD解码器设计多速率滤波器。NI给我们提供了一个功能超级强大的滤波器设计工具包,简称DFDT。早在本《LabVIEW FPGA开发宝典》前面的第30个实验里面已经给用户讲解过了如何使用DFDT设计并生成一个可以在FPGA里面编译运行的带通滤波器。
但是本节实验显然要比实验30复杂的多,我们需要在FPGA芯片里面实现多级多速率滤波器才行。好在有了DFDT工具包,我们可以使用Multirate FIR Design Express VI 或Multistage Multirate Filter Design Express VI以交互方式设计多速率滤波器。 但是,由于DSD解码器的抽取因子为64,非常大,因此单级多速率FIR滤波器需要大量抽头才能满足频率响应的要求。在这种情况下,滤波器可能无法以DSD要求的2.82 MHz输入数据速率来实时逐点处理数据。关于抽取滤波器可以处理的输入数据速率与滤波器所需的FIR抽头数量之间的关系,可以参考下面不等式:

如果将DSD解码器设计为单级多速率滤波器,则抽头数会变得很大,以至于无法满足上面的不等式。因此,我们必须为DSD解码器设计一个多级多速率滤波器。这种情况下,用户只能使用“多级多速率滤波器设计快速VI”通过交互式来设计DSD滤波器。
提醒:要完成本节实验提出的需求,需要安装LabVIEW FPGA工具包和DFDT数字滤波器设计工具包。
3、设计多级多速率滤波器
首先在LabVIEW上位机里面,将Multistage Multirate Filter Design Express VI拖拽到程序框图上,然后会自动弹出如下图2显示的多级多速率滤波器参数配置对话框。接着,在Floating-Point Design选项页里面设置好所需的参数后,不要关闭,让对话框保持打开状态。

4、将浮点滤波器转换为定点滤波器
要想直接在FPGA芯片里面实现滤波器,我们还需要将浮点型滤波器转换为定点型滤波器。完成以下两个步骤,可以将前面我们创建的浮点滤波器转换为定点滤波器。
1)对不同字长的滤波器系数进行量化,直到频率响应满足DSD要求。我们可以通过在Fixed-Point Quantization选项页里面指定Coefficients word lengths、Coefficients scale type和Gain word length来量化滤波器系数,如图3所示。

2)单击“确定”关闭配置对话框。接着完成以下5步以使用DFD FXP NStage Mrate Modeling VI为滤波器指定其他所需参数:
1-将DFD FXP NStage Mrate Modeling VI放在程序框图上
2-右键单击输入字长input并选择Create»Control
3-对输出字长和级间字长输入重复步骤 2
4-指定输入字长、输出字长和级间字长
5-将前面“多级多速率滤波器设计快速VI”的“多速率滤波器”端口输出连接到DFD FXP NStage Mrate Modeling VI对应的输入端口。
完成后的LabVIEW程序框图,如图4所示:

5、先在上位机PC上验证定点滤波器的数值精度
在生成FPGA可以直接编译运行的滤波器代码之前,我们还需要验证一下我们设计的这个多级多速率滤波器的数值精度。大家可以使用DFD FXP NStage MRate Simulation VI在PC上模拟验证该滤波器。完成以下4步可以验证前面我们设计创建的滤波器性能是否满足设计指标:
1-将DFD FXP NSStage MRate Simulation VI放置在程序框图上
2-再把多速率滤波器DFD FXP NStage Mrate Modeling VI的输出连到多速率滤波器DFD FXP NStage MRate Simulation VI的输入
3-将DSD信号连接到该VI的输入信号
4-运行VI
我们可以将模拟的FXP定点滤波器数值精度与参考浮点滤波器的数值精度进行比较。
6、 生成LabVIEW FPGA代码
如果前面模拟的定点滤波器的数值精度满足 DSD音频解压码要求,可以使用DFD FXP NStage MRate Code Generator VI将前面创建好的滤波器生成LabVIEW FPGA代码。完成以下4步即可生成定点类型的多级多速率滤波器对应的LabVIEW FPGA代码。
1-将DFD FXP NStage MRate代码生成器VI放在程序框图上;
2-指定#channels、目标文件夹路径和滤波器控件名称;
3-将多速率滤波器DFD FXP NStage Mrate Modeling VI的输出连到DFD FXP NStage MRate代码发生器VI的输入,程序框图如图5所示;
4-运行VI,即可在目标路径文件夹中生成LabVIEW FPGA滤波器。

通过将DFD FXP NStage MRate 代码生成器VI输出的“采样频率/FPGA时钟”数值乘以滤波器运行的FPGA时钟频率,可以得到 FPGA滤波器每个通道最大可接受的采样频率。
用户可以通过在项目浏览器窗口右键单击FPGA目标并选择Properties»Top-Level Clock来查看滤波器运行的FPGA时钟速率。如果FPGA滤波器每个通道的最大可接受采样频率未达到DSD要求的2.82MHz,则返回到前面的多级多速率滤波器设计部分以增加滤波级数。
实际上,如果我们按照前面将#channels控件值设置为1,那么生成的滤波器可以以5MHz的采样率来处理DSD输入的数字信号,完全满足了FPGA芯片对 DSD的最低要求。
注意:上面图5里面有一个模拟生成DSD信号的仿真VI,这个VI可以将实际的模拟电压信号经过Delta-sigma编码转成PDM密度信号,如图6所示。今后如果有客户需要用到Delta-sigma编码和PDM转换,可以参考本节实验里面的这个VI,如图7所示。


7、 在 FPGA 目标上实现 DSD 解码器
将前面生成出来的 LabVIEW FPGA滤波器模块拖放到通用的FPGA开发板项目终端下,比如本节实验里面我们采用黑金超高性价比的Spartan6开发板,如图7所示。

注意:LabVIEW FPGA项目中的滤波器模块包含两个FIFO。输入FIFO为“DSD_DataIn”,输出FIFO为“DSD_DataOut”。另外,这个过滤器模块包含了3个滤波器VI,这就是我们在前面设计的多级多速率滤波器中的3个重要组成部分,如图8所示。

图8所示的FPGA DSD完整版程序框图,一共包含3部分代码:利用FPGA DIO引脚读取DSD信号到“输入FIFO”定时循环;过滤和抽取DSD信号的3级滤波器VI线程;将解码后的DSD音频信号经过“输出FIFO”再通过千兆以太网FIFO传输到上位机。
最后我们给出下位机FPGA完整版的DSD解码器程序框图,如图9所示。

8、结论
本节实验给大家演示了如何使用LabVIEW数字滤波器设计工具包DFDT在通用的FPGA平台上(不一定是NI硬件,也可以是网上通用的FPGA开发板)实现的DSD实时逐点硬件解码器。
LabVIEW、数字滤波器设计工具包和通用FPGA硬件之间的无缝集成,使它们成为一个更加通用的软硬件结合的FPGA嵌入式开发平台,为用户今后在设计和验证复杂的FPGA滤波器时节省大量的时间和硬件成本。