Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2984049
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4588
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类: LINUX

2010-12-21 15:12:08

ARM流水线关键技术分析与代码优化
 
作者:大连理工大学   来源:单片机与嵌入式系统    点击数:2147   更新时间:2009-4-13
   流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。 

    ARM7的三级流水线在执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作、ALU操作以及相关器件之间的数据传输。执行单元的工作往往占用多个时钟周期,从而成为系统性能的瓶颈。ARM9采用了更为高效的五级流水线设计,增加了2个功能部件分别访问存储器并写回结果,且将读寄存器的操作转移到译码部件上,使流水线各部件在功能上更平衡;同时其哈佛架构避免了数据访问和取指的总线冲突。 

    然而不论是三级流水线还是五级流水线,当出现多周期指令、跳转分支指令和中断发生的时候,流水线都会发生阻塞,而且相邻指令之间也可能因为寄存器冲突导致流水线阻塞,降低流水线的效率。本文在对流水线原理及运行情况详细分析的基础上,研究通过调整指令执行序列来提高流水线运行性能的方法。 

1 ARM7/ARM9流水线技术 

1.1 ARM7流水线技术 


    ARM7系列处理器中每条指令分取指、译码、执行三个阶段,分别在不同的功能部件上依次独立完成。取指部件完成从存储器装载一条指令,通过译码部件产生下一周期数据路径需要的控制信号,完成寄存器的解码,再送到执行单元完成寄存器的读取、ALU运算及运算结果的写回,需要访问存储器的指令完成存储器的访问。流水线上虽然一条指令仍需3个时钟周期来完成,但通过多个部件并行,使得处理器的吞吐率约为每个周期一条指令,提高了流式指令的处理速度,从而可达到O.9 MIPS/MHz的指令执行速度。 

    在三级流水线下,通过R15访问PC(程序计数器)时会出现取指位置和执行位置不同的现象。这须结合流水线的执行情况考虑,取指部件根据PC取指,取指完成后PC+4送到PC,并把取到的指令传递给译码部件,然后取指部件根据新的PC取指。因为每条指令4字节,故PC值等于当前程序执行位置+8。 

1.2 ARM9流水线技术 

    ARM9系列处理器的流水线分为取指、译码、执行、访存、回写。取指部件完成从指令存储器取指;译码部件读取寄存器操作数,与三级流水线中不占有数据路径区别很大;执行部件产生ALU运算结果或产生存储器地址(对于存储器访问指令来讲);访存部件访问数据存储器;回写部件完成执行结果写回寄存器。把三级流水线中的执行单元进一步细化,减少了在每个时钟周期内必须完成的工作量,进而允许使用较高的时钟频率,且具有分开的指令和数据存储器,减少了冲突的发生,每条指令的平均周期数明显减少。 


2 三级流水线运行情况分析 

    三级流水线在处理简单的寄存器操作指令时,吞吐率为平均每个时钟周期一条指令;但是在存在存储器访问指令、跳转指令的情况下会出现流水线阻断情况,导致流水线的性能下降。图1给出了流水线的最佳运行情况,图中的MOV、ADD、SUB指令为单周期指令。从T1开始,用3个时钟周期执行了3条指令,指令平均周期数(CPI)等于1个时钟周期。



    流水线中阻断现象也十分普遍,下面就各种阻断情况下的流水线性能进行详细分析。 

2.1 带有存储器访问指令的流水线 

    对存储器的访问指令LDR就是非单周期指令,如图2所示。这类指令在执行阶段,首先要进行存储器的地址计算,占用控制信号线,而译码的过程同样需要占用控制信号线,所以下一条指令(第一个SUB)的译码被阻断,并且由于LDR访问存储器和回写寄存器的过程中需要继续占用执行单元,所以下一条(第一个SUB)的执行也被阻断。由于采用冯·诺伊曼体系结构,不能够同时访问数据存储器和指令存储器,当LDR处于访存周期的过程中时,MOV指令的取指被阻断。因此处理器用8个时钟周期执行了6条指令,指令平均周期数(CPI)=1.3个时钟周期。



2.2 带有分支指令的流水线 

    
当指令序列中含有具有分支功能的指令(如BL等)时,流水线也会被阻断,如图3所示。分支指令在执行时,其后第1条指令被译码,其后第2条指令进行取指,但是这两步操作的指令并不被执行。因为分支指令执行完毕后,程序应该转到跳转的目标地址处执行,因此在流水线上需要丢弃这两条指令,同时程序计数器就会转移到新的位置接着进行取指、译码和执行。此外还有一些特殊的转移指令需要在跳转完成的同时进行写链接寄存器、程序计数寄存器,如BL执行过程中包括两个附加操作——写链接寄存器和调整程序指针。这两个操作仍然占用执行单元,这时处于译码和取指的流水线被阻断了。

2.3 中断流水线 

    
处理器中断的发生具有不确定性,与当前所执行的指令没有任何关系。在中断发生时,处理器总是会执行完当前正被执行的指令,然后去响应中断。如图4所示,在Ox90000处的指令ADD执行期间IRQ中断发生,这时要等待ADD指令执行完毕,IRQ才获得执行单元,处理器开始处理IRQ中断,保存程序返回地址并调整程序指针指向Oxl8内存单元。在Oxl8处有IRO中断向量(也就是跳向IRQ中断服务的指令),接下来执行跳转指令转向中断服务程序,流水线又被阻断,执行0x18处指令的过程同带有分支指令的流水线。


    如果让RT脚空接,FSEL接地或接在VIN上,则开关频率为350 kHz或550 kHz。如果采用外接电阻进行开关频率选择,有计算阻值的公式为:R=500 kHz/选择的开关频率×100 kΩ。设计中选用开关频率700 MHz,计算得应接电阻阻值为71.5 kΩ。
3.4 延时启动
    两芯片均有慢启动和输出输入使能控制功能。通过在脚SS/EN上连接不同容值的电容,可以获得不同的慢启动时间。尽管有专门的计算公式可以进行计算,但这里设计可以利用TI为专门电源设计推出的软件swift desig-ner,可以为设计提供很大的方便。swift designer提供一系列的电源芯片支持设计,包括对TPS54312和TPS54616的支持。
    在swift designer中设置参数,然后按“GO”,软件即能自动按照要求的参数选择电源芯片和搭建好外围电路。设参数为:输出电压1.2V,输出电流3A,输入最小电压4.8V,最大5.2V,慢启动时间3 ms,开关频率700 kHz。软件可以自动生成电路图,软件自动选择的电源芯片是TPS54312,同时外围电路已经连接好。
    同样修改参数,输出电压3.3V,输出电流6A,输入最小电压4.8V,最大5.2V,慢启动时间6 ms,开关频率700 kHz。同样,这时软件自动生成5V转3.3V的电路图(略)。
    在swift designer软件的帮助下,使设计变得灵活和简便。要获得正确的上电次序,设计中还应做一些调整。将TPS5431 2的PWRGD脚接至TPS54616的SS/ENA脚,如图2中原理图所示,同时接成上拉状态。这样,只有当TPS54312输出电压大于1.2 V*90%时,脚PWRGD输出为低,从而使能TPS54616,产生3.3 V的电压输出,从而获得正确的上电次序要求。在TPS54312输出电压没有达到要求时,TPS54616被上拉,不能产生3.3 V输出。这样通过慢启动时间的设置和对使能端引脚的控制两重保险.可以完全确保正确的上电延时和上电次序。同时,我们可以根据不同芯片对上电延时和上电的次序进行灵活调整,满足上电要求。


 

 


 

4 仿真分析
    swift designer软件还提供了初步的仿真分析,能直观地给出分析表,循环响应图,输入电压抖动的影响图,效率图和PCB布线图。下面是一系列相关仿真分析。
    从仿真可以看出,设计所采用的电源转换具有较高的转换效率,同时由于输入抖动而带来的影响也在系统可接受范围之内,加上外围电容滤波后,输出电压纹波效果还会有所改进。由于软件没有对上电次序的先后给出直观仿真,但通过对两电源芯片慢启动时间的设置先后和使能端的控制,系统上电次序得到了较好保证。


 

5 结 语
    供电模块设计对整个系统实现和系统良好运行意义重大,尤其对一些特殊供电要求的高性能器件而言更是如此。在电源模块的设计中,要综合考虑系统要求,设计灵活性,实现难易程度,成本、效率、封装等相应因素,从而做出全面的、折衷的考虑,以寻求最佳的设计方案。经过在雷达信号处理板上的实际应用,设计满足各项电压、电流和功耗要求,同时由于采用较好的上电次序设计,保证了ADSPTSl01的内核先于IO上电,从而使整个系统稳定性和可靠性得到了较好保证。


 

    因此流水线的优化问题主要应从两方面考虑:
    ①通过合并循环等方式减少分支指令的个数,从而减少流水线的浪费;
    ②通过交换指令的顺序,避免寄存器冲突造成的流水线停滞。


 

4 结 论
    
流水线技术提高了处理器的并行性,与串行CPU相比大大提高了处理器性能。通过调节指令序列的方法又能够有效地避免流水线冲突的发生,从而提高了流水线的执行效率。因此如何采用智能算法进行指令序列的自动调节以提高流水线的效率和进一步提高处理器的并行性将是以后研究的主要方向。

 

 


1、冯·诺依曼结构
  冯·诺依曼结构又称作普林斯顿体系结构(Princetionarchitecture)。
  1945年,冯·诺依曼首先提出了“存储程序”的概念和二进制原理,后来,人们把利用这种概念和原理设计的电子计算机系统统称为“冯·诺依曼型结构”计算机。冯·诺依曼结构的处理器使用同一个存储器,经由同一个总线传输。
  冯·诺依曼结构处理器具有以下几个特点:
  必须有一个存储器;
  必须有一个控制器;
  必须有一个运算器,用于完成算术运算和逻辑运算;
  必须有输入和输出设备,用于进行人机通信。
  冯·诺依曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此,当初选择这种结构是自然的。但是,这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。
  在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯·诺依曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,指令1至指令3均为存、取数指令,对冯·诺依曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
  arm7系列的CPU有很多款,其中部分CPU没有内部cache的,比如arm7TDMI,就是纯粹的冯·诺依曼结构,其他有内部cache且数据和指令的cache分离的cpu则使用了哈弗结构。

2、哈佛结构 
  哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如图1所示。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。

图1 哈佛体系结构框图


  哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。 
  目前使用哈佛结构的中央处理器和微控制器有很多,除了Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11。 
  哈佛结构是指程序和数据空间独立的体系结构, 目的是为了减轻程序运行时的访存瓶颈。
  例如最常见的卷积运算中, 一条指令同时取两个操作数, 在流水线处理时, 同时还有一个取指操作, 如果程序和数据通过一条总线访问, 取指和取数必会产生冲突, 而这对大运算量的循环的执行效率是很不利的。
  哈佛结构能基本上解决取指和取数的冲突问题。
  而对另一个操作数的访问, 就只能采用Enhanced哈佛结构了, 例如像TI那样,数据区再split, 并多一组总线。 或向AD那样,采用指令cache, 指令区可存放一部分数据。
  在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯·诺依曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,指令1至指令3均为存、取数指令,对冯·诺依曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
  如果采用哈佛结构处理以上同样的3条存取数指令,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。

3、冯·诺依曼体系和哈佛总线体系的区别 
  二者的区别就是程序空间和数据空间是否是一体的。冯·诺依曼结构数据空间和地址空间不分开,哈佛结构数据空间和地址空间是分开的。
  早期的微处理器大多采用冯·诺依曼结构,典型代表是Intel公司的X86微处理器。取指和取操作数都在同一总线上,通过分时服用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。
  哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指和取操作数,从而大大提高了运算能力。
  DSP芯片硬件结构有冯·诺依曼结构和哈佛结构,两者区别是地址空间和数据空间分开与否。一般DSP都是采用改进型哈佛结构,就是分开的数据空间和地址空间都不只是一条,而是有多条,这根据不同的生产厂商的DSP芯片有所不同。在对外寻址方面从逻辑上来说也是一样,因为外部引脚的原因,一般来说都是通过相应的空间选取来实现的。本质上是同样的道理。

4.改进型的哈佛结构 与 哈佛体系结构差别

与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:
(1).使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存; 
(2).使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。

后来,又提出了改进的哈佛结构,其结构特点为: 
(1).使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存; 
(2).具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输; 
(3).两条总线由程序存储器和数据存储器分时共用。

5.总结

体系结构与采用的独立与否的总线无关,与指令空间和数据空间的分开独立与否有关。51单片机虽然数据指令存储区是分开的,但总线是分时复用得,所以属于改进型的哈佛结构。ARM9虽然是哈佛结构,但是之前的版本(例如ARM7)也还是冯·诺依曼结构。早期的X86能迅速占有市场,一条很重要的原因,正是靠了冯·诺依曼这种实现简单,成本低的总线结构。现在的处理器虽然外部总线上看是诺依曼结构的,但是由于内部CACHE的存在,因此实际上内部来看已经 类似 改进型哈佛结构的了。至于优缺点,哈佛结构就是复杂,对外围设备的连接与处理要求高,十分不适合外围存储器的扩展。所以早期通用CPU难以采用这种结构。而单片机,由于内部集成了所需的存储器,所以采用哈佛结构也未尝不可。现在的处理器,依托CACHE的存在,已经很好的将二者统一起来了。

阅读(4275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~