ARM的流水線與PC值的關係
1、馮·諾依曼結構 馮·諾依曼結構又稱作普林斯頓體系結構(Princetionarchitecture)。1945年,馮·諾依曼首先提出了“儲存程式”的概念和二進位制原理,後來,人們把利用這種概念和原理設計的電子計算機系統統稱為“馮·諾依曼型結構”計算機。馮·諾依曼結構的處理器使用同一個儲存器,經由同一個匯流排傳輸。馮·諾依曼結構處理器具有以下幾個特點: 必須有一個儲存器; 必須有一個控制器; 必須有一個運算器,用於完成算術運算和邏輯運算; 必須有輸入和輸出裝置,用於進行人機通訊。馮·諾依曼的主要貢獻就是提出並實現了“儲存程式”的概念。由於指令和資料都是二進位制碼,指令和運算元的地址又密切相關,因此,當初選擇這種結構是自然的。但是,這種
2、哈佛結構哈佛結構是一種將程式指令儲存和資料儲存分開的儲存器結構,如圖1所示。中央處理器首先到程式指令儲存器中讀取程式指令內容,解碼後得到資料地址,再到相應的資料儲存器中讀取資料,並進行下一步的操作(通常是執行)。程式指令儲存和資料儲存分開,可以使指令和資料有不同的資料寬度,如Microchip公司的PIC16晶片的程式指令是14位寬度,而資料是8位寬度。
圖1 哈佛體系結構框圖
哈佛結構的微處理器通常具有較高的執行效率。其程式指令和資料指令分開組織和儲存的,執行時可以預先讀取下一條指令。 目前使用哈佛結構的中央處理器和微控制器有很多,除了
3、馮·諾依曼體系和哈佛匯流排體系的區別二者的區別就是程式空間和資料空間是否是一體的。馮·諾依曼結構資料空間和地址空間不分開,哈佛結構資料空間和地址空間是分開的。 早期的微處理器大多采用馮·諾依曼結構,典型代表是Intel公司的X86微處理器。取指和取運算元都在同一總線上,通過分時服用的方式進行的。缺點是在高速執行時,不能達到同時取指令和取運算元,從而形成了傳輸過程的瓶頸。 哈佛匯流排技術應用是以DSP和ARM為代表的。採用哈佛匯流排體系結構的晶片內部程式空間和資料空間是分開的,這就允許同時取指和取運算元,從而大大提高了運算能力。DSP晶片硬體結構有馮·諾依曼結構和哈佛結構,兩者區別是地址空間和資料空間分開與否。一般DSP都是採用改進型哈佛結構,就是分開的資料空間和地址空間都不只是一條,而是有多條,這根據不同的生產廠商的DSP晶片有所不同。在對外定址方面從邏輯上來說也是一樣,因為外部引腳的原因,一般來說都是通過相應的空間選取來實現的。本質上是同樣的道理。
4.改進型的哈佛結構與哈佛體系結構差別
與馮.諾曼結構處理器比較,哈佛結構處理器有兩個明顯的特點:
(1).使用兩個獨立的儲存器模組,分別儲存指令和資料,每個儲存模組都不允許指令和資料並存;
(2).使用獨立的兩條匯流排,分別作為CPU與每個儲存器之間的專用通訊路徑,而這兩條匯流排之間毫無關聯。
後來,又提出了改進的哈佛結構,其結構特點為:
(1).使用兩個獨立的儲存器模組,分別儲存指令和資料,每個儲存模組都不允許指令和資料並存;
(2).具有一條獨立的地址匯流排和一條獨立的資料匯流排,利用公用地址匯流排訪問兩個儲存模組(程式儲存模組和資料儲存模組),公用資料匯流排則被用來完成程式儲存模組或資料儲存模組與CPU之間的資料傳輸;
(3).兩條匯流排由程式儲存器和資料儲存器分時共用。
5.總結
體系結構與採用的獨立與否的匯流排無關,與指令空間和資料空間的分開獨立與否有關。51微控制器雖然資料指令儲存區是分開的,但匯流排是分時複用得,所以屬於改進型的哈佛結構。ARM9雖然是哈佛結構,但是之前的版本(例如ARM7)也還是馮·諾依曼結構。早期的X86能迅速佔有市場,一條很重要的原因,正是靠了馮·諾依曼這種實現簡單,成本低的匯流排結構。現在的處理器雖然外部總線上看是諾依曼結構的,但是由於內部CACHE的存在,因此實際上內部來看已經類似改進型哈佛結構的了。至於優缺點,哈佛結構就是複雜,對外圍裝置的連線與處理要求高,十分不適合外圍儲存器的擴充套件。所以早期通用CPU難以採用這種結構。而微控制器,由於內部集成了所需的儲存器,所以採用哈佛結構也未嘗不可。現在的處理器,依託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。
注:引用了許多博文,但無法一一找到出處,對原文博主表示感謝!