哈佛架构如何提供帮助?


13

我在读关于arduino和AVR架构的文章时,被困在一个问题上,即如何通过AVR中的哈佛架构引入来解决管道停顿或冒泡的问题。我的意思是哈佛所做的只是为数据存储器和程序存储器提供不同的存储位置。可以在没有操作员的情况下加载程序,但是如何解决上述问题呢?


2
这只是一个猜测,因此我不会作为答案发布,但是我想哈佛体系结构会有所帮助,因为不可能通过管道中的前一条指令自行修改代码。
PeterJ

1
我不确定我是否明白...您的意思是说一旦“获取”指令就无法对其进行修改或放弃?
Ayush

1
是的,这是正确的,对于非哈佛大学,因为代码可以自行更改,因此之前的指令可能会修改其后的指令。但是,稍等片刻,某个人可能会得到更明确,更明确的答案。
2013年

Answers:


9

哈佛架构曾在AVR发明之前很早就被使用过,它确实具有用于程序存储器和数据存储器的独立地址空间。这给聚会带来的是能够以一种方式设计电路的能力,使得可以使用独立的总线和控制电路来处理从程序存储器到信息流以及到数据存储器的信息流。单独总线的使用意味着程序的提取和执行可以继续进行,而不会因偶尔将数据传输到数据存储器而中断。例如,在体系结构的最简单版本中,程序获取单元可能正忙于与数据传输操作并行地获取程序序列中的下一条指令,而数据传输操作可能已经是先前程序指令的一部分。

在最简单的层次上,哈佛体系结构有一个局限性,即通常不可能将程序代码放入数据存储器中并从那里执行。

在我所描述的最简单的架构形式之上,可以添加许多变体和复杂性。一个常见的增加是在程序信息总线上增加了指令缓存,该指令缓存使指令执行单元可以更快地访问下一个程序步骤,而不必每次需要时都使用较慢的内存来提取程序步骤。


非常感谢....真的帮助我得到了它,但还有一件事...不能让我们拥有不同的总线,但是相同的内存并且可以同时工作吗?
Ayush

@Ayush-如果您有两条总线要到达相同的内存空间,则必须同时争用两个同时到达内存的内存事务请求才能进行内存访问。一个必须等​​待另一个完成!既然如此,一些设计人员已经通过将内存设计为以正常速度的两倍运行,然后让一条总线访问内存与另一条总线的访问交替来“解决”了该问题。即,事物的设计使得第一条总线始终与奇数个访问插槽同步到内存,并且(续下一条评论)
Michael Karas

(续上一条注释)第二条总线同步到内存的偶数访问插槽,然后两条总线都可以继续高速运行而不会发生内存访问争用。
Michael Karas

@MichaelKaras:一个人可以做到。另一方面,在大多数情况下,整体系统速度的主要限制因素是内存速度。如果一个内存的运行速度可能是数据或代码所需速度的两倍,那么将内存系统分成一个数据和代码运行速度将提高两倍。
超级猫

4

除了迈克尔斯的答案,还有一些注意事项:

1)哈佛体系结构不需要数据和代码有两个单独的空间,而只是(主要)通过两个不同的总线来获取它们。

2)哈佛架构解决的问题是总线争用:对于代码存储器可以足够快地提供指令以保持CPU全速运行的系统,数据获取/存储的额外负担将减慢CPU的速度。下。Hardvard体系结构解决了这个问题:内存(对于CPU的速度来说太慢了)。

请注意,缓存是解决此问题的另一种方法。Harvarding和缓存通常以有趣的组合使用。

哈佛大学使用两辆公共汽车。没有固有的理由坚持两个,在非常特殊的情况下,主要在DSP(数字信号处理器)中使用两个以上。

内存存储(在将内存访问分配给不同的芯片组的意义上)可以看作是内存系统本身内部的一种哈佛,不是基于数据/代码的区别,而是基于地址的某些位。


4
实际上,“纯”哈佛架构确实需要用于指令和数据的单独存储器(地址空间)。但是,由于这会阻止计算机自身启动,因此许多计算机都实现了“修改后的”哈佛体系结构,该体系结构允许对指令存储器进行写操作。
戴夫·特威德

除非CPU与每个存储库之间有两个(或更多)总线,否则存储库将无济于事。
戴夫特威德

@戴夫2:在某些情况下,银行业务确实有帮助,例如,如果问题是内存时序问题,并且内存总线没有阻塞(可能有多个事务未完成)。
Wouter van Ooijen

@ Dave1:您能提供参考吗?
Wouter van Ooijen

Wikipedia,也是普林斯顿大学(实际上只是Wikipedia页面的副本)。同样,大多数单芯片微控制器都是哈佛架构,许多数据手册实际上都在讨论如何提供一种自写代码闪存的机制来创建改良的哈佛架构。
戴夫·特威德

2

如果无需在代码和数据存储器之间共享资源,纯哈佛结构通常会使具有给定复杂度的计算机运行起来比冯·诺伊曼体系结构更快。如果引脚分配限制或其他因素迫使使用一条总线来访问两个存储空间,则这种优势很可能会大为废除。

“纯”哈佛体系结构将仅限于运行代码,该代码是通过处理器(而不是运行代码的处理器)通过某种机制存储在内存中的。这限制了此类体系结构在工厂(或具有专门编程设备的人员)未设定目的的设备上的使用。可以使用两种方法来缓解此问题:

某些系统具有独立的代码和存储区,但提供了特殊的硬件,可以要求这些硬件短暂接管代码总线,执行某些操作,并在操作完成后将控制权返回给CPU。一些这样的系统需要相当复杂的协议来执行这些操作,一些系统具有执行此类任务的特殊指令,还有一些甚至监视某些“数据存储器”地址并在尝试访问它们时触发接管/释放。 。这种系统的一个关键方面是,有明确定义的“代码”和“数据”存储区域;即使CPU可能读取和写入“代码”空间,也仍然认为它在语义上与数据空间不同。

在某些高端系统中使用的另一种方法是,使控制器具有两个内存总线,一个总线用于代码,一个总线用于数据,两者均连接到存储器仲裁单元。该单元依次使用各自的内存总线连接到各种内存子系统。对一个存储子系统的代码访问可以与对另一存储子系统的数据访问同时进行;只有当代码和数据尝试同时访问同一子系统时,两者中的任一个都必须等待。

在使用这种方法的系统上,程序的非关键性能部分可能会简单地忽略内存子系统之间的边界。如果代码和数据恰好位于同一个内存子系统中,则运行的速度不会像它们在单独的子系统中那样快,但是对于典型程序的许多部分而言,这将无关紧要。在典型的系统中,只有一小部分代码对性能确实很重要,并且只对系统所保存的一小部分数据起作用。如果一个系统的RAM分为16K,又分为两个8K分区,则可以使用链接程序指令来确保性能关键代码位于整个内存空间的起始位置附近,而性能关键数据则位于该位置附近。结束。如果总代码大小增加到例如9K,最后1K内的代码运行速度将比放置在其他位置的代码慢,但是该代码并不是性能关键。同样,例如,如果代码只有6K,但是数据增长到9K,则访问最低1K数据的速度将很慢,但是如果对性能至关重要的数据位于其他位置,则不会出现问题。

请注意,虽然如果代码在8K以下且数据在8K以下,则性能将是最佳的,但是上述存储系统设计不会在代码和数据空间之间强加任何严格的划分。如果程序只需要1K的数据,则代码可能会增长到15K。如果只需要2K的代码,则数据可能会增加到14K。相比拥有仅用于代码的8K区域和仅用于数据的8K区域而言,通用性要强得多。


2

尚未讨论的一个方面是,对于通常只有16位地址总线的小型微控制器,哈佛架构实际上使地址空间增加了一倍(或三倍)。您可以有64K的代码,64K的RAM和64k的内存映射的I / O(如果系统使用的是内存映射的I / O而不是端口号,则后者已经将I / O寻址与代码和RAM空间)。

否则,您必须在相同的64K地址空间内填充代码,RAM和可选的I / O地址。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.