低功率系统设计不仅已成为手持移动设备的强制要求,汽车信息娱乐系统同样要求低功率系统设计。此外,汽车系统需要能够将在家庭和办公室的用户体验带到车上。对海量计算、高质量和低功耗解决方案的不断增长的需求迫使嵌入式计算诉求多核系统。因此,基于多核平台的嵌入式解决方案已经在移动、汽车、医疗和工业等应用领域中的游戏、视频和图像处理等许多应用中普及开来。
多核系统设计面临的挑战在于:利用基于多核的系统和可用的媒体框架,提供开放源代码访问和可移植性的可扩展性,以实现对低功耗、高性能嵌入式应用的需求。随着强大的软硬件可编程片上系统(SoC)FPGA器件的出现,嵌入式系统设计人员能够根据客户的需要设计出精确满足形状、功能和性能要求的解决方案。这些解决方案是满足最终客户要求的最佳、高效、具成本效益的方案。赛灵思的Zynq SoC系列FPGA就是这样的器件。
本文介绍了使用低成本、低密度的Zynq FPGA为载客工具(小汽车、公交车、火车、飞机和船舶)的信息娱乐系统创建一个计算平台。这种平台的其它应用包括用于私人和公共场所的数字标牌和信息显示器,如在旅馆、医院、加油站或售货亭等场所;以及用于消费市场的数字相框。
车载信息娱乐体验面临着匹配家庭或办公室的用户体验的双重要求,同时还要满足汽车行业的能效要求。在我们的案例中,具体要求是构建极低成本、低功耗,720p/30fps的影音播放器方案,它要具有视频-音频同步功能、能够与客户在可编程结构上实现的硬件模块连接。这一目标是通过开发与硬件实时加速紧密耦合的多核软件来实现的,且同时着眼于大大降低BOM、一次性工程(NRE)费用、设计风险,以及极其重要的更快的上市时间。
客户要求多?通用SoC无法满足?自己来Design Start设计一颗
我们对Atria Logic AL-AVPLR-IPC 影音播放器的要求进行了分解,它包括:文件读取器、解复用器、具有色彩空间转换器的H.264 Baseline Profile HD解码器和AAC-LC立体声解码器。还包括具有用于基本播放器操作的内置GUI的影音播放器应用,诸如播放、暂停、停止和快进特技模式等。由Ubuntu LTS提供操作系统支持,因为它提供了极高效核利用率的多核使用。影音播放器应用完全基于Linux GTK,而解码器本身则完全由Linux GStreamer开源多媒体框架实现。播放器的框图如下图1所示。
图1:Atria Logic 影音播放器框图。(来源:Atria Logic Inc)
我们觉得赛灵思Zynq-7000系列的Z-7010器件为最佳选择,它满足所有要求。该基于ARM的可编程SoC提供最高的CPU性能和最佳的热性能。同时,该器件为那些需要用逻辑阵列实现加速器引擎的需求提供了足够的可编程构造资源,从而确保即使对于这种低功耗平台也具有足够的性能。我们选用该器件的另一个原因是其提供了现成的小巧Zybo开发板,可加快我们的开发进度、尽快出成果。
除了可定制实现胶合逻辑、RAM和DSP功能的可编程逻辑外,Zynq架构还包括一个带有Neon DSP引擎的双核ARM Cortex-A9 CPU、一个完整的串行I/O阵列、USB和PCIe接口、加密/解密引擎、GbE和存储器控制器。低功耗、集成的CAN总线接口和扩展的温度选项使Zynq系列的这款完全硬件和软件可编程的SoC非常适合低功耗、低成本的汽车信息娱乐应用。
视频解码可以30帧/秒的速率处理高达1280×720分辨率的HD图像,立体声音频解码为48kHz。音频和视频保持了完美同步,避免了对白不同步的问题。
设计实现面临的挑战是:尽可能多地留下可用于实现其它功能的可编程逻辑,且同时保持低功耗。这意味着该实现需要充分利用可用的ARM核和Neon DSP,同时优化固件以尽可能高效地运行。这是通过充分利用Ubuntu中的多线程和对称多处理(SMP)功能实现的。
播放器将音频和视频指定为在独立线程上运行的流水线的一部分,用于在两个ARM Cortex-A9内核上并行执行。AAC-LC音频解码器的负荷比H.264视频解码器小得多。因此,视频解码器分为两个线程,以充分利用两个核,每个核运行在667MHz。在图2中,视频线程2生成一个新线程,线程4,这两个视频线程在两个不同的核上运行。
图2:多线程视频和音频解码执行。(来源:Atria Logic公司)
影音播放器GUI应用程序在单线程、线程1上启动。压缩的音频数据和视频数据分别在线程2和线程3中排队,以保持堆栈溢出限制。对这两个线程中音频和视频数据的解复用(De-multiplexing)将解耦在两个独立的音频和视频处理线程中的数据接收器(sink data)中处理。
Ubuntu操作系统需要估算每个线程所需的最大堆栈空间。每个线程或分支的多队列或单队列元素用于并行或流水线执行任务。操作系统互斥器(mutexes)的所有必需的锁止被启动。在存储器子系统栈空间被正确锁定和解锁的情况下,产生新的视频线程或保持在特定核上的小负荷(small hold)的音频线程。在返回线程时,进程被破坏。但Linux准系统(bare bone)线程无法自动解除分配的本地堆栈存储器。因此,父进程通过将堆栈空间添加到malloc()自由列表来回收存储器空间作为线程清除。用于影音播放器的代码存储器是16KB,而数据存储器被限制为4KB。用于完整框架的整个系统存储器限制为512MB。可以通过仅保留Gstreamer框架的已用特性并剔除未用特性以在很大程度上实施优化。
多线程方法实现的音频和视频解码,最高效地利用了两个核。Gstreamer最初运行的播放器的效率低下,CPU1的利用率只有66%,CPU2的利用率只有81%。线程流水线实现了近100%的核利用率,效率提高了29~34%。
但几乎100%的核利用率仍不足以满足播放器的性能要求。一个选择是在SoC的可编程逻辑部分实现色彩空间转换。虽然这将减少可能需要的可用于其它系统逻辑的可编程逻辑的存量,视频质量与使用定点逻辑相比差一些。
因此,我们选择在Neon DSP引擎上实现色彩空间转换模块。 Cortex-A9 Neon MPE使用ARM v7高级SIMD和向量浮点指令集扩展了CPU核的功能。充分利用Neon DSP的能力利用32位、64位和128位四元寄存器执行浮点计算明显加速了YUV420到RGB444的色彩空间转换,并且通过利用用于SIMD操作的并行向量数据排列,设法将两个Neon DSP引擎的使用减少到一个。
下面的列表显示了使用Neon DSP引擎的色彩空间转换例程的示例代码列表。Neon DSP还以实时数据解交织的方式支持了多个寄存器的并行加载和存储。
列表:由Neon DSP引擎实现的YUV到RGB色彩空间转换例程(来源:Atria Logic公司)
用于色彩空间转换矩阵例程的Neon DSP代码优化率为1.4×至1.64×。 表1列出了具有不同比特率、大小和复杂性的不同流的结果的详细信息。
表1:由Neon DSP色彩空间转换代码实现的H.264 + AAC播放器的性能结果。(来源:Atria Logic Inc)
将去模块化滤波器执行转移到一个Neon DSP引擎是降低负荷的另一种可能方式。
在带有ARM Cortex-A9 @667MHz核的赛灵思Z-7010 SoC FPGA上,该方案以近100%的性能利用率、以30帧/秒的速率实现了1280×720的视频解码和AAC-LC立体声音频。在图3中,CPU1核和CPU2核的利用率分别显示为99.3%和100%。
图3:影音播放器多核加载。(来源:Atria Logic公司)
用Zynq Z-7010实现的AV 播放器完全符合MISRA 2000合规性C代码编码准则、完全通过了静态QAC检查。该实现也符合ISO26262安全标准ASIL B准则。
随着对用于各种应用的低功耗、低成本解决方案的不断增长的需求,可编程SoC计算平台以其价值主张提供了独特的解决方案。完全的价值利用来自于在需要时充分利用可用的CPU核和DSP引擎(例如图像色彩空间及其动态范围质量或音频后处理增强或视觉计算质量和精度)或可编程资源以进行必要的硬件加速或性能改进处理(用于视频和/或视觉)。这一本具优势、加之借力最新的多核处理技术,可为针对这样的应用提供坚实的设计基础。
Atria Logic AL-AVPLR-IPC 影音播放器就是这样一种汽车信息娱乐方案,它在赛灵思Zynq Z-7010上实现了性能、密度和性能的最佳平衡,通过将该器件所有剩余的可用可编程逻辑与其它板逻辑的整合,最小化了BOM成本并提高了系统可靠性。该方法为多种应用(诸如:载客车辆的信息娱乐系统,具有视频能力的信息娱乐系统、数字标牌和信息以及数字相框等)的影音回放提供了高效解决方案。