当前位置:首页 > 心得体会 > MP3解码板 [基于PowerPC405的MP3实时解码系统设计与实现]
 

MP3解码板 [基于PowerPC405的MP3实时解码系统设计与实现]

发布时间:2019-02-16 04:43:08 影响了:

  摘要:文章介绍了一种在FPGA上用PowerPC405实现MP3实时解码SoC系统的方法。通过使用IP核搭建SoC硬件结构,并进行定点MP3解码软件算法移植,完成软硬件协同设计和验证,实现MP3音乐实时、高品质的解码播放。
  关键字:MP3、解码、FPGA、PoleStar
  
  1引言
  
   随着半导体加工工艺和设计技术的飞速发展,越来越多的系统功能可以集成到一个单芯片(System-on-a chip,SoC)中,加快了不同学科间的交叉融合,使得半导体、电子工程、计算机、自动化、软件工程、通信工程等相关人士均需要学习SoC的相关知识。
  工业和信息化部软件与集成电路促进中心(CSIP)作为软件与集成电路产业促进机构, 从促进产业发展、培育创新人才的角度出发,联合国内外知名企业,开发了PoleStar(北极星)综合教学实验平台和配套《SoC系统设计与实践》教程,将业界正在使用的技术和方法转化为适合高校、教育培训机构使用的教程案例,实现高校所学知识与企业所用技术之间的无缝链接,加速我国人才培育培养,助力我国信息产业做大做强。
  基于PowerPC405的MP3实时解码系统设计与实现是《SoC系统设计与实践》中的一个高级章节,比较全面的介绍了SoC系统架构设计流程和软硬件协同设计方法。
  
  2SoC平台硬件架构设计
  
  在MP3播放系统实现中,无论硬件架构还是软件优化,目标都是要提高系统的MP3解码及播放能力。其中硬件为解码软件提供平台,软件针对硬件平台特性,实现软件最优效率。
  本系统针对MP3解码工作的特性,不同于其它控制类SOC,它需要有很强的运算处理能力。而我们搭建硬件平台的基础还是要看能否达到MP3解码算法的需要。基于以上想法,我们构建的硬件系统需要有较强的乘法运算性能以及高速的内存访问性能。 乘法运算需求:处理器必须要有硬件实现的乘法单元,能够在短时间里完成乘法运算。另外,处理器最好带有额外乘法加速单元,也就是乘加运算单元 。内存访问的需求:为了保证高速的内存访问,系统需要有先进的缓存系统、高效的总线系统以及高速的内存接口控制器,以保证数据能够被高速地读取。
  本系统硬件SoC总线采用PLB高速和OPB低速双总线架构,并配置必要的存储器和外设接口,中断控制器采用基于OPB总线的中断控制器,主要实现AC97播放缓存的半满中断响应。音频接口选用基于OPB总线的AC97接口,用于同PCB板级的音频编译码器(Audio Codec)进行音频数据传输,进而实现音频数据的数字和模拟形态的转化,使人听到悦耳动听的音乐。图1为本系统的SoC硬件架构图。考虑到软件解码时,会占用大量的CPU资源,如果CPU在解码的同时,进行数据搬运并发送给音频编译码器(Audio Codec),势必会影响解码的效率,有可能会导致MP3解码和音频播放不连续。本系统采用DMA模块自动进行数据搬运,即在CPU控制下,由AC97发出中断,启动DMA,在不占用CPU资源的情况下,由DMA完成数据搬运工作。在播放音乐时,对AC97接口来说,DMA主要是对AC97 IP核内部的FIFO进行操作,将要播放的音频原始PCM数据压到AC97的播放缓存中。
  
  3MP3音频解压缩
  
  MP3编码的主要方法是在频域上对音频文件内容进行编码压缩,而解码过程是还原频域的内容再变换成原始的时域音频信号。MP3的解码总体上可分为8个过程:比特流分解、霍夫曼解码、反量化处理、频谱重排列、联合立体声处理、IMDCT变换、子带合成、PCM码输出,如图2所示。
   MP3解码算法己经有比较成熟的浮点算法实现,在X86体系结构的CPU体系结构中,使用居多。通常对于嵌入式CPU来说,如果没有浮点处理器,可以考虑把浮点运算转化为定点运算将提高运行效率。由于PowerPC405处理器没有浮点协处理器,PowerPC405每运行一次浮点计算,编译器将转化为一次浮点函数库的调用,由于MP3解码中霍夫曼解码、反量化、IMDCT、子带合成过程将使用大量浮点运算,这是一个非常消耗时间的过程,极大的影响解码效率。通过把浮点运算转化为定点运算,同时在不影响精度的情况下,并能有效缩短代码长度,使用定点运算将大幅提高PowerPC405运算效率,同时缩短解码时间。为此我们可以使用定点算法,用定点数表示浮点数,用定点算法代替浮点运算。
   图3是一张PowerPC405处理器在对同样算法复杂度任务的软件运行时间的一个统计图,对于同样的运算,采用浮点和定点实现的效率有着一个数量级的差别,如果对定点进行算法优化的话,还将有一个数量级的提高。
  浮点小数是数的一种表示方法,由于小数点的位置是变动的,系统要储存小数点的位置,顾名思义,定点小数就是小数点的位置不变的。用整数来表示定点小数,由于小数点的位置是固定的,所以就没有必要储存它,既然没有储存小数点的位置,那么CPU硬件就不知道小数点的位置,所以这个小数点的位置是软件设计人员自己需要牢记的。
  MP3解码过程中的数值计算主要采用定点算法来代替原浮点算法,使用经过处理的定点数代替原浮点数参与运算。将浮点数扩大2N倍并取整就是对应的定点数,其中不同过程中浮点数的取值范围不同,则N的取值也不同。N取较大值,则定点数的表示精度高,但是表示的浮点数范围较小;N取较小值,则定点数表示的浮点数范围比较大,但精度较低。因此可以根据具体的运算情况针对不同过程分别取N值。为运算方便,本设计中的N值为定值12。
  MP3解码算法中,反量化过程需要处理指数和乘方运算,IMDCT变换则需要余弦函数运算,而这几种运算使用定点算法实时计算处理比较复杂,精度也较低。可以先计算指数函数表、乘方表和余弦函数表,并存为常量数组在程序中调用。实际计算时直接查表,如果不在表中的,则利用线性插值的方法求出计算结果。
  针对MP3解码的软件设计,除了上面讲到的通过定点算法优化的方法,在软件具体的设计过程中,优化的另一种途径是针对平台特定的硬件结构,设计合理的软件结构,包括软件的各种编译段的空间分配以及编译器的优化程度的优化。
  
  4软件设计流程
  
  下面将主要讲解软件实时解码并播放MP3的流程,主要经历以下几个阶段:
  
  4.1、开源MP3解码算法的评估和移植
  针对开源MP3解码软件的设计,采用了开源代码, MAD(libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3)。LIBMAD 提供 24-bit 的 PCM 输出,完全是定点计算,且代码中的huffman解码表都已存入源程序中,非常适合没有浮点支持的平台上使用。在MAD的代码中还带了ARM、PPC、MIPS、INTEL等主流嵌入式处理器优化后的乘除法汇编代码。
  针对MAD开源软件已有代码,我们需要做程序移植工作,由X86处理器Linux环境中移植到PowerPC405处理器,主要是指令的重新编译,还有些指令的汇编模拟,另外需要做的工作包括解码算法代码和播放代码以及中断代码的调试。
  MAD解码代码可以在X86的Linux环境下运行,且解码数据播放正常流畅,在这里使用了一款播放软件Eufony,将解码后的PCM直接播放以验证解码软件的正确性,通过比较多首不同位率的MP3歌曲的解码播放效果,结果表明MAD解码代码完全能解码出高质量的MP3。出于MP3播放实时性、代码可移植性的考虑,将该代码移植到以PowerPC405为核心的SoC芯片。由于解码出来后的数据都存放于DDR内存中,加入文件系统的支持,就可以直接将解码好的数据以文件的形式存储到CF卡上。将PCM源码文件通过Eufony软件播放,以验证解码的效果。
  
  4.2 调试AC97接口播放音乐
  通过AC97硬件接口的调试,完成播放代码的编写,但实时播放MP3要求播放同时进行解码,因此需要运用AC97中断, 假设FIFO深度为512,当FIFO处于半满状态时,即当FIFO中写指针与读指针差值小于256时发送给中断控制器一个中断信号,使主程序进入中断服务程序。这里需要说明的是FIFO状态含义,如果对FIFO状态含义不明,这将对调试产生极大的困难。FIFO状态是通过FIFO读写指针判断的,读写指针都递增,当写指针与读指针差值等于512时,则FIFO状态为满(full),大于512,则FIFO状态为上溢(overflow),大于256小于512,则FIFO状态为半空(half empty),小于256大于0时,则FIFO状态为半满(half full),如果小于0,则FIFO状态为下溢(under run)。使用AC97中断,还需要结合中断控制器(interrupt controller), PowerPC405通过中断控制器响应中断,AC97中断信号连接到中断控制器,在中断向量表中注册一个向量,当有AC97产生中断请求时,中断控制器将PC指针指向中断服务程序。
  
  4.3 调试DMA完成自动数据传输
  DMA搬运数据可减轻CPU负担,对提高CPU效率有很重要的作用。使用DMA,需要初始化DMA,设置DMA搬运模式,设置搬运数据的源地址、目的地址及数据字节数。MP3程序在解码中,启动DMA,DMA将自动搬运源地址数据到目的地址,目的地址也就是AC97 FIFO的入口地址。最后编写一个测试程序,以验证DMA搬运正确。当DMA和缓存(cache)一起作用时,DMA将不能正常搬运数据,原因是数据经过cache作用之后将受到保护(被污染),如果DMA要访问被cache命中的数据,需要和cache进行同步,也就是说要通知cache这块的数据需要重新缓存,Xilinx EDK 提供了相应功能的驱动函数,调用驱动函数XCache_FlushDCacheLine(unsigned int address)可完成数据刷新,一次刷新的数据为输入参数地址的后32个字节。
  
  4.4 调试MP3实时播放音乐
  完成以上各个功能块的调试后,进行模块整合,软件流程如图4所示。
   第一步,先将AC97播放代码整合到定点算法优化的代码中,等MP3解码完后,直接调用AC97播放程序,可以实现正常播放。
  第二步,添加AC97中断服务程序,当FIFO半满时,置中断标志位,进入中断服务程序,如果主程序判断到标志位被置位,则往AC97 FIFO里压256个开始播放音乐型数据,结果能播声音,但音乐播放效果很差。问题的原因在于中断服务程序时间开销较大,等返回主程序时,此时FIFO已经空了,没有音频数据可以播放了。
  第三步,中断服务程序里往AC97 FIFO压入256个整型数据,主程序返回,继续解码并等待中断。
  第四步,添加DMA到MAD代码中,等MP3解码完后,AC97产生中断,中断服务程序里启动DMA,调用XCache_FlushDCacheLine(unsigned int address)刷新要搬运的数据区域,将数据压入AC97 FIFO,主程序等待中断,开始播放音乐。
  第五步,实时播放要解决CPU解码和AC97同时播放的问题,本系统的解决办法是等解码出2帧数据时,形成一定的缓存数据,再调用FIFO清零函数,打开AC97中断,开始播放音乐。
  第六步,为了判断MP3播放结束,程序每解码一帧时更新一次PCM每帧DDR中存放的结束地址,中断程序里判断这个结束地址,如果DMA需要Transfer的源地址已经等于或超过PCM的结束地址,表明已经播放完PCM码音频数据,结束播放,清空FIFO,AC97软件复位,关Cache,程序返回。
  
  
  作者简介
  孟德刚,硕士,现任CSIP集成电路事业部技术经理;
  田正华,太原煤炭气化(集团)有限责任公司工程师;
  孙加兴,博士/高级工程师, 现任CSIP集成电路事业部主任。

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3