1. 程式人生 > >哈佛結構和馮諾依曼結構的區別(3)

哈佛結構和馮諾依曼結構的區別(3)

馮諾依曼體系結構與哈弗體系結構的區別
材料一:
       哈佛結構是一種將程式指令儲存和資料儲存分開的儲存器結構。中央處理器首先到程式指令儲存器中讀取程式指令內容,解碼後得到資料地址,再到相應的資料儲存器中讀取資料,並進行下一步的操作(通常是執行)。程式指令儲存和資料儲存分開,可以使指令和資料有不同的資料寬度,如Microchip公司的PIC16晶片的程式指令是14位寬度,而資料是8位寬度。

       目前使用哈佛結構的中央處理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列晶片,還有

摩托羅拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和安謀公司的ARM9、ARM10和ARM1151微控制器也屬於哈佛結構
馮·諾伊曼結構也稱普林斯頓結構,是一種將程式指令儲存器和資料儲存器合併在一起的儲存器結構。程式指令儲存地址和資料儲存地址指向同一個儲存器的不同物理位置,因此程式指令和資料的寬度相同,如英特爾公司的8086中央處理器的程式指令和資料都是16位寬。

        目前使用馮·諾伊曼結構的中央處理器和微控制器有很多。除了上面提到的英特爾公司的8086,英特爾公司的其他中央處理器、安謀公司的ARM7、MIPS公司的MIPS處理器也採用了馮·諾伊曼結構。
評論:哈佛結構和馮.諾依曼結構都是一種儲存器結構。哈佛結構是將指令儲存器和資料儲存器分開的一種儲存器結構;而馮.諾依曼結構將指令儲存器和資料儲存器合在一起的儲存器結構。


材料二:
       MCS-51微控制器有著嵌入式處理器經典的體系結構,這種體系結構在當前嵌入式處理器的高階ARM系列上仍然在延續,這就是哈佛結構。相對於大名鼎鼎的馮·諾依曼結構,哈佛結構的知名度顯然遜色許多,但在嵌入式應用領域,哈佛結構卻擁有著絕對的優勢。哈佛結構與馮·諾依曼結構的最大區別在於馮·諾依曼結構的計算機採用程式碼與資料的統一編址,而哈佛結構是獨立編址的,程式碼空間與資料空間完全分開。

       在通用計算機系統中,應用軟體的多樣性使得計算機要不斷地變化所執行的程式碼的內容,並且頻繁地對資料與程式碼佔有的儲存器進行重新分配,這種情況下,馮·諾依曼結構佔有絕對優勢,因為統一編址可以最大限度地利用資源,而哈佛結構的計算機若應用於這種情形下則會對儲存器資源產生理論上最大可達50%的浪費,這顯然是不合理的。

        但是在嵌入式應用中,系統要執行的任務相對單一,程式一般是固化在硬體裡。當然這時使用馮·諾依曼結構也完全可以,程式碼區和資料區在編譯時一次性分配好了而已,但是其靈活性得不到體現,所以現在大量的微控制器也還在沿用馮·諾依曼結構,如TI的MSP430系列、Freescale的HCS08系列等。

      那是為什麼說哈佛結構有優勢呢?

      嵌入式計算機在工作時與通用計算機有著一些區別:嵌入式計算機在工作期間的絕大部分時間是無人值守的,而通用計算機工作期間一般是有人操作的;嵌入式計算機的故障可能會導致災難性的後果,而通用計算機一般就是死宕機,重新啟動即可。這兩點決定了對嵌入式計算機的一個基本要求:可靠性。

       使用馮·諾依曼結構的計算機,程式空間不封閉,期程式空間的資料在執行期理論上可以被修改,此外程式一旦跑飛也有可能執行到資料區。雖然都是一些不常見的特殊情況下,但是看看哈佛結構的計算機在這些情況下是怎樣的:基於哈佛結構的處理器入MCS-51,不需要可以對程式碼段進行寫操作的指令,所以不會有程式碼區被改寫的問題;程式只能在封閉的程式碼區中執行,不可能跑到資料區,這也是跑飛的機率減少並且跑飛後的行為有規律(資料區的資料是不斷變化的而程式碼區是不變的)。
所以,相對於馮·諾依曼結構,哈佛結構更加適合於那些程式固化、任務相對簡單的控制系統。

總結
      馮.諾依曼指出:程式只是一種(特殊)的資料,它可以像資料一樣被處理,因此可以和資料一起被儲存在同一個儲存器中——這就是著名的馮.諾依曼原理。注意:資料匯流排和地址匯流排共用。

哈佛結構:
        哈佛結構是一種並行體系結構,它的主要特點是將程式和資料儲存在不同的儲存空間中,即程式儲存器和資料儲存器是兩個獨立的儲存器,每個儲存器獨立編址、獨立訪問。與兩個儲存器相對應的是系統的4條匯流排:程式的資料匯流排與地址匯流排,資料的資料匯流排與地址匯流排。這種分離的程式匯流排和資料匯流排允許在一個機器週期內同時獲得指令字(來自程式儲存器)和運算元(來自資料儲存器),從而提高了執行速度,使資料的吞吐率提高了1倍。又由於程式和資料儲存器在兩個分開的物理空間中,因此取指和執行能完全重疊。CPU首先到程式指令儲存器中讀取程式指令內容,解碼後得到資料地址,再到相應的資料儲存器中讀取資料,並進行下一步的操作(通常是執行)。