ARM的流水线与PC值的关系
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難以采用這種結構。而單片機,由于內部集成了所需的存儲器,所以采用哈佛結構也未嘗不可?,F在的處理器,依托CACHE的存在,已經很好的將二者統一起來了。
二、ARM流水線結構:
?流水線技術通過多個功能部件并行工作來縮短程序執行時間,提高處理器核的效率和吞吐率,從而成為微處理器設計中最為重要的技術之一。ARM7處理器核使用了典型三級流水線的馮·諾伊曼結構,ARM9系列則采用了基于五級流水線的哈佛結構。通過增加流水線級數簡化了流水線各級的邏輯,進一步提高了處理器的性能。
????ARM7的三級流水線在執行單元完成了大量的工作,包括與操作數相關的寄存器和存儲器讀寫操作、ALU操作以及相關器件之間的數據傳輸。執行單元的工作往往占用多個時鐘周期,從而成為系統性能的瓶頸。ARM9采用了更為高效的五級流水線設計,增加了2個功能部件分別訪問存儲器并寫回結果,且將讀寄存器的操作轉移到譯碼部件上,使流水線各部件在功能上更平衡;同時其哈佛架構避免了數據訪問和取指的總線沖突。
arm7采用三級流水
(1)取指(fetch)
取指級的任務是從程序存儲器中讀取指令。
(2)譯碼(decode)
譯碼級完成對指令的分析,并為下一個周期準備數據路徑需要的控制信號。在這一級,指令占用譯碼邏輯,不占用數據通路。
(3)執行(excute)
完成指令要求的操作,并根據需要將結果寫回寄存器。指令占用數據路徑,寄存器堆被讀取,操作數在桶行移位器中被移位。運算器產生運算結果并回寫到目的寄存器中,運算器根據指令需求和運輸結果更改狀態寄存器的條件位。
?
arm9采用五級流水
(1)取指(fetch)
從存儲器中取出指令,并將其放入指令流水線。
?
(2)譯碼(decode)
?
指令被譯碼,從寄存器堆中讀取寄存器操作數。在寄存器堆中有3個操作數讀端口,因此大多數ARM指令能在1個周期內讀取其操作數。
?
(3)執行(execute)
?
將其中一個操作數移位,并在ALU中產生結果。如果指令是Load或Store指令,則在ALU中計算存儲器的地址。
?
(4)緩沖/數據(buffer/data)
?
如果需要則訪問數據存儲器,否則ALU只是簡單地緩沖一個時鐘周期,以便是所有的指令具有同樣的流水線流程。
?
(5)回寫(write-back)寄存器堆
------------------------------------------------
?
注意,arm7中執行和取指是隔了一級譯碼級,那一級不讀取數據,當前PC=原PC+8,?正常
arm9中執行和取指之間的譯碼級不再老實,譯碼級已經開始從寄存器堆中讀取寄存器操作數,這樣的話,
讀取到得就是PC+4,不是PC+8,執行級又不會再讀一次,那將導致執行級的PC還是=PC+4
?
為了保持向下兼容,在ARM9的5級流水線上,取指級增加的PC值被直接送到譯碼級的寄存器,穿過了兩級之間的流水線寄存器,這樣譯碼級得到的PC值就是下一條指令的PC+4,等于當前指令的PC+8,
等到了執行級時,PC寄存器的值=當前指令地址+8
?
當使用指令STR或STM對R15進行保存時,保存的可能是當前指令地址加8或當前指令地址加12。
?
到底是哪種方式,取決于芯片的具體設計方式。當然,在同一個芯片中,只能采用一種方式。要么保存當前指令地址加8,要么保存當前指令地址加12。程序開發人員應盡量避免使用STR或STM指令來對R15進行操作。當不可避免要使用這種方式時,可以先通過一小段程序來確定所使用的芯片是使用哪種方式實現的。例如:
SUB R1,PC, #4??? ;R1中存放STR指令地址
STR PC,[R0]????? ;用STR指令將PC保存到R0指向的地址單元中,
??????????????????????????? ;PC=STR指令地址+偏移量(偏移量為8或者12)。
LDR R0,[R0]??? ;讀取STR指令地址+偏移量的值
SUB R0,R0,R1??? ; STR指令地址+偏移量的值減去STR指令的地址,
??????????????????????????? ;得到偏移量值(8或者12)。
另:http://blog.csdn.net/hamilton1/article/details/6192722
?
When an instruction reads R15 without breaking any of the restrictions on its use, the value read is the
address of the instruction plus 8 bytes.
?
?
?
ARM7采用三級流水線的馮·諾伊曼結構,ARM9采用五級流水線的哈佛結構。
?
ARM7流水線包括取指(fetch)、譯碼(decode)、執行(excute)。ARM7流水線在譯碼階段不讀取操作數寄存器,因此執行階段的PC值和取指階段的PC值關系為:PC(excute)=PC(fetch)+8。
?
?
?
ARM9流水線包括取指(fetch)、譯碼(decode)、執行(excute)、緩沖/數據(buffer/data)、回寫(write- back)寄存器堆。ARM9流水線在譯碼階段已經開始讀取操作數寄存器,因此譯碼階段的PC值和取指階段的PC值關系為:PC(decode)=PC(fetch)+4。因此執行階段的PC值和譯碼階段的PC值關系為:PC(excute)=PC(decode)+4。
?
?
?
為了保證ARM9流水線和ARM7流水線兼容,ARM9流水線將取指階段的PC值跨過取指和譯碼流水線寄存器,直接送往譯碼階段寄存器,這樣仍然保證執行階段的PC值和取指階段的PC值關系為:PC(excute)=PC(fetch)+8。
注:引用了許多博文,但無法一一找到出處,對原文博主表示感謝!
總結
以上是生活随笔為你收集整理的ARM的流水线与PC值的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ISP与IAP的区别
- 下一篇: 指令集及流水线基本概念