几个基础材料
(源:http://jwc.seu.edu.cn/zq/signal/new/importent/zhang5_6/feng.htm
http://jwc.seu.edu.cn/zq/signal/new/importent/zhang5_6/harvard.htm
http://dingjun.net/dingjun/html/14/84FB43402106C575.html)
冯.诺曼结构
1945年,冯.诺曼首先提出了“存储程序”的概念和二进制原理,后来,人们把利用这种概念和原理设计的电子计算机系统统称为“冯.诺曼型结构”计算机。冯.诺曼结构的处理器使用同一个存储器,经由同一个总线传输,如下图所示:
图 冯.诺曼结构
冯.诺曼结构处理器具有以下几个特点:
必须有一个存储器;
必须有一个控制器;
必须有一个运算器,用于完成算术运算和逻辑运算;
必须有输入和输出设备,用于进行人机通信。
冯.诺曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此,当初选择这种结构是自然的。但是,这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。
在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯.诺曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,如下图所示,指令1至指令3均为存、取数指令,对冯.诺曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
图 冯.诺曼结构处理器指令流的定时关系示意图
哈佛结构
数字信号处理一般需要较大的运算量和较高的运算速度,为了提高数据吞吐量,在数字信号处理器中大多采用哈佛结构,如下图所示
图 哈佛结构
与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。
后来,又提出了改进的哈佛结构,如下图所示
图 改进型哈佛结构
其结构特点为:
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;
具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
两条总线由程序存储器和数据存储器分时共用。
在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯.诺曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,如下图所示,指令1至指令3均为存、取数指令,对冯.诺曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。
图 冯.诺曼结构处理器指令流的定时关系示意图
如果采用哈佛结构处理以上同样的3条存取数指令,如下图所示,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。
哈佛结构强调了总的系统速度以及通讯和处理器配置方面的灵活性。
图 哈佛结构处理器指令流的定时关系示意图
-------------------------------------------------------
arm7系列的CPU有很多款,其中部分CPU没有内部cache的,比如arm7TDMI,就是纯粹的冯·诺依曼结构,其他有内部cache、且数据和指令的cache分离的cpu则使用了哈弗结构。
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。“程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度”,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。
目前使用哈佛结构的中央处理器和微控制器有很多,除了Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11。
哈佛结构是指“程序和数据空间独立的体系结构”, 目的是为了减轻程序运行时的访存瓶颈。
例如最常见的卷积运算中, 一条指令同时取两个操作数, 在流水线处理时, 同时还有一个取指操作, 如果程序和数据通过一条总线访问, 取指和取数必会产生冲突, 而这对大运算量的循环的执行效率是很不利的。
哈佛结构能基本上解决取指和取数的冲突问题。
而对另一个操作数的访问, 就只能采用Enhanced哈佛结构了, 例如像TI那样,数据区再split, 并多一组总线。 或向AD那样,采用指令cache, 指令区可存放一部分数据。
冯·诺依曼体系和哈佛总线体系的区别
二者的区别就是“程序空间和数据空间是否是一体”的。冯·诺依曼结构数据空间和地址空间不分开,哈佛结构数据空间和地址空间是分开的。
早期的微处理器大多采用冯·诺依曼结构,典型代表是Intel公司的X86微处理器。取指和取操作数都在同一总线上,通过分时服用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。
哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指和取操作数,从而大大提高了运算能力。
DSP芯片硬件结构有冯·诺依曼结构和哈佛结构,两者区别是地址空间和数据空间分开与否。一般DSP都是采用改进型哈佛结构,就是分开的数据空间和地址空间都不只是一条,而是有多条,这根据不同的生产厂商的DSP芯片有所不同。在对外寻址方面从逻辑上来说也是一样,因为外部引脚的原因,一般来说都是通过相应的空间选取来实现的。本质上是同样的道理。
--------------------------------------------------------
http://blog.sina.com.cn/s/blog_4c60c6360100f9bs.html
是什么结构要看总线结构的。51单片机虽然数据指令存储区是分开的,但总线是分时复用得,所以顶多算改进型的哈佛结构。ARM9虽然是哈佛结构,但是之前的版本也还是冯·诺依曼结构。早期的X86能迅速占有市场,一条很重要的原因,正是靠了冯·诺依曼这种实现简单,成本低的总线结构。现在的处理器虽然外部总线上看是诺依曼结构的,但是由于内部CACHE的存在,因此实际上内部来看已经算是改进型哈佛结构的了。至于优缺点,哈佛结构就是复杂,对外围设备的连接与处理要求高,十分不适合外围存储器的扩展。所以早期通用CPU难以采用这种结构。而单片机,由于内部集成了所需的存储器,所以采用哈佛结构也未尝不可。现在的处理器,依托CACHE的存在,已经很好的将二者统一起来了。
冯诺依曼结构中执行取指令后在执行译码时,还可以再取啊,就像流水线,没必要等一条完了再去取指令啊。只不过哈佛能同时取数据和指令罢了。
--------------------------------------------------------
http://bbs.weeqoo.com/bbsdetail-271991-18.html
MCS-51单片机有着嵌入式处理器经典的体系结构,这种体系结构在当前嵌入式处理器的高端ARM系列上仍然在延续,这就是哈佛结构。相对于大名鼎鼎的冯·诺依曼结构,哈佛结构的知名度显然逊色许多,但在嵌入式应用领域,哈佛结构却拥有着绝对的优势。哈佛结构与冯·诺依曼结构的最大区别在于冯·诺依曼结构的计算机采用代码与数据的统一编址,而哈佛结构是独立编址的,代码空间与数据空间完全分开。
在通用计算机系统中,应用软件的多样性使得计算机要不断地变化所执行的代码的内容,并且频繁地对数据与代码占有的存储器进行重新分配,这种情况下,冯·诺依曼结构占有绝对优势,因为统一编址可以最大限度地利用资源,而哈佛结构的计算机若应用于这种情形下则会对存储器资源产生理论上最大可达50%的浪费,这显然是不合理的。
但是在嵌入式应用中,系统要执行的任务相对单一,程序一般是固化在硬件里。当然这时使用冯·诺依曼结构也完全可以,代码区和数据区在编译时一次性分配好了而已,但是其灵活性得不到体现,所以现在大量的单片机也还在沿用冯·诺依曼结构,如TI的MSP430系列、Freescale的HCS08系列等。
那是为什么说哈佛结构有优势呢?嵌入式计算机在工作时与通用计算机有着一些区别:嵌入式计算机在工作期间的绝大部分时间是无人值守的,而通用计算机工作期间一般是有人操作的;嵌入式计算机的故障可能会导致灾难性的后果,而通用计算机一般就是死死机,重新启动即可。这两点决定了对嵌入式计算机的一个基本要求:可靠性。
使用冯·诺依曼结构的计算机,程序空间不封闭,其程序空间的数据在运行期理论上可以被修改,此外程序一旦跑飞也有可能运行到数据区。虽然都是一些不常见的特殊情况下,但是看看哈佛结构的计算机在这些情况下是怎样的:基于哈佛结构的处理器如MCS-51,不需要可以对代码段进行写操作的指令,所以不会有代码区被改写的问题;程序只能在封闭的代码区中运行,不可能跑到数据区,这也是跑飞的几率减少并且跑飞后的行为有规律(数据区的数据是不断变化的而代码区是不变的)。
所以,相对于冯·诺依曼结构,哈佛结构更加适合于那些程序固化、任务相对简单的控制系统。
说MCS-51是冯-诺依曼型是不正确的,绝大多数51单片机都是哈佛结构,PIC从12-33都是哈佛结构。
补充一下:【哈佛结构】是不允许同时访问RAM和FLASH/ROM的。只有【改进的哈佛结构】才可以同时访问RAM和FLASH/ROM。51系列部分单片机已经在低端产品上使用了流水线技术(但没有锁相环),而PIC 16位机都没有流水线(有锁相环)。 在执行速度上算是平分秋色吧。
--------------------------------------------------------
哈佛结构冯诺依曼结构与地址是否复用没有关系
(源:http://modayu838.blog.163.com/blog/static/6443111920096631450970/)
关于这个问题,有人说51地址线复用,就是冯诺依曼结构。
很多入门的书上基本上都说:由运算器、控制器、存储器、输入设备、输出设备组成的系统都叫冯氏结构。也有的说:“程序存储器的数据线地址线”与“数据存储器的数据线地址线”共用的话,就是冯氏结构,所以51是该结构。(我认为说得太绝对了)
我认为冯氏结构与哈佛结构的区别应该在存储器的空间分别上,哈佛结构的数据区和代码区是分开的,它们即使地址相同,但空间也是不同的,主要表现在数据不能够当作代码来运行。
口线复用,就将它认为成冯氏结构,我认为这样不足取,应该是按照空间是否完全重合来辨别。比如PC机的代码空间和数据空间是同一空间,所以是冯氏结构;51由于IO口不够,但代码空间和数据空间是分开的,所以还是哈佛结构。
另外,CISC/RISC 、地址是否复用、是哪种结构这三者都没有必然的关系。只不过 RISC因为精简了指令集,没有了执行复杂功能的指令,为了提高性能,常采用哈佛结构,并且不复用地址线。
补充:有本书:嵌入式微处理器系统设计实例,英文版 embedded microprocessor systems:real world design third edition 上有这样一个提法 : 大多数采用哈佛结构的微处理器实际上使用的是一种经过改进的哈佛结构体系,在改进结构下,虽然代码和数据还是分开的,但该体系支持从代码区载入有限的数据,这但允许数据表和其他信和与代码一起被编译,并可在运行时使用这些数据。
摘抄一段:
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11,51单片机也属于哈佛结构
冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。
目前使用冯·诺伊曼结构的中央处理器和微控制器有很多。除了上面提到的英特尔公司的8086,英特尔公司的其他中央处理器、ARM公司的ARM7、MIPS公司的MIPS处理器也采用了冯·诺伊曼结构。
在DSP算法中,最大量的工作之一是与存储器交换信息,这其中包括作为输入信号的采样数据、滤波器系数和程序指令。冯.诺依曼结构中,只有一个存储器,通过一条总线来传送数据。乘两个数至少需要3个指令周期,即通过总线将这3个数从存储器中送到CPU。所以这种结构在面对高速、实时处理时,不可避免地造成总线拥挤。为此,哈佛大学提出了与冯.诺依曼结构完全不同的另一种计算机结构,人们习惯称之为哈佛结构。它根据数据和数据指令将存储器和总线分开。因此,总线操作是独立的,能同时取指令和数据,提高了速度。目前DSP内部一般采用的是哈佛结构,它在片内至少有4套总线:程序的数据总线,程序的地址总线,数据的数据总线和数据的地址总线。这种分离的程序总线和数据总线,可允许同时获取指令字(来自程序存储器)和操作数(来自数据存储器),而互不干扰。这意味着在一个机器周期内可以同时准备好指令和操作数。超级哈佛结构(super Harvard architecture,缩写为SHARC)如图(c)所示,它在哈佛结构上增加了指令cache(缓存)和专用的I/O控制器。
评论:哈佛结构和冯.诺依曼结构都是一种存储器结构。哈佛结构是将指令存储器和数据存储器分开的一种存储器结构;而冯.诺依曼结构将指令存储器和数据存储器合在一起的存储器结构。
[/img]
图2 Harvard architecture
哈佛结构采用数据存储器与程序代码存储器分开,各自有自己的数据总线与地址总线。但这是需要CPU提供大量的数据线,因而很少使用哈佛结构作为CPU外部构架来使用。但是对于 CPU内部,通过使用不同的数据和指令cache,可以有效的提高指令执行的效率,因而目前大部分计算机体系都是CPU内部的哈弗结构+CPU外部的冯·诺伊曼的结构。
----------------------------------------------------------
http://www.52rd.com/blog/Archive_Thread.asp?SID=18056
这里介绍两种主流的计算机体系结构:
RISC(Riduced Instruction Set Computer)精简指令集计算机
CISC(Complex Instruction Set Computer)复杂指令集计算机
所谓"体系结构",是指程序员在某CPU上进行程序设计时能够使用的“处理器资源”,其中最重要的是处理器所提供的指令系统和寄存器组。注意体系结构 (architecture)和组成(structure)的区别:前者是处理器的逻辑抽象,是程序员关注的部分。后者是具体实现,一般为计算机系统设计人员关注。一般来说,arachitecture,structure是不同层次的概念,但两者也有一定的联系。
以指令系统的设计为例:相同的指令系统可以通过“硬连接”或“微程序”的方法来实现。前者通过CPU的硬件电路来实现,后者通过"微程序"来实现。如果指令集以硬连接实现,那么对于复杂指令来说,电路设计就非常困难;反之,若用微程序来实现指令集,可以实现复杂指令。现代CISC处理器一般都使用微码来实现。
在使用微码技术的处理器中,实际存在着两套不同层次的指令:一套是面向程序员的,高层的指令;一套是面向硬件实现的,底层的微码。在指令与微码之间存在着一个“解释器”,它将指令翻译成对应的微码序列。由此可以想象,指令与微码之间的关系实际上时“子程序调用”思想的推广。
对于CISC和RISC的实现而言, 它们所侧重的复杂性不同: CISC处理器的实现复杂性更高, 而RISC编译器的复杂性更高. |
微码相对于指令的特点:
1,微码代表的都是非常简单的基本操作,而指令可能非常复杂。
2,微码的取指操作很快:“所有的微码都位于ROM中,而指令位于内存中”。[note_1]
3,微码的格式很规则,简单。因此易于译码。
4,微码的执行速度很快,而指令相对较慢。
从处理器架构来看,可以将使用微码技术的现代CISC的基本单元视为一个快速的RISC内核。这样问题就出来了:如果不引入“解释器”,而直接使用 RISC微码作为指令,那会怎样呢?——这正是RISC的思想。
下面我们来看看使用微码实现的CISC指令集的优缺点:
CISC指令集又复杂化的倾向,即向高级语言看齐,处理器厂商纷纷提供一些功能强大的复杂指令,例如:Intel针对X86处理器在MOVE基础上提供了 “成串”MOVE指令,可以将内存中数据按字节成块复制,相当于:
while (n--) *dest++ = *src++; |
这方便于复制数据结构。对于其他的复杂操作,也可以通过一条指令就实现。CISC复杂指令的寻址方式也种类繁多,操作数可以直接来自内存。但复杂指令为现代处理器技术中广泛使用的流水线技术引入了问题:在微处理器中指令的执行一般分为“预指”,“取操作数”,“运算”,“存放”等操作。对于CISC 复杂指令,他们的执行时间各不相同[note_2](有的可在4,5个时钟周期内完成,有的却需要几十个,即便对于简单指令,也会由于寻址方式的不同造成不同的执行时间)。更糟糕的是,指令长度也不一致,同一指令的长度也会因不同的寻址方式而变化。针对这些指令,如何设计流水线长度呢?若按最短指令设计流水线,当碰到复杂指令时流水线就会发生中断;若按最长指令设计流水线,执行较短指令时就会跳过某些工位,使流水线不能完全充满。
针对上述情况,以及20-80定律(80%的情况下执行的是占指令集20%的常用指令)。多数复杂指令很少用到。当使用高级语言进行程序设计时,编译器为了兼容早期的CPU,一般不会生成特殊的复杂指令。如果舍弃这些不常用的复杂指令,就能简化CPU的设计。这正是RISC的出发点。
RISC的特点
1,RISC指令系统较小:种类的数量较少,只提供简单指令。这些指令大多都能在4,5个时钟周期内完成。
2,指令的操作数必须预存于寄存器中,这样取指操作的时间也统一了。
3,指令长度,寻址方式,格式都整齐划一:这样可以充分利用流水线,基本上可实现一个时钟脉冲执行一条指令的目标。
4,RISC的子程序调用与CISC的不同:在CISC中,程序调用、返回时需将上下文保存在堆栈中,需要内存操作。而RISC将它们存放在寄存器中,而且参数也使用寄存器传递。(若存在嵌套的子程序调用,中间调用过程中的上下文还是要从寄存器"溅出"(spill)到堆栈中,而"叶"子程序不需要。)
5,RISC中断可视为特殊的子程序链接:CISC中发生中断时,所有的寄存器内容都被压入堆栈,而RISC对中断进行区分对待,分为轻量级和重量级。对轻量级中断只保存需要保存的寄存器内容;对重量级中断的处理如同常规中断。
6,RISC都采用流水线、高速缓存、不使用微码。
当然,RISC也有它的缺点:代码密度不高,可执行文件体积较大,汇编代码可读性较差。代码密度不高是个值得关注的问题:若不使用cache,会需要更大的指令存储空间,取指时也占用更大的存储器带宽。若采用cache,又会降低cache的命中率。
RISC vs ARM
作为RISC的新秀,ARM有它自己的特点。下文介绍ARM与RISC的比较,并归纳一下人们对RISC概念理解的误区:
ARM的独特
1,ARM可提供压缩形式的指令集:Thumb,它将ARM指令集的一个子集编码为16位指令。处理器在执行时可以切换到执行Thumb指令模式。
2,在算术指令中,可以将第二操作数在运算之前移位(如:LDREQ R0,[R1,R2,LSR #16]!)。注意:移位通过组合电路完成,而不需时钟脉冲的作用,所以不影响指令执行时间。
3,ARM支持指令的条件执行。一般处理器都只支持指令的条件转移。条件转移会使已在流水线中的后续指令作废,使流水线"断流",而条件执行避免了此情况。(当一个条件执行部分的大小超过3条指令时,还是使用条件转移指令为好)。
4,指令的执行结果是否影响程序状态寄存器中的标志位由程序员决定:在操作码后加上s(如:add - adds)就可以使运算结果改变标志位。
对RISC,CISC看法的”误区“
1,RISC指令都是简单指令。
看看前面的LDREQ R0,[R1,R2,LSR #16]!指令,它的强大使一般的CISC处理器也望尘莫及。RISC的"简单"之处,在于“指令集的执行时间、指令长度、指令格式整齐划一”。
2,CISC的复杂指令速度慢、执行效率很低。
现代的CISC处理器具有非常长的流水线(PIII采用了25级的流水线),对指令的执行作了充分的优化。但RISC的优势在于:不管是老的CPU,还是新的CPU,指令执行时间都是相同的,不需要在对指令执行作出优化。而同样的复杂指令,在CPU时钟频率相同的情况下,在PIII上的执行周期可能比在 386上的执行周期短很多。即CISC处理器通过对处理器的不断优化来提升指令提升速率,同样的指令,关注其执行速度时,就要考虑到采用何种CPU,而 RISC则不然。
3,RISC处理器比CISC处理器需要更多的寄存器.
这不是一个需求问题,而是一个实现问题:RISC处理器设计比CISC简单,处理器占用较少的空间,从而腾出了空间来放置寄存器。CISC也可以由很多寄存器(68000拥有和ARM同样多的寄存器)。当然,这个观念也不完全错误,就RISC的程序设计来说,它需要比较多的寄存器。
4,RISC都有流水线。
ARM2就没有采用流水线。
总之,RISC处理器设计的简单性使得RISC处理器在体积、功耗、散热、造价上都有优势。
[note_1] 哈佛结构,冯.诺依曼结构介绍:
冯.诺依曼(Von Neumann)指出:程序只是一种(特殊)的数据,它可以像数据一样被处理,因此可以和数据一起被存储在同一个存储器中——这就是著名的冯.诺依曼原理。
现代的通过计算机都是基于冯.诺依曼结构:可执行程序映象位于磁盘中,运行时,OS将它加载到内存中。
但在用于I/O比较频繁,I/O数据量大的情况下(比如网络处理器),冯.诺依曼结构就引入了瓶颈:设想一下,当外设发起一个DMA请求并得到CPU的许可时,总线被外设所占用,CPU暂时放弃了对总线的控制,它无法访问内存来取指。早期未实现流水线的CPU采用"周期挪用"技术,利用CPU访问内存的空闲时钟周期进行DMA,解决了CPU与DMA在总线上相互排斥的问题。但随着流水线的采用,特别时在RISC处理器中,CPU在取指的同时也执行指令,内存访问已经没有空闲的时钟周期了。对于拥有较多寄存器的RISC处理器来说,数据往往就位于寄存器中,在进行DMA的时候,CPU可以执行指令。但当 CPU从内存中取指时,由于总线被外设占用,流水线被破坏。
针对上述问题,哈佛结构也许是个解决办法:在嵌入式系统中,倾向于采用分别使用程序和数据两个存储器、两条总线的"哈佛结构"。在哈佛结构下,即使数据总线被占用,CPU也能进行取指(当CPU需要访问数据内存时,它不得不停下来)。
实际上,现代处理器都广泛采用了缓存技术,取指、取数据都通过cache来进行。对cache,也可分为哈佛结构和冯.诺依曼结构:是采用一个统一的 cache,还是分成数据和程序两个cache(这种情况被称为改进的哈佛结构)?在采用了流水线的CPU中,理想情况下CPU在每个时钟周期都需要取指,如果同时流水线中执行的指令需要访问内存,那两者就相互冲突了。要么让流水线暂停一拍,不取指;要么采用哈佛结构的cache,取指和访内井水不犯河水。
[note_2] 关于周期的概念:
执行一条指令所需要的时间称为指令周期,指令周期常常用若干个时钟周期来表示。
时钟脉冲的重复周期称为时钟周期,时钟周期是CPU的基本时间计量单位,它由计算机主频决定。
一个CPU同外部设备和内存储器之间进行信息交换过程所需要的时间称为总线周期。
关于RISC,CISC,看这里!
-----------------------------------------------------------------
http://blog.ednchina.com/jerryer/12929/message.aspx
看RISC CPU的设计,才发现自己本科真的什么也没有学过,呵呵,感谢King,正是由于跟她针锋相对的讨论,自己才会不断查找资料下去,自己也才总算有了一点点概念,现整理一下。
传统意义上的精简指令集计算机(RISC)和复杂指令集计算机(CISC)在基本原理上就存在着差异。但是,现代的微控制器技术正在不断缩小着RISC架构和CISC架构之间的差异。
差异由来已久
RISC机型拥有一个有限的指令集合,并且能够极快地执行每一条指令。但是由于缺乏复杂指令,因此需要在软件方面进行大量的工作。RISC方案的另一个优势在于有限的指令数量能够产生一个很小的核心。但由于使用精简指令所编写出来的代码会更长,所以执行任务所需的内存也就更大。因此,对于复杂的程序来说,由于要考虑到各种可能的情况,最终的程序代码可能非常大。
RISC指令集有许多特征,其中最重要的有:
指令种类少,指令格式规范:RISC指令集通常只使用一种或少数几种格式。指令长度单一(一般4个字节),并且在字边界上对齐,字段位置、特别是操作码的位置是固定的。
寻址方式简化:几乎所有指令都使用寄存器寻址方式,寻址方式总数一般不超过5个。其他更为复杂的寻址方式,如间接寻址等则由软件利用简单的寻址方式来合成。
大量利用寄存器间操作:RISC指令集中大多数操作都是寄存器到寄存器操作,只以简单的Load和Store操作访问内存。因此,每条指令中访问的内存地址不会超过1个,访问内存的操作不会与算术操作混在一起。
简化处理器结构:使用RISC指令集,可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,而不必像CISC处理器那样使用微程序来实现指令操作。因此RISC处理器不必像CISC处理器那样设置微程序控制存储器,就能够快速地直接执行指令。
另一方面,CISC机型有着丰富的指令集合,使计算机能够利用一两条指令就能执行非常复杂的操作,原因在于它通过运行一条内部微代码而把汇编指令分解成若干条内部微代码指令。这样做,设备的负担就不是很高,而且代码的分布密度也恰到好处。虽然CISC机型下的内核代码要比相应的RISC机型大许多,但由于代码密度分布合理,而且考虑到内存的因素,最终所产生的代码长度就没有RISC产生的那么大。
体系结构的差异更重要
微控制器之间的各种差异要比RISC和CISC种类上的差异重要得多。冯.诺依曼体系结构(Von Neuman)与哈佛体系结构(Harvard)之争就是此类差异之一。另外一种就是基于寄存器体系结构和基于累加器体系结构的差异。在冯.诺依曼体系结构中,数据和程序存储器是共享数据总线的。数据总线共享有很多优点,比如减小总线的开销。另外一个优点在于能够把RAM映射到程序空间,这样设备也能访问EEPROM中的内存。
而对于哈佛体系结构的计算机,程序和数据总线是分开的。这种方式的优势在于能够在一个时钟周期内同时读取程序和数据,这样就相应地减少了执行每一条指令所需的时钟周期。早期的哈佛架构的计算机是不能把查找表储存在程序存储器中的,而这个问题在现在的大多数设备中已经解决了。
哈佛体系结构计算机中存在的另外一个问题就是,如果要和外部的程序和数据存储器进行交互,对于两部分存储器来说,由于地址总线和数据总线的相互独立性,就需要额外增加大量的芯片管脚。因此,只有当至少有一种存储器的类型是内部的情况下,微处理器才会采用哈佛体系结构。
在基于累加器体系结构中,累加器既是数学运算单元(ALU)的数据源之一,又是ALU存放操作结果的地方。通常基于累加器体系结构的微处理器,能够在累加器与程序存储器中任何位置的存储单元或是RAM之间进行各种数学或逻辑操作。这种架构的优势就在于对于内存地址的访问更为方便快捷。
基于寄存器体系结构的微处理器中,会有一系列的寄存器直接与ALU相连。这种情况的好处在于不需要把所有的数据都压进一个累加器中,从而减少了许多在累加器架构中存在的“move”指令。因此,与把所有数据都要推进累加器中的情况相比,基于寄存器架构的微处理器大大提高了ALU的吞吐能力。
陈旧的体系差异明显
对于8位微处理器来说,能够很容易地区分RISC和CISC之间的不同。最主要的原因就是这些体系结构,除了少数例外,要比相应的32位微处理器陈旧得多。CISC体系结构的一个经典例子就是摩托罗拉开发的HC11系列。HC11核心处理器诞生于1984年。这种系列的微处理器拥有300多条指令,代码密度分布非常合理。HC11使用的是带有两个累加器的冯?诺依曼体系结构。由于所有的复杂指令都是在核心中完成的,所以执行每条指令的时间就很长。指令周期从8个时钟周期到164个时钟周期。核心过大导致处理器的最高主频不超过12MHz,这样的性能要远远低于某些RISC机型。
传统的8位RISC微处理器的一个例子就是由Microchip开发的PIC16C54。Microchip在1990年的时候把它推向市场。它采用的是一个基于单累加器的哈佛体系结构设备,使用有限指令集合。这样微处理器在执行每一条单个指令所需时间就很小。但是33条指令加上一页内存,生成的代码长度几乎是同种情况下HC11所得代码的两倍多。
新技术使得差异在减小
CISC控制器在实现了管道技术之后,使得一条指令基本上在一个时钟周期之内就能够执行完,很大地改善了机器性能。但是,这种流水线操作有个很大的弊病在于每次的跳转或者执行分支指令,又或者是中断发生,都有可能导致管道内数据泛滥,反而导致更长的指令周期。虽然有一些方法能够降低这种不良效果,但是基本上都需要在软件中进行大量处理而最终会降低许多应用程序代码效率。
随着技术的进步,RISC和CISC机型之间的鸿沟已经越来越小,特别是对于市场的高端用户来说,这种差异已经逐渐变得难以区分了。
RISC是精简指令集计算机,现在很多嵌入式微处理器都是RISC,例如常用的ARM,MIPS, POWERPC等。它有一个特征就是指令是等长的。这就为提高执行指令的效率提供了方便,大部分处理器可以做到平均一个时种处理一条指令。CISC是复杂指令集计算机。如X86系列,TI的DSP系列,指令是不等长的。但是一条指令可以完成RISC的好几条指令能完成的任务。这两种处理器各有所唱,都在发展当中。
哈佛结构和冯.诺依曼结构主要是指存储器结构,而非指令系统结构,与指令系统没有严格的对应关系。
MCS-51是哈佛结构,指令系统是CISC指令。
PIC单片机是哈佛结构,指令系统是RISC指令。
冯.诺曼结构
冯.诺曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此,当初选择这种结构是自然的。但是,这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。
哈佛结构
与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联