一、两种结构: 冯 · 诺依曼结构 和 哈佛结构:

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的存在,已经很好的将二者统一起来了。

二、ARM流水线结构:

 流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。
    ARM7的三级流水线在执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作、ALU操作以及相关器件之间的数据传输。执行单元的工作往往占用多个时钟周期,从而成为系统性能的瓶颈。ARM9采用了更为高效的五级流水线设计,增加了2个功能部件分别访问存储器并写回结果,且将读寄存器的操作转移到译码部件上,使流水线各部件在功能上更平衡;同时其哈佛架构避免了数据访问和取指的总线冲突。

arm7采用三级流水

(1)取指(fetch)

取指级的任务是从程序存储器中读取指令。

(2)译码(decode)

译码级完成对指令的分析,并为下一个周期准备数据路径需要的控制信号。在这一级,指令占用译码逻辑,不占用数据通路。

(3)执行(excute)

完成指令要求的操作,并根据需要将结果写回寄存器。指令占用数据路径,寄存器堆被读取,操作数在桶行移位器中被移位。运算器产生运算结果并回写到目的寄存器中,运算器根据指令需求和运输结果更改状态寄存器的条件位。

arm9采用五级流水

(1)取指(fetch)

从存储器中取出指令,并将其放入指令流水线。

(2)译码(decode)

指令被译码,从寄存器堆中读取寄存器操作数。在寄存器堆中有3个操作数读端口,因此大多数ARM指令能在1个周期内读取其操作数。

(3)执行(execute)

将其中一个操作数移位,并在ALU中产生结果。如果指令是Load或Store指令,则在ALU中计算存储器的地址。

(4)缓冲/数据(buffer/data)

如果需要则访问数据存储器,否则ALU只是简单地缓冲一个时钟周期,以便是所有的指令具有同样的流水线流程。

(5)回写(write-back)寄存器堆

------------------------------------------------

注意,arm7中执行和取指是隔了一级译码级,那一级不读取数据,当前PC=原PC+8, 正常

arm9中执行和取指之间的译码级不再老实,译码级已经开始从寄存器堆中读取寄存器操作数,这样的话,

读取到得就是PC+4,不是PC+8,执行级又不会再读一次,那将导致执行级的PC还是=PC+4

为了保持向下兼容,在ARM9的5级流水线上,取指级增加的PC值被直接送到译码级的寄存器,穿过了两级之间的流水线寄存器,这样译码级得到的PC值就是下一条指令的PC+4,等于当前指令的PC+8,

等到了执行级时,PC寄存器的值=当前指令地址+8

当使用指令STR或STM对R15进行保存时,保存的可能是当前指令地址加8或当前指令地址加12。

到底是哪种方式,取决于芯片的具体设计方式。当然,在同一个芯片中,只能采用一种方式。要么保存当前指令地址加8,要么保存当前指令地址加12。程序开发人员应尽量避免使用STR或STM指令来对R15进行操作。当不可避免要使用这种方式时,可以先通过一小段程序来确定所使用的芯片是使用哪种方式实现的。例如:

SUB R1,PC, #4    ;R1中存放STR指令地址

STR PC,[R0]      ;用STR指令将PC保存到R0指向的地址单元中,

;PC=STR指令地址+偏移量(偏移量为8或者12)。

LDR R0,[R0]    ;读取STR指令地址+偏移量的值

SUB R0,R0,R1    ; STR指令地址+偏移量的值减去STR指令的地址,

;得到偏移量值(8或者12)。

另:http://blog.csdn.net/hamilton1/article/details/6192722

When an instruction reads R15 without breaking any of the restrictions on its use, the value read is the

address of the instruction plus 8 bytes.

ARM7采用三级流水线的冯·诺伊曼结构,ARM9采用五级流水线的哈佛结构。

ARM7流水线包括取指(fetch)、译码(decode)、执行(excute)。ARM7流水线在译码阶段不读取操作数寄存器,因此执行阶段的PC值和取指阶段的PC值关系为:PC(excute)=PC(fetch)+8。

ARM9流水线包括取指(fetch)、译码(decode)、执行(excute)、缓冲/数据(buffer/data)、回写(write- back)寄存器堆。ARM9流水线在译码阶段已经开始读取操作数寄存器,因此译码阶段的PC值和取指阶段的PC值关系为:PC(decode)=PC(fetch)+4。因此执行阶段的PC值和译码阶段的PC值关系为:PC(excute)=PC(decode)+4。

为了保证ARM9流水线和ARM7流水线兼容,ARM9流水线将取指阶段的PC值跨过取指和译码流水线寄存器,直接送往译码阶段寄存器,这样仍然保证执行阶段的PC值和取指阶段的PC值关系为:PC(excute)=PC(fetch)+8。

注:引用了许多博文,但无法一一找到出处,对原文博主表示感谢!

ARM的流水线与PC值的关系相关推荐

  1. arm 流水线和pc值

    "然后PC=PC+1",老师经常这么说. 这不完全正确,PC自增一的情况指出现在无流水(non-pipeline)的情况下,这个时候取指,译码,执指都是顺序执行的而在有流水的情况下 ...

  2. PC值=当前程序执行位置+8

    2019独角兽企业重金招聘Python工程师标准>>> ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供 ...

  3. ARM汇编之MOV PC,LR

    ARM汇编之MOV PC,LR BL NEXT :跳转到子程序......... :NEXT处执行NEXT..........MOV PC,LR :从子程序返回 这里的BL是跳转的意思,LR(R14) ...

  4. linux驱动调试之段错误分析_根据pc值确定出错的代码位置

    我们知道在内核里面不能够处理指向0地址的指针,我们故意引入这样一个指针,并根据打印的出错信息来进行分析,下面是我们的程序: #include <linux/module.h> #inclu ...

  5. 测试串行回收与堆初始值有关系02

    我把堆的最大的内存改大一点,改到512M,你们可以看看效果,堆的最大内存改成512,你们说一下,我把堆的最大值改成512,但是初始值还是32M,那启动的时候垃圾回收次数至少几次,猜也猜得出来,刚才我们 ...

  6. php 数组插入键和值,php数组中键和值的关系

    php数组中键和值的关系 ● php数组中键可以重复,但重复的键的值会被后面的覆盖. ● php数组中值不同键的值可以重复. ● php数组中元素可以有键也可以没有键.<?php // 键可以重 ...

  7. R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、使用rms包的Predict函数计算指定连续变量和风险比HR值的关系、可视化连续变量和风险值HR的关系

    R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型.使用rms包的Predict函数计算指定连续变量和风险比HR值的关系.可视化连续变量和风险值HR的关系 目录

  8. R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、使用rms包的Predict函数计算指定连续变量在不同分组变量下和风险比HR值的关系、使用ggplot2可视化变量与风险值HR的关系

    ↵ R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型.使用rms包的Predict函数计算指定连续变量在不同分组变量下和风险比HR值的关系.使用ggplot2可视化连续变量在不同分组变 ...

  9. R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、检验模型是否满足等比例风险、是否存在非线性关系、使用rms包的Predict函数计算指定连续变量和风险比HR值的关系并可视化

    R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型.检验模型是否满足等比例风险.是否存在非线性关系.使用rms包的Predict函数计算指定连续变量和风险比HR值的关系并可视化 目录

最新文章

  1. 【English】哈佛大学用这12张图,让你远离负能量
  2. 利用MOG2背景模型提取运动目标的OpenCV代码
  3. java安全点_关于OopMap、SafePoint(安全点)以及安全区域
  4. php 链接redis 实际例子
  5. 关于Exchang server 2010 MCITP
  6. 终极会话劫持工具SSClone
  7. HTML页面背景音乐控制
  8. 【Vegas原创】恢复Oracle Package的笨方法
  9. 使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作
  10. 正太分布几个简单证明
  11. 20191119每日一句
  12. KiCad: 一个电子原理图设计和布局创建套件
  13. 矩阵运算(一)最小二乘法
  14. CSS3颜色渐变整理
  15. 计算机职业资格证书如何在网上查询?
  16. 计算机网络-什么是网络协议?
  17. web-天下武功唯快不破
  18. 【ICPC】2019徐州 H Yuuki and a problem | 树套树、思维
  19. 海图水深点的标注方法
  20. 转载---SQL Server XML基础学习之7--XML modify() 方法对 XML 数据中插入、更新或删除...

热门文章

  1. Mac的文件比对工具:Meld、Beyond Compare
  2. go语言之行--golang核武器goroutine调度原理、channel详解
  3. C++中实现 time_t, tm 相互转换
  4. K3删除物料时提示“物料在存货表-物料中....”
  5. sql2005新增排序方法
  6. SmtpClient 身份验证失败(authentication failed) 的原因分析
  7. 解决问题 “You don't have permission to access /index.html on this server.”
  8. mysql buffer_mysql read_buffer_size 设置多少合适
  9. iOS逆向之深入解析如何计算+load方法的耗时
  10. Swift之深入解析Xcode13对Swift对象生命周期的优化