1. 程式人生 > >哈佛結構和馮諾依曼結構詳解

哈佛結構和馮諾依曼結構詳解

備註:原文來自http://blog.sina.com.cn/s/blog_8701e6ba0102v333.html

書本上都說ARM是哈佛結構,但是我總感覺好像看不出來。後來針對S3C2440的ARM9核進行分析,我有了自己的見解。

我的結論是“ARM9被稱為是哈佛結構是從它擁有指令cache和資料cache”來說的。

原來,我懷疑S3C2440的ARM9核不是哈佛結構,是馮諾依曼結構。我的理由如下。哈佛結構要求,能同時訪問指令和資料,所以我認為一個哈佛結構要求處理器的匯流排是複雜的,應該包括程式的地址匯流排、程式的資料匯流排、資料的地址匯流排、資料的資料匯流排。但是,觀察S3C2440核發現,程式和資料最終都會被載入到RAM中執行,所以它也就只有兩條匯流排,FLASH、RAM,包括外設都是公用這兩條線。

但是,當我看到CPU核中cache分為指令cache和資料cache時,我才明白為什麼 ARM9是哈佛結構的,實際上現在稱之為“改進的哈佛結構”。需要注意的是,哈佛結構和“改進型的哈佛結構”差別很大,所以稱ARM9是哈佛結構,是不恰當的,甚至是錯誤的。 好了,我認為倘若禁止使用這兩個cache,它就不能稱之為哈佛結構,而應是馮諾依曼結構。對於ARM9是“改進型的哈佛結構”的簡單解釋是ARM9的CPU直接訪問的是cache,而cache又分為指令cache和資料cache,這兩個cache是獨立的,所以可以同時訪問指令和資料,也就是說能夠並行執行。

但是, 為什麼要設計“改進型的哈佛結構”呢?

 因為原來的馮諾依曼結構雖然資料吞吐率低,但是匯流排結構簡單,所以成本也低。哈佛結構由於複雜而又強大的匯流排結構,所以資料吞吐率高,執行速度更快,但是設計實現複雜,成本較高 。“改進型的哈佛結構”結合了兩者的長處,將其融合到一起,實現了優化。所以,在ARM9中既能看到馮諾依曼結構的影子,也能看到哈佛結構的影子。

附上網路上一個好的解釋文件如下:

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的存在,已經很好的將二者統一起來了。  (我認為這句話很經典)