二者的區(qū)別是馮諾伊曼結(jié)構(gòu)的程序空間(地址空間)和數(shù)據(jù)空間不分開,,而哈佛結(jié)構(gòu)的程序空間分開,。
哈佛結(jié)構(gòu)強調(diào)了總體的系統(tǒng)速度以及通訊和處理器配置方面的靈活性,重在對效率的要求,,似乎從這點就可以看到馮諾伊曼的局限性及不足,,
關(guān)于這個問題,有人說51地址線復(fù)用,,就是馮諾依曼結(jié)構(gòu),。
很多入門的書上基本上都說:由運算器、控制器,、存儲器,、輸入設(shè)備、輸出設(shè)備組成的系統(tǒng) 都叫馮氏結(jié)構(gòu),。
也有的說:“程序存儲器的數(shù)據(jù)線地址線”與“數(shù)據(jù)存儲器的數(shù)據(jù)線地址線”共用的話,,就是馮氏結(jié)構(gòu),所以51是該結(jié)構(gòu),。(我認(rèn)為說得太絕對了)
我認(rèn)為馮氏結(jié)構(gòu)與哈佛結(jié)構(gòu)的區(qū)別應(yīng)該在存儲器的空間分別上,哈佛結(jié)構(gòu)的數(shù)據(jù)區(qū)和代碼區(qū)是分開的,,它們即使地址相同,但空間也是不同的,,主要表現(xiàn)在數(shù)據(jù)不能夠當(dāng)作代碼來運行。(比如51---注)
口線復(fù)用,,就將它認(rèn)為成馮氏結(jié)構(gòu),我認(rèn)為這樣不足取,,應(yīng)該是按照空間是否完全重合來辨別。比如PC機的代空間和數(shù)據(jù)空間是同一空間,,所以是馮氏結(jié)構(gòu);51由于IO口不夠,,但代碼空間和數(shù)據(jù)空間是分開的,所以還是哈佛構(gòu).(此種觀點才是正確的--注)
另外,,還有的把CISC RISC 和地址是否復(fù)用與是哪種結(jié)構(gòu) 這3這都混到一起,。我認(rèn)為這三者都沒有必然的關(guān)系,。只不過 RISC因為精簡了指令集,沒有了執(zhí)行復(fù)雜功能的指令,,為了提高性能,常采用哈佛結(jié)構(gòu),,并且不復(fù)用地址線。(這種說法不具體,有待補充---注)
材料二:
哈佛結(jié)構(gòu)是一種將程序指令存儲和數(shù)據(jù)存儲分開的存儲器結(jié)構(gòu),。中央處理器首先到程序指令存儲器中讀取程序指令內(nèi)容,解碼后得到數(shù)據(jù)地址,,再到相應(yīng)的數(shù)據(jù)存儲器中讀取數(shù)據(jù),并進(jìn)行下一步的操作(通常是執(zhí)行),。程序指令存儲和數(shù)據(jù)存儲分開,,可以使指令和數(shù)據(jù)有不同的數(shù)據(jù)寬度,,如Microchip公司的 PIC16芯片的程序指令是14位寬度,,而數(shù)據(jù)是8位寬度。
目前使用哈佛結(jié)構(gòu)的中央處理器和微控制器有很多,,除了上面提到的Microchip公司的PIC系列芯片,,還有摩托羅拉公司的MC68系列,、Zilog公司的Z8系列,、ATMEL公司的AVR系列和安謀公司的ARM9、ARM10和ARM11,,51單片機也屬于哈佛結(jié)構(gòu)
馮·諾伊曼結(jié)構(gòu)也稱普林斯頓結(jié)構(gòu),是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的存儲器結(jié)構(gòu),。程序指令存儲地址和數(shù)據(jù)存儲地址指向同一個存儲器的不同物理位置,,因此程序指令和數(shù)據(jù)的寬度相同,如英特爾公司的8086中央處理器的程序指令和數(shù)據(jù)都是16位寬,。
目前使用馮·諾伊曼結(jié)構(gòu)的中央處理器和微控制器有很多,。除了上面提到的英特爾公司的8086,,英特爾公司的其他中央處理器、安謀公司的ARM7,、MIPS公司的MIPS處理器也采用了馮·諾伊曼結(jié)構(gòu),。
評論:哈佛結(jié)構(gòu)和馮.諾依曼結(jié)構(gòu)都是一種存儲器結(jié)構(gòu),。哈佛結(jié)構(gòu)是將指令存儲器和數(shù)據(jù)存儲器分開的一種存儲器結(jié)構(gòu),;而馮.諾依曼結(jié)構(gòu)將指令存儲器和數(shù)據(jù)存儲器合在一起的存儲器結(jié)構(gòu),。-----注
材料三:
MCS-51單片機有著嵌入式處理器經(jīng)典的體系結(jié)構(gòu),這種體系結(jié)構(gòu)在當(dāng)前嵌入式處理器的高端ARM系列上仍然在延續(xù),,這就是哈佛結(jié)構(gòu)。相對于大名鼎鼎的馮·諾依曼結(jié)構(gòu),,哈佛結(jié)構(gòu)的知名度顯然遜色許多,但在嵌入式應(yīng)用領(lǐng)域,,哈佛結(jié)構(gòu)卻擁有著絕對的優(yōu)勢,。哈佛結(jié)構(gòu)與馮·諾依曼結(jié)構(gòu)的最大區(qū)別在于馮·諾依曼結(jié)構(gòu)的計算機采用代碼與數(shù)據(jù)的統(tǒng)一編址,,而哈佛結(jié)構(gòu)是獨立編址的,代碼空間與數(shù)據(jù)空間完全分開,。
在通用計算機系統(tǒng)中,應(yīng)用軟件的多樣性使得計算機要不斷地變化所執(zhí)行的代碼的內(nèi)容,,并且頻繁地對數(shù)據(jù)與代碼占有的存儲器進(jìn)行重新分配,,這種情況下,,馮·諾依曼結(jié)構(gòu)占有絕對優(yōu)勢,因為統(tǒng)一編址可以最大限度地利用資源,,而哈佛結(jié)構(gòu)的計算機若應(yīng)用于這種情形下則會對存儲器資源產(chǎn)生理論上最大可達(dá)50%的浪費,這顯然是不合理的,。
但是在嵌入式應(yīng)用中,系統(tǒng)要執(zhí)行的任務(wù)相對單一,,程序一般是固化在硬件里,。當(dāng)然這時使用馮· 諾依曼結(jié)構(gòu)也完全可以,代碼區(qū)和數(shù)據(jù)區(qū)在編譯時一次性分配好了而已,,但是其靈活性得不到體現(xiàn),所以現(xiàn)在大量的單片機也還在沿用馮·諾依曼結(jié)構(gòu),,如TI的 MSP430系列、Freescale的HCS08系列等,。
那是為什么說哈佛結(jié)構(gòu)有優(yōu)勢呢,?嵌入式計算機在工作時與通用計算機有著一些區(qū)別:嵌入式計算機在工作期間的絕大部分時間是無人值守的,,而通用計算機工作期間一般是有人操作的;嵌入式計算機的故障可能會導(dǎo)致災(zāi)難性的后果,,而通用計算機一般就是死死機,重新啟動即可,。這兩點決定了對嵌入式計算機的一個基本要求:可靠性。
使用馮·諾依曼結(jié)構(gòu)的計算機,,程序空間不封閉,期程序空間的數(shù)據(jù)在運行期理論上可以被修改,,此外程序一旦跑飛也有可能運行到數(shù)據(jù)區(qū)。雖然都是一些不常見的特殊情況下,,但是看看哈佛結(jié)構(gòu)德計算機在這些情況下是怎樣的:基于哈佛結(jié)構(gòu)的處理器入 MCS-51,不需要可以對代碼段進(jìn)行寫操作的指令,,所以不會有代碼區(qū)被改寫的問題;程序只能在封閉的代碼區(qū)中運行,,不可能跑到數(shù)據(jù)區(qū),,這也是跑飛的幾率減少并且跑飛后的行為有規(guī)律(數(shù)據(jù)區(qū)的數(shù)據(jù)是不斷變化的而代碼區(qū)是不變的),。
所以,相對于馮·諾依曼結(jié)構(gòu),,哈佛結(jié)構(gòu)更加適合于那些程序固化,、任務(wù)相對簡單的控制系統(tǒng),。
總結(jié)::::::::::
馮.諾依曼(Von Neumann)指出:程序只是一種(特殊)的數(shù)據(jù),它可以像數(shù)據(jù)一樣被處理,,因此可以和數(shù)據(jù)一起被存儲在同一個存儲器中——這就是著名的馮.諾依曼原理。注意:數(shù)據(jù)總線和地址總線共用,。--注
哈佛結(jié)構(gòu):
哈佛結(jié)構(gòu)是一種并行體系結(jié)構(gòu),它的主要特點是將程序和數(shù)據(jù)存儲在不同的存儲空間中,,即程序存儲器和數(shù)據(jù)存儲器是兩個獨立的存儲器,每個存儲器獨立編址,、獨立訪問,。與兩個存儲器相對應(yīng)的是系統(tǒng)的4條總線:程序的數(shù)據(jù)總線與地址總線,數(shù)據(jù)的數(shù)據(jù)總線與地址總線,。這種分離的程序總線和數(shù)據(jù)總線允許在一個機器周期內(nèi)同時獲得指令字(來自程序存儲器)和操作數(shù)(來自數(shù)據(jù)存儲器),從而提高了執(zhí)行速度,,使數(shù)據(jù)的吞吐率提高了1倍。又由于程序和數(shù)據(jù)存儲器在兩個分開的物理空間中,,因此取指和執(zhí)行能完全重疊,。CPU首先到程序指令存儲器中讀取程序指令內(nèi)容,,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)存儲器中讀取數(shù)據(jù),,并進(jìn)行下一步的操作(通常是執(zhí)行)。
結(jié)構(gòu)如圖2 (----注) [img] [/img]
圖2 Harvard architecture
哈佛結(jié)構(gòu)采用數(shù)據(jù)存儲器與程序代碼存儲器分開,,各自有自己的數(shù)據(jù)總線與地址總線。但這是需要CPU提供大量的數(shù)據(jù)線,,因而很少使用哈佛結(jié)構(gòu)作為CPU外部構(gòu)架來使用,。但是對于 CPU內(nèi)部,,通過使用不同的數(shù)據(jù)和指令cache,可以有效的提高指令執(zhí)行的效率,,因而目前大部分計算機體系都是CPU內(nèi)部的哈弗結(jié)構(gòu)+CPU外部的馮· 諾伊曼的結(jié)構(gòu)。