在NiosIDE环境中编写的代码经过很少的更改或无需更改即可在uClinux下的多任务环境中运行,因为在uClinux中对内存映射地址的写操作没有限制。
一般通过常用的技术在uClinux上使用C2H加速器。将C2H加速器从NiosIDE移到uClinux上所需步骤如下:
第一步是生成一个临时项目。然后,在NiosIDE中编译并生成加速器。现在,我们可以在Debug目录中看到加速器的打包函数。将这些头文件(Headerfile)和打包函数复制到uClinux开发目录中。如果您尚未对FPGA编程,则进行该项编程。
下一步是使用Nios的gcc工具和elf2flt选项编译经过加速的应用程序。确保必需的头文件(如system.h或io.h)存在。在完成此步骤后,将生成的执行文件复制到单片机上。在大多数情况下,它的速度会比仅使用软件的系统要快。
可惜的是,我们在将libjpegDCT函数转换成加速器时面临着性能方面的问题。我们将在接下来的部分介绍针对性能问题的解决方案。
优化C2H编译器的JPEG库
一般情况下,开发人员会考虑使用DSP进行JPEG压缩,但DSP需要有自己的软件程序来提供支持。选择可以加速libjpeg的C2H编译器是一个正确的决定,因为许多现有应用程序都使用作为JPEG标准库的libjpeg。
但是,在使用C2H编译器转换原始的DCT函数时,它所显示的性能比仅使用软件设计的性能低。从结构上来说,对数据高速缓存的刷新是一个问题,它的数据处理工作是以64个字节为单位进行的。我们设计了适合于C2H编译器的经过优化的缓冲区管理系统。这个管理器实现了4倍的性能提升。
创建自定义的SoPC组件
每个部件都由VerilogHDL单独设计,并作为一个组件添加到SoPC中。图像处理模块、VGA控制器和步进马达控制器被组合成一个单独的SoPC组件,因为这些部件相互之间都有密切的关联。这些组件作为AvalonMaster的组件在SRAM上写入图像数据。
使用自定义指令对MPEG音频进行解码
在使用NiosII处理器和uClinux的环境中播放MPEG音频存在三个主要问题:处理器性能、FIFO的大小以及在uClinux中用于输出的设备驱动程序。
我们发现,100MHzNiosII处理器在CycloneII芯片上对立体声128Kbps44.1KHzMP3音频进行解码时会有性能损失。如果FIFO足够大,则可以在该系统中播放单声道音频,但CPU会一直分配用于播放音频的性能。
我们在Nios处理器上添加了使用自定义指令的64位乘法器以实现64位乘法计算;这种运算方法在Libmad库中经常用到。播放的性能提升了大约2.5倍,用于计算的时钟使用率有所降低。
还有其它一些原因使音频播放质量不佳。首先是采样率不好,其次是缓冲区大小不足,最后是多任务处理环境。音频将参考使用17MHz的时钟。
