摘 要:开发基于硬件描述语言的MP3解码器,首要的问题是要搭建一个能被很好地掌握控制的仿真平台。仿真平台包括仿真输入平台和仿真输出平台。在仿真输入平台中,构造了2个模块,一个是用来存储MP3音频文件的ROM模块,另一个是控制器模块,其功能是把ROM中的数据以串行数据流的方式送到解码器模块中去。其中,在构造ROM模块时,采用了IP Core 重用。
关键词:硬件描述语言;MP3解码器;仿真平台;IP Core的重用
用FPGA来实现对MP3音频格式数据的硬件解码,需要用硬件描述语言(VHDL或VerilogHDL)编写源程序。解码的目的是把串行输入的MP3音频数据流解码成PCM数据,然后串行输出。由于项目比较庞大,解码的过程比较长,如何搭建一个能够被很好地掌握控制的仿真平台,是一个关键的问题。对基于硬件描述语言的MP3解码器进行仿真,需要考虑到以下3个问题:
(1)如何把一个MP3音频格式的文件输入到设计模块中去。
(2)如何观察解码的中间结果,甚至是以可以观察的文本文件的格式输出并保存解码的中间结果。
(3)如何输出解码后的数据以及如何验证如此庞大数据是正确的。
如果只考虑上面的第一点,而忽略了后两点,直接将设计下载到FPGA芯片中去开始解码,那么一旦解码输出的结果不正确,将会不知所措。
1仿真平台的搭建
1.1输入平台的搭建
目的是把MP3音频格式的文件以二进制串行数据流的方式在系统时钟(clk)的节拍下送入 到设计模块中去进行解码。MP3文件是存储在存储介质中的,例如闪存或者PC的硬盘中。在进行硬件解码的时候,需要把音频文件以二进制(即“0”,“1”)的方式送入解码器模块,遗憾的是硬件描述语言无论是VHDL还是VerilogHDL都不支持以二进制的形式读入存储在硬盘上的MP3文件,只支持以文本文件(ASCII码)的形式读入,所以在搭建输入平台的时候,有2种方案可以选择:
(1)需要其他高级语言(例如Matlab语言或C语言)来做中间的数据格式的转换,把一个MP3音频文件以二进制的形式打开,再把原数据以ASCII码的形式写成文本文件并保存到PC的硬盘中,以至用硬件描述语言编写的模块能够将其读入。
(2)用硬件描述语言编写一个控制模块和一个ROM模块,如图1所示。把MP3音频文件固化在 ROM模块中,控制模块在系统时钟的节拍下,把ROM中的数据以串行的比特流方式送入解码器模块。
通过运行仿真,进行实际的比较,第一个方案比较耗费PC的资源,在相同的条件下,选用两个方案进行仿真,耗时比较短。
1.1.1ROM IP Core的重用
EDA软件ActiveHDL在其5.1以上的版本中加入了 “IP Core Generator”功能,使IP Core 的重用变得更加方便。在ActiveHDL 5.1版的“IP Core Generator” 的功能项里选择产生一个ROM模块,Data Width选择1 b宽,Address Width选择“auto”,激活“Use all bits”选项并且关闭“Read file as hex”选项,然后把要固化到ROM中的二进制文件指向待解码的MP3音频文件。最后就可以产生一个ROM的模块,此ROM中已经固化好了MP3音频文件。
1.1.2编写控制模块
此模块包括一个时钟输入信号,一个复位清零输出信号和一个地址输出信号。首先输出一 个复位清零信号到MP3的解码器模块中去,使解码器复位清零。然后在每个时钟的上升沿输出一个地址信号,送到ROM模块中去,ROM模块的bitstream输出端口就会以串行比特流的形式输出存储在其中的MP3音频数据了。控制模块的

1.2输出平台的搭建
目的是把解码模块输出的结果(PCM数据)以二进制的形式写到名为outputPCM的PCM音 频文件中去。同样由于硬件描述语言不支持以二进制的形式读入或输出文件,只支持以文本(ASCII码)文件的形式读入或输出PC硬盘上的文件,所以也需要使用Matlab语言来做中间的格式转换。之后就可以使用音频播放工具(例如“Cool Edit”)播放解码后的PCM音频文件,并且可以观察其波形,若和解码前的MP3文件一致,则说明解码正确。若解码不正确,也可以把解码过程中的某一步的结果用VerilogHDL以ASCII码的形式写到文本文件中去查看。
1.2.1解码结果的文本文件输出
在系统时钟的节拍下,把解码的输出结果(PCM数据)输出到一个文本文件中去,命名为o utput.TXT,
产生的outputTXT文本文件(即ASCII码文件)内,每一行只有一个二进制数,此数值就是每个时钟输出的PCM音频流中的数据。由于PCM音频文件的数据量比较大,所以output.TXT 文件内,行的数量比较多。到这一步,由于此时的输出是文本(ASCII码)形式的,所以可以用文本编辑软件打开此文本文件,观察并校对输出结果。
1.2.2输出结果的二进制转换
用Matlab读入这个已经存好PCM数据的文本文件outputTXT,并把他存储成一个N×1的矩阵D。命令为“D=dlmread(′outputTXT′′\t′); ”。D内的每一个元素都是二进制数“0”或“1”。由于Matlab语言在写二进制文件 时是以8个二进制数为一个单位写入的,所以要把这个矩阵D进行转换,每 8个元素为一个单位,转换成十进制数,再把这个十进制数存储成新矩阵E的一个元素,最后再把矩阵E求转置得到1×N的矩阵F。那么F=[ 0 0 0 255 251 ……],再以二进制的方式把矩阵F写入到文件output PC M中去,代码如下:

这个output.PCM文件就是PCM格式的音频文件,用播放工具就可以播放验证了。
若使用“Co ol Edit”软件,还可以观察并比较MP3源文件和解码后的PCM文件的波形,如图2所示。


2结语
通过实际地运行,此仿真平台很好地达到了监视解码器模块运行的目的。解码器的最后输 出结果也可以在PC中用播放工具实际播放验证。其中利用IP Core重用的方法构造的ROM模 块也能很好地运行,另外此ROM模块经过实际验证,是可以被综合的,在被解码的MP3文件 不是很大的情况下,综合的器件选择Xilinx公司的Spartan S10PC84。综合后的结果如图3所 示。
参考文献
[1]Bhasker JVerilog HDL硬件描述语言[M].徐振林译北京:机械工业出版社,2002.
[2]Hanselman D, Littlefield B. 精通Matlab 6[M]. 张航,黄攀,译.北京:清华大学出版社,2002.
[3]张兆礼,赵春晖,梅晓丹.现代图像处理技术及Matlab实现[M].北京:人民邮电出版社,2001.
[4]夏宇闻.复杂数字电路与系统的Verilog HDL设计技术[M].北京:北京航空航天大学出版社,1998.