随着流媒体、宽带网络以及各种高速接口的广泛应用,消费类电子产品开始向三重播放(Triple Play)甚至四重播放(Quab Play)的领域演进。对嵌入式处理器的要求也变得越来越高,一方面要处理大量的人机交互、外设控制等任务,另一方面还要对不同接口的声音、视频、图像等数据进行数字信号处理,与此同时,嵌入式系统还要应对功耗更低,体积更小的挑战。
传统的应对方法是不断研发更宽数据流、更快频率的处理器,数据宽已经由最初的4位、8位、发展到现在的16位、32位,频率也由最初的MHz级到发展到现在的GHz级,相应的存储器容量、速度也在不断增加。但是继续沿着高带宽、高主频的摩尔定律方向发展,工艺上的受限已经初显端倪,更加难以应对低功耗、小体积的需求。众多厂商也意识到,对于新的应用而言,速度已经不再是唯一因素,提升性能才是更好的选择。
同一化多核处理器结构
单芯片的多核解决方案是个好的尝试,也是现在的嵌入式应用的热点之一。InterllaSys公司SEAforth系统芯片是从自已的可扩展嵌入式阵列Scalable Embedded Array (SEA)平台发展而来的,与将通用处理器和若干DSP核嵌入单芯片的方法不同,该平台使用了相同的处理器核,每个核既具有通用处理器的功能,同时内部集成高速乘法器 ,经过妥善设计,就可以把复杂的计算任务分配给各个处理器核共同进行。
工作时,可以简单地指定各个处理器核完成需要执行的不同任务。比如,在三重播放应用中,可以让1个处理器核去管理外接存储器,让8个处理器核负责FFT变换,完成多媒体算法,再用几个处理器核带动应用系统中的各种I/O子系统(见图1)。这样,每个处理器都会专心运行自己的任务,避免了执行不同任务时任务切换之间的开销,单个处理器在执行流媒体解码过程中,也不会出现由于处理器等待别的外设而造成的图像抖动不畅等现象,同时,我们可以根据具体的应用选择具有不同数量内核的处理器,极大地增强了设计和选择的灵活性。目前在这一体系下,已经有40核的处理器解决方案。
本地化RAM/ROM存储器和时钟发生器
当设计中使用了多个处理器时,存储器存取的问题就出来了。大多数多核芯片设计把几个处理器核和一个共用存储器放在一起。这样做简化了设计,因为每一个核只是处理器本身,问题转到多个处理器核如何共同使用一个存储器,以及存储器存取的仲裁,这是一个难题。通常用到某种仲裁网络或者交叉点切换开关,在只有3个到4个处理器核时,这个方法是可行的。但是,在芯片上需要几十个处理器核时,共用存储器的问题变得很复杂,令人望而却步。此外,由于越来越多处理器核需要对存储器进行存取,共用存储器的效率变得越来越低,很快就成为致命的瓶颈,把多核结构在处理方面的优点都淹没了。
SEAforth多核处理器使用了本地化存储器设计,即为每个处理器核设计了自己的RAM/ROM存储器。这有两个好处,一方面避免了存储器仲裁,也不需要交叉切换开关;另一方面可以分配给每个处理器核所需要的存储容量。分析典型算法的源代码,需要的存储器容量有两种,一种是1000字节或者少一些,一种是容量很大,几兆字节,甚至几百兆字节。大多数应用属于前者,后者则在少数应用中需要,实现上也不切实际。所以SEAforth多核处理器为每一个处理器核都用小一些的本地存储器,1000字节的数量级,用于存放程序源代码和数据,ROM中固化每个处理器核的BIOS,再用一个大得多的外接存储器,作为缓冲存储器满足多媒体的需要。
与采用公共外部时钟的方式不同,SEAforth多核处理器为每个核内建一个时钟——一个简单的环形振荡器。它的速度和硅半导体的速度一样快,只有在该处理器核工作时,它的时钟才工作。这种设计方式为下面介绍的核间通讯提供了可能,同时,任一时刻由于只有部分处理器核在工作也大大降低了功耗。SEAforth多核处理器有很低的功耗水平,每个处理器以1GHz的频率运行,而40核的整体功耗为250mW。
高效的处理器核间通讯
SEAforth多核处理器允许计算量很大的算法由几个核协作完成,这时,不同核间需要大量的交换数据,通讯方式的优劣影响整个系统的性能。
完成一项复杂的任务时,传统的做法是由操作系统自行指定参与的核,离的很远的核间通讯需要处理器内有大量的通讯电路,往往设计复杂,效率偏低。在SEAforth多核处理器应用中,由工程师自己指定完成特定任务的处理器核,这需要工程师了解哪些任务需要交换更多的数据,然后指定相邻的核完成这项任务。对于要求大量访问核外存储器的任务,同样可以指定距离最近的核去完成。
通过共用寄存器这种方式避免了冲突电路和优先权网络的问题,具体传输过程中,传统的处理方法需要利用读取、检测、写入等状态位信息建立握手协议,耗费的时间多于实际传送数据所用的时间。该处理器由于内建一个电路,可以在一个指令周期内实现启动/停止中的处理器核操作,所以实现了无需握手协议的传输。 假设核A与核B之间传输数据,处理器核A是送出数据的核,想把数据送到共用寄存器去,如果在寄存器中的数据还没读取,处理器核A 就停下来,一直到处理器核B读取了寄存器中的数据。在同一时刻,处理器核A回来执行原来要执行的那条指令,即“送出数据”。于是,从源代码的角度看,处理器核A总是认为寄存器是空着的,在等待数据,没有必要读取和检测状态位。处理器核B做的事与之相似。处理器核B的源代码总是认为寄存器中一直存放着没有读出的数据。当它开始执行指令“读取数据”,从寄存器中取出数据时,如果寄存器中没有需要读取的数据,它也停下来。当新的数据在寄存器中出现时,处理器核B便执行“读取数据”指令,这条指令把数据从寄存器中取出来。同样,没有必要读取、检测状态位,没有必要将状态位置位。
在SEAforth多核处理器中,处理器核不仅可以读取和执行本地ROM和RAM中的指令,它还能够读取和执行I/O口和寄存器送来的指令(见图3)。这样,利用上面的传输方式,指令便可以源源不断地送到共用寄存器,并且直接执行,不必把源代码传送给本地存储器。大大加快了执行效率。
针对性的精简指令集
除了硬件设计上的创新, SEAforth多核处理器使用了为自己量身定制的Forth语言, 它不使用大量的寄存器,只用很少的硬件实现。这是因为在编制Forth程序时,是定义新的字,然后用这些字来定义更高级的字,这些新定义的字就是核心字。然后把这些核心字装在处理器的专用电路中。最后的结果是处理器核非常小,速度很高。 用核心字实现的指令只有32条。这些指令只用5位就能实现,有一些指令只能用于某些场合,这样就有可能把几条指令都放在一个不长的指令字中,SEAforth处理器核使用18位的数据宽,在一个指令字中就可以放4条指令。像这样安排的指令可以自动地达到缓存的效果,不需要设置L1和L2缓存。每取一个指令字时,一下就把4条指令送到处理器核中。例如,循环子程序的微指令可以全部放在一个18位指令字中。这种结构的指令字如果和自动状态信号一起,放到I/O寄存器或者共用寄存器中,取一次指令字,就可以传送大数据块。
通过T18开发工具可以实现上述指令的编译,因为SEAforth处理器每个核都通过自己的I/O和外部连接,并且都有自己的BIOS,所以,应用中只需为每个核编写对应的源代码,不再需要中央操作系统去为每个核分配任务。
丰富的接口资源和外部器件支持
除了上述这些创新的设计,SEAforth多核处理器内建丰富的接口资源进一步减小了系统体积、增强了应用范围:
?集成ADC和DAC;
?1兆字、6 ns的外部存储器接口;
?2个SPI I/O口;
?25位通用并行 I/O;
?8位SD从端口;
?很多其他I/O口引脚,有一些是某些处理器核专用的,有一些是两个处理器核共用的。
同时,提供了对嵌入式应用中各个部件的支持,比如,针对消费电子三重播放市场推出的Indigita保护内容安全的处理器和OnSpec安全存储控制器,很好地解决了播放内容安全和数字权限管理的难题。这也为SEAforth处理器应用提供了有力的支持。
结语
未来消费电子产品的功能将更加完善,必然要求其中的嵌入式处理器能够同时实现声音、数据、视像的“三重播放”能力。SEAforth处理器可以作为一种解决方法,从图4可以看出它广泛的应用领域,衷心希望能有更多创造性的解决方案如雨后春笋般涌现,把我们的世界变得更加美好。 |