冯诺依曼结构与哈佛结构

一、概念解释
先对两个结构做一个基础解释 。
1、冯·诺依曼结构
冯·诺依曼结构又称作普林斯顿体系结构,其具有以下几个特点:
必须有一个存储器;
必须有一个控制器;
必须有一个运算器,用于完成算术运算和逻辑运算;
必须有输入和输出设备,用于进行人机通信 。其结构如图1所示 。

冯诺依曼结构与哈佛结构

文章插图
在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令 。对冯·诺依曼结构处理器,由于没有区分程序存储器和数据存储器,取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个,影响了数据处理速度 。当然,其简单的结构相对于哈佛结构也更容易设计 。
属于这种结构的微处理器有:Intel公司的8086系列,以及ARM公司的ARM7系列,还有最出名的intel公司的x86系列 。
图1冯·诺依曼结构
2、哈佛结构
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,如图2所示 。哈佛结构中程序空间和数据空间是独立的,具有各自独立的地址线和数据总线,即处理器有两套总线,一套是程序存储器的数据和地址总线,一套是数据存储器的数据和地址总线,取址和取数据能并发进行 。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度;同时取指令和取数据可以同时进行,较同类冯·诺伊曼结构微处理器指令执行效率更高,速度也更快 。当然,其设计上也会更加复杂 。
图2哈佛结构
冯诺依曼结构与哈佛结构

文章插图
属于哈佛结构的处理器有很多,比如ARM公司的ARM9,ARM11,-M3内核的产品,以及大家最熟悉的51系列产品 。
二、疑问解答
【冯诺依曼结构与哈佛结构】你可能会有疑问,为什么51为什么不是冯诺依曼结构 。明明很多入门的书上基本上都说:由运算器、控制器、存储器、输入设备、输出设备组成的系统都叫冯氏结构;其次,51单片机只有一套数据总线和地址总线;最后,51执行的时候并不能同时取数据与取程序 。
最初我也是这么想的,因为如果51是哈佛结构,针对程序存储器和数据存储器,其应该有不同的数据总线和地址总线将其区分,而显然它没有这么多总线 。后来查阅了各种资料,发现现如今对哈佛结构的要求其实远没有这么高,只要能有任何方式区分出程序存储器和数据存储器,其就是哈佛结构 。例如,51虽然只有一套总线,但其仍能通过不同的控制口的控制信号区分数据存储器和程序存储器 。它们即使地址相同,但空间也是不同的,采用分时复用技术即可解决 。
现如今常用的stm32单片机,如果你去查阅其用户手册,也会发现它的flash与sram是在同一个地址空间的,只是开始和结束地址不同而已 。那为什么它也是哈佛结构呢?这里要引入一个概念:数据cache和程序cache 。
Cache出现的主要原因是CPU的速度和内存的速度之间严重不匹配,CPU处理速度极快,而访问内存慢,cache在这个背景下就诞生了 。设计人员通过在CPU和内存之间建立一个缓冲区cache,提高访问的速度 。
建立cache的好处在于:假设CPU和内存之间没有cache,那么CPU每次访问内存,都要从访问速度较慢的内存中读取,这无疑是很浪费CPU的性能的;但是如果在CPU和内存之间设立一个高速的cache,虽然第一次读,都要从内存中读取,但是第一次读完成之后,可以把一整块数据放到这个高速cache里;那么第二次读,我就直接从高速cache里取数据就行,这个高速cache的速度基本上是和CPU匹配的,比内存速度快很多 。这样的,CPU第2次,第3次去读这个数据的时候,就得到加速的效果了 。这也是设计cache的最初的初衷 。