基于RISC结构的多功能嵌入式处理器结构设计应用

时间:2009-03-09

  当前的一些高端应用中,系统需要处理大量数据、算法和系统内外的通信,采用单RISC核不能满足用户对高性能的需求。基于DSP核和RISC核的并行CPU设计能有效解决这个问题,本文以Hyperstone公司的E1-32为例,阐述如何结合RISC单元和DSP单元实现CPU结构的优化。

  在嵌入式处理器设计领域,RISC已经成为处理器结构设计的必然选择。但是,如今嵌入式应用无处不在,各种产品之间的通讯需要执行快速傅立叶变换、音视频多媒体处理以及快速通信等基于DSP的算法,如果以单纯的RISC处理器以纯软件的方法来完成,由于高速运行,单RISC处理器在数据吞吐量和代码长度方面的局限性就会凸现出来。正是由于这种市场推动,DSP核+RISC核实现并行的CPU设计方案就逐渐得到广泛应用。

  这种双内核并行的架构设计带来了CPU性能的极大提高,同时又带来了一些新的问题:芯片体积增加,需要开辟额外的寄存器、缓存和内部存储空间;功耗显著增大;设计变得异常复杂,需要处理双内核的协作和同步问题、两套不同的指令集,增加了新品设计的复杂性和开发周期。另外,由于需要在两个独立内核的体系结构下来各自编程并保持相互通信,使得系统开发和调试环境变得异常复杂且难于掌握。

  一种简单可行的方法是以RISC核为基础,但在RISC核中加入一些用于专门处理的指令。这种方法几乎没有增加芯片尺寸和内核设计的复杂性,但却有一个致命缺点:当执行那些复杂的多循环的指令时,由于要进行数据信号处理、通信协议和像等专门函数处理,RISC核就会出现性能瓶颈。

  单内核方法

  德国Hyperstone公司已经开发出E1-32这种新的单内核处理器结构。该结构既解决了纯RISC加一些专门指令的单核结构的限制,也克服了RISC核+其它独立核的双核结构的缺点。这种设计在化芯片的封装形式、功耗和指令复杂度的同时,却没有牺牲纯RISC核的性能。此外,由于其成本较低,使得该结构可以广泛用于各种嵌入式系统。

  E1-32结构拥有一个32位的RISC执行单元和一个独立的DSP执行单元,两个单元使用一套16位、32位和48位可变长度的指令集,但包括指令译码在内的内核其它部分对两个单元都是共用的。同时,精巧而高效的指令缓存、单独的一套寄存器和共享的存储器总线接口等一系列措施也简化了芯片硬件逻辑和软件编程的复杂性。

  由于指令集可以方便地扩展,所以其它一些新的专用功能指令或指令集可以取代或加入到DSP单元之中,使之成为同RISC单元并行的执行单元。通过这种方法,一些专门指令可以方便地扩充到指令集中,例如一些专门的像和通信处理指令,甚至是实现高制造技术中一些算法,如模糊逻辑指令集等。

  化的指令集设计

  鉴于单纯RISC结构的多种局限性,人们提出了许多提高单纯RISC结构性能的措施。32位定点指令格式改进了指令译码设计,加快了程序执行速度,也使得3操作数指令可通过传统设计所固有的共享寄存器集来寻址。然而,通过对典型应用代码的运行分析,在绝大多数情况下,第三个操作数不是寄存器变量而是常量。在一个3操作数指令中,那些常量的长度均大于其对应的操作数域5~8位,大于的部分需要后续指令来装载,这大大地削弱了定长指令的优越性。但通过精心设计,16位+16位和16位+32位变长指令通常能够满足常量操作数的要求。

  另外,32位定长的RISC指令集在考虑芯片设计的“硅变效应”方面有很多缺陷。同复杂指令集计算机 (CISC)程序相比,它生成的应用程序代码需要较多的存储空间,这将直接导致目标系统的电路板尺寸增大、成本和功耗的显著提高等问题。在任何情况下,快速指令译码并不能总是保证程序的快速执行,因为必须综合考虑存储器的存取速度。

  为平衡考虑代码生成空间的大小和存储器存取速度的影响,必须保证有基本的16位的指令格式,同时具有32位和48位长度的指令格式。在E1-32处理器的16位指令格式中,各用5位对32个目的寄存器和32个源寄存器寻址。另一方面,这5位也可以用来寻址一个直接操作数,在32个“常用”的常量中找到要用的常量,其它的不常用常量和比较大的数值需要用扩展后的16位或32位来寻址。因为操作码占用6位,所以一个简单的常量装载操作需要一个16位指令(6位操作码+5位常量+5位目的寄存器)。

  基于RISC规则的装载/存贮操作只定义了寄存器类型的操作数,并且几乎所有的指令在单周期内完成。这得益于使用了一种只有两级深度的管道机制,它使得一条跳转指令执行后可以进行快速的重装载动作,跳转目标地址在指令缓存内的延时跳转不用一个等待周期即可执行。若使用更深度的管道会减慢程序执行,因为它需要等待数据再装载。

  不断扩展的RISC指令集

  由于初RISC结构具有定长、单周期指令等的特征,这就使得其指令集不可能包含乘除等复杂运算,所以乘除运算只好通过软件或片内/外的其它硬件逻辑来实现。为解决这类问题,实现诸如数字信号处理函数等运算,标准的硬件方法是集成RISC CPU和DSP 内核在单芯片内。然而,这样的双核结构实现起来具有一定的复杂性,对两个处理器之间的同步要求非常高,出现了内部总线量成倍增加、要求有双口RAM问题,还可能出现字长和队列紊乱等问题。

  一个可解决问题的办法是在RISC核指令集中增加一些复杂函数指令,这就解决了上述的大部分问题,但其的缺点在于函数的复杂性导致要多个时钟才能执行这样的一条指令。更糟糕的是,当作为一些更复杂函数的一部分时,这些专门函数指令经常要在一个紧凑的循环中被重复执行。由于大量的多周期指令在后台运行,使得实时应用的中断延时成为另一个值得关注的问题。

  为彻底解决这些问题,能够设计出这样一种体系结构:只含有一套指令集,但可以通过位于单核内的一个独立执行单元来进行复杂指令的扩展。与双核结构不同的是,RISC和独立的指令单元组成单核的指令译码、指令缓存、装载/存储单元、内部总线、CPU寄存器和存储器接口等,所有这些主要的内核资源在单内核指令流执行时均是共用的。

  该特点又使CPU重新具备了较高的硅单元面积效率和简单的软件开发模型的优点。但是与一个简单的RISC处理器设计要直接去处理一些复杂指令不同的是,这种结构可以通过单核内的独立执行单元来执行那些专门的复杂指令,这些复杂指令与RISC指令是并行执行的,这样就避免了指令/数据流程迟延和中断延时(二者总是在一起出现)问题。

  实现实例

  Hyperstone的E1-32结构在一个单核内结合了一个32位的RISC CPU和一个简单的DSP执行单元,它们通过一个单一指令流程来运行程序,该结构可以支持各种DSP算法需求的数据结构,如16/32位整数、16位复数等。RISC指令同时扩充了13条额外指令,用以进行DSP处理和其它特殊计算,如单指令乘法、乘法累加(包括复数运算)、加减(包括定点舍入运算)等。

  DSP运算是通过单核内的独立DSP单元来完成, 同时DSP单元和RISC ALU单元的处理过程完全并行,当在DSP和ALU处理的时间内有数据装载/存储操作时,DSP、ALU和装载/存储三个动作也是并行的。ALU和DSP两个执行单元是通过96个32位共享寄存器实现无缝连接,如图1所示。DSP单元是以一个16×16位乘法器和一个64位的加法器为基础组成,这样就可以在一个周期内(管道形式)实现16位乘法累加指令,也可以实现数据滤波器算法中需要的32位和64位加法操作,如2所示。


  对复杂函数和数据类型的优化

  由于使用管道处理方式,E1-32的绝大多数指令都可以在一个周期内完成。指令从专一的指令缓存内取出,在一个周期内完成译码,几乎所有的RISC指令都可以在第二个周期内完成。标准RISC指令和DSP指令并行执行,RISC单元和DSP单元都可以在一个周期内完成从它们自己的寄存器内取操作数和指令的计算等操作,同时在一个周期内返回结果到相应的目的寄存器。这样,管道运行的深度只有两个阶段,使得跳转指令执行后管道能得到快速填充,同更深度管道相比大大节省了时间。

  FIR滤波器的计算就是一个复杂函数并行操作的例子,其执行过程如下面的代码所示。函数内部含有一个循环,数据装载和乘法运算在循环内并行执行。由于RISC和DSP单元并行操作,整个算法的任务可以被协调分配给DSP和RISC两个单元来执行,同时各自优化两个单元的指令流程以确保指令管道畅通,这就使得指令执行速度大大提高。

  下面给出FIR滤波器的内部循环的示例代码:

  LDW.PL15,L11; L15 系数指针,装两个系数

  LDW. PL7,L12; L7 历史指针,装两个记录

  MOVDG14.0 ; 清除G14/G15循环累加器

  LDW.PL13,L15: L13指向下两个系数

  LDW,PL7L14: L14下两个历史记录的值

  ADDIL8,-4: 循环计数器减4

  EHMCD L11,L12: 半字长度乘累加

  EHMACD L13,L14; 半字长度乘累加

  LDW.PL15,L11; L11 指向下两个系数

  LDW.PL7,L12

  DBGT LOOP ; 如果L8>0,延时跳转

  EHMACD L13,L14; 半字长度乘累加

  扩展进来的DSP指令集有一个重要特征,即通过对两个独立的16位字运算组合,可以进行32位字操作数运算。每次运行滤波器内部循环时,装载指令(LDW)都会把两个16位数据合并成一个32位字。 EHMACD指令实现2个32位字的乘法运算,实质是执行两次16位数的乘法得到两个32位数,再把这两个数合并存储在一个64位的累加器G14/15里,得到一个64位的计算结果。ADDI和DBGT指令用于循环控制。循环每执行1次,有4次运算结果产生并被累加,因此循环计数器要减去4。3示意了用E1-32 DSP/RISC内核执行FIR滤波器的内部循环中指令的管道执行。从中可以看出用E1-32结构在运行这一算法时的获得的并行程度,也可以看出使用双执行单元的效率优势。

  指令缓存的设计优化了对复杂函数的处理

  单内核RISC/DSP结构的很多优越机制的实现,一方面依赖于该结构给RISC和DSP提供了一个稳定的指令流程,另一方面依赖于该结构可以及时进行复杂函数处理。Hyperstone公司在片上设计了一个非常简单的指令缓存,含有32个非结构性的32位指令字。这是一个环形缓冲器,通过两个计数器来管理缓冲器内指令。一个前向计数器记录指令字的高端地址,一个后向计数器记录指令字的低端地址,这样一来在指令缓存内可以实现半字长度的短跳转。这一机制在指令执行时就好象产生了一个移动窗,滚动向前越过那些已经被执行过的指令,当遇到循环程序时窗口移动停止,执行循环程序。

  由于这种提前取指可以在指令缓存内放入至多8个指令字,所以只能给程序循环剩下24个指令字空间。也就是说包括结束循环的跳转指令在内,程序循环的长度为96字节或94字节(依据当时的队列情况有所不同)。当跳转目的地址在缓存区内,且当时缓存没有溢出时,一个短前向跳转落在前向计数器的前两个指令字位置。

  不考虑指令边界的情况下,对提前取指的控制字以32位方式管道装载。每进行前向取指令操作,前向计数器加4,并且前向取得的指令放入指令缓存的位置由前向计数器的第6位到第2位之间的五位来确定。如果计算出新放入的前向指令将要覆盖后向计数器所记录的指令时,则将前向指令向前移动4个字节,象标准的环行存储器操作一样,把它放在环形寄存器端。

  当执行长跳转或延时跳转时,需要检查跳转的目的地址位置。如果跳转的目的地址在两个计数器的值之间,则判断为缓存内的短跳转;如果跳转的目的地址不在缓存内,当跳转的目的地址被拷备到两个计数器内时,此时目标指令被装载到指令缓存内,就会出现指令缓存溢出的现象。延时跳转是指新指令跳转到前向计数器所指向的位置之前的缓存内某个位置,并装载新的指令到这一位置但不改变两个寄存器的值的一种跳转形式。从上可以看出,所有这些针对指令缓存的操作只适用于短跳转指令,并且只有当缓存模式控制标志位设置后才能生效(缓存模式控制标志位在执行普通跳转指令或帧指令时被清零)。

  由于大多数专门运算,如DSP函数的任务都包含在一个短循环内,因此这个简单的指令缓存设计将会对那些复杂、重复性的算法具有很好的支持。另外,芯片封装尺寸明显减小以及嵌入式系统的实时性的改进也是指令缓存设计的两个重要贡献。

  实时性能和复杂指令

  许多嵌入式应用需要一个快速但可预测的中断响应。两个执行单元的并行运行在处理中断方面有两个优点:首先,由于处理中断的时候复杂函数可有扩展的指令(集)来继续运行,这就保证了那些“不能被打断的任务”不被中断;其次,在那些可以被中断的任务场合,中断不会给进行复杂运算造成时间损失,因为这个任务可以在RISC单元执行中断处理后继续被完成。只要不被更别的中断所打断,这种两个单元独立执行的能力使得处理器可以在7个时钟周期内启动中断服务程序,甚至是在扩展的指令集执行一个复杂函数的过程中也同样在7个时钟周期内启动中断服务程序。

  软件上的考虑

  这种独特的处理器结构在软件设计上同样具有优势。在同一个指令流程内并行执行RISC指令和DSP指令,给程序编译带来了很大的性能提升。Hyperstone公司利用该结构内在的并行机制编写了一个经过优化处理的针对RISC/DSP处理器的函数库。同样,简单的程序开发流程、对参数传递和实时中断的硬件支持都大大简化了程序开发和调试工作的难度。


  

参考文献:

[1]. RISC datasheet https://www.dzsc.com/datasheet/RISC_1189725.html.


上一篇:基于高效的白光LED驱动电路设计
下一篇:基于光纤光谱仪在颜色在线测量中的应用

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料