CPU
機器指令:CPU可以直接識別並執行的命令,所有機器指令構成這個CPU的指令集
來源:https://www.zhihu.com/question/21170082
CPU不能單純用頻率和內核數量相乘得到“能力值”
CPU的處理速度涉及到硬件架構。1.2G的奔騰肯定比不過現在1.2G的酷睿,因為一樣的指令,奔騰需要10個周期(晶振10次震動),酷睿只需要5個周期。在這種情況下,雖然兩者頻率一致,但是酷睿能比奔騰快一倍。
RISC:精簡指令集計算機
CISC:復雜指令集計算機
無用的多余指令使得指令的運行速度被拖慢
指令簡單,在一個時鍾周期內完成一條指令
RISC只有LOAD、STORE方式訪問存儲,而復雜指令集有多種方式訪問
RISC指令設計很緊湊,不容易實現指令系統的兼容,后期加指令比較難
ALU:算術邏輯單元
組合邏輯電路,沒有記錄功能
Ki是控制單元,指出運算類型
ALU電路的外特性
快速進位鏈
並行加法器:一次對兩個數字的各個位都進行計算,但是進位限制了下一位的計算(因為下一位的計算需要上一位的進位結果)
進位鏈就是傳送進位的電路
為了使用與非門實現:
進位鏈是影響加法器速度的瓶頸,所以才有了並行進位鏈
上圖使用的是與或非門(不是同時使用了這三種門,只是說使用了這三種基本門)
雖然表達式看起來復雜,但是都是使用的初始狀態的變量,可以實現同時計算,並且只需要使用與非門即可
但是這種方式的電路很復雜,所以有了以下的折中方式
如果使用串行方式,16位運算需要32t才行
C3、C7、C11、C15是同時產生的
C15要作為輸入給第一大組
大組內小組同時計算(都使用初始狀態),然后輸出最高位給下一個大組(下一個大組都使用上一個大組傳遞過來的位作為初始位)
CPU的結構
用戶可見寄存器:在編寫程序時可以使用的寄存器
用戶不可見寄存器:例如在流水線的流水段上的寄存器都是不可見的
CU:產生微操作序列(要保證微操作之間的順序正確)
精簡指令集一般使用組合邏輯設計(硬連線設計),而復雜指令集一般使用微指令設計(存儲邏輯)
指令周期
CPU工作周期的標記:說明現在處於CPU的哪個工作周期,以便於正確訪問內存
來源:https://blog.csdn.net/noworries/article/details/8889021
我們知道什么是斷點,通過斷點我們可以很方便地對程序進行調試。在嵌入式開發領域中,我們還得知道存在程序斷點(program breakpoint)和數據斷點(data breakpoint)之分。
1、程序斷點
程序斷點就是指處理器的指令斷點。通俗的說,就是當程序運行到函數的某個地方就會停下來。程序斷點又分為軟件程序斷點和硬件程序斷點。
在用VS進行軟件調試時可以設置很多斷點,這些斷點都是軟件程序斷點。處理器在運行的過程中如果碰到一條非法(或無效)指令,就會出現一個異常中斷,軟件程序斷點就是利用這個特性實現的。當設置一個軟件程序斷點的時候,調試工具就在我們所想設置的內存位置上放置一條非法指令,同時將被替換的指令保留起來(這就是上面說的儲存程序斷點的意思)。當程序運行到了被非法指令替換的地方時,處理器所產生的異常中斷一方面在中斷服務中恢復被替換的指令,另一方面將控制權交給調試工具。從理論上說,軟件程序斷點可以設置n個,n的大小由內存容量決定。
在嵌入式系統中,如果調試的程序不是位於內存中,而是位於像閃存這樣的存儲器中(比如引導加載器的部分代碼),此時就無法使用軟件程序斷點了,因為閃存中的內存並不能像內存那樣方便更改。此時只能通過配置處理器的斷點寄存器的方式實現的。當處理器運行到斷點寄存器所指示的位置的指令就會產生中斷,調試工具就通過該中斷使我們獲得干預的機會。處理器所能設置的硬件程序斷點數據是有限制的,可能最多也就4個
2、數據斷點
當調試程序時,如果發現所定義的一個數據結構中的某一變量總是被意外地更改,查出這類問題的根源 可並不容易。如果處理器能提供一種功能——當某一變量的值被更改時能自動停止下來就好了,這樣就可以通過調用棧找到問題的根源。這就是引入數據斷點的目的。數據斷點與硬件程序斷點很相似,需要在處理器的寄存器中設置所監視數據變量的內存地址。當被監視的內存單元被修改時處理器將產生中斷,調試工具利用這一中斷讓我們獲得檢查程序的機會。
處理器一般都提供了硬件程序斷點這一功能,但數據斷點卻未必。選擇處理器時考慮其是否支持數據斷點是很有必要的,這會讓我們獲得另一種有效的調試手段。
指令流水線
來源:https://blog.csdn.net/huanghongxun/article/details/80828258
如果我們等待一條指令完全執行完成了以后再執行下一條指令,那么這會導致硬件資源的浪費。對於單周期CPU,指令的執行過程將是5個步驟依次執行。當指令執行到某個步驟時,剩下4個步驟的硬件資源將被閑置(由於我們會在電路中大量使用觸發器,而觸發器是屬於耗能比較大的器件,因此充分利用硬件資源還能夠降低我們設計的CPU的功耗,提升能耗比)。
指令之間,甚至是指令內部的微指令之間也可以是並行的:
單核cpu只能並發,不能並行
實際的計算機不僅僅使用二級流水
條件轉移指令數量是比較大的,對指令流水的影響比較大:解決方法——分支預測等
條件傳送是一種條件跳轉的一種替換策略,他首先就計算出一個條件的兩種結果,然后等到執行到分支判斷的地方,根據條件選擇一個結果。只有在一些受限的條件下這種策略才可行,比如這個例子中的判斷數字是否大於128然后求和。但是如果可行,就可以通過一條簡單的條件傳送指令來實現,而不是需要條件跳轉指令來實現分支判斷。
eg.
流水線的級數表示的是將一個指令分成的段數,例如上面的就是六級流水線了。流水線的級數越高,無疑CPU利用率是會增加的,。但是:
對於Pipeline(流水線), 不能無限分割。首先logic是不能無限分割的,並且每加一級pipeline,就需要增加register,增加了area,並且register讀寫也需要時間,導致一條指令從開始執行到結束的實際時間增加了。並且pipeline級數越多,越容易導致hazards,從而影響性能。
來源:https://www.zhihu.com/question/24682922/answer/56403791
指令存儲器和數據存儲器分開(哈弗結構):比較典型的就是指令cache和數據cache分開
寫后寫:不同指令寫入同一位置,但是順序不能變
后推法:推后第二條讀寫操作
旁路技術:將某條指令執行結果不送回寄存器而是直接送到其他指令所需的地方
指令4-7是預先讀進來的,等待指令3執行完發現要轉移到指令15時,4-7都要被舍棄
流水線的多發技術
黑色是執行部分,有多個
鎖存器:保存前面流水段的結果,同時為下一段提供操作數據和操作信號
來源:https://baike.baidu.com/item/%E9%94%81%E5%AD%98%E5%99%A8
鎖存器(Latch)是一種對脈沖電平敏感的存儲單元電路,它們可以在特定輸入脈沖電平作用下改變狀態。鎖存,就是把信號暫存以維持某種電平狀態。鎖存器的最主要作用是緩存,其次完成高速的控制器與慢速的外設的不同步問題,再其次是解決驅動的問題,最后是解決一個 I/O 口既能輸出也能輸入的問題。鎖存器是利用電平控制數據的輸入,它包括不帶使能控制的鎖存器和帶使能控制的鎖存器。
運算過程也可以通過流水線的方式進行並行操作:
如果每段的操作時間不等,那么時鍾周期要按最長的一段來設置,會降低整體的運行速度
中斷
一個中斷源對應一個中斷請求觸發器
優先響應對系統影響最大的、最重要的中斷
硬件方式:設計排隊器:
排隊器中同時只有一個是1(高電平),其他都是0
軟件方式:查詢
查找服務程序入口地址
- 硬件
- 軟件
軟件方式更加靈活
是將中斷識別程序的開始地址送入PC
隱指令:不是指令,但是也是要完成的步驟
某一級別的中斷在執行的時候,對應級別的屏蔽字會被賦值:
注意屏蔽字在何時設置:必須在開中斷之前
假設用到了ACC寄存器(累加器)
這個5就是這個中斷對應的處理程序的位置(軟件查詢方法)
SERVE:中斷服務程序的入口地址
中斷后,斷點自動保存到0地址,然后先將ACC寄存器的內容保存到SAVE中,再將0地址的內容通過ACC寄存器保存到RETURN中(注意為什么要用ACC,因為數據不能直接在內存中流動,必須至少有一方是寄存器),最后關中斷時將SAVE中的內容放回ACC,然后直接跳轉到RETURN的內容,也就是程序斷點位置恢復執行
控制單元
微操作命令
將操作碼送給CU進行譯碼,明確要執行的是什么指令
執行周期比較復雜,因為我們假設指令長度和字長是一樣的,所以取指令的時間是固定的,但是執行時間是不固定的
存數和加法都是和ACC寄存器交互
微指令就是指令的子描述
A0是條件,如果是1就轉移,是0就不變
對於中斷周期,每種指令的過程都一樣:
控制單元的功能
一組指的是並行執行時
CU:
來源:https://baike.baidu.com/item/CU/15286244
CU是Control Unit控制單元,是CPU的一部分,用於執行計算機指令或者Client Unit 監控系統的監控客戶端單元的一個計算機學名詞。
不采用CPU內部總線的意思就是CPU的內部各個部分采用分散連接:
采用內部總線連接的話:
多級時序系統
耗費時間最長的指令一般就是訪存指令
一個機器周期內要做多個指令,它們也是有先后順序的,這個順序也是由時鍾控制的,所以時鍾周期要小於機器周期:
時鍾周期是計算機中最基本的時間單位
一個時鍾周期也可能完成多個微操作
每個機器周期對應於指令的一個執行階段
機器速度也和是否采用流水線、是否是多核等等因素相關,不能簡單地只看主頻
同步控制方式一定有一個定寬定距的時鍾作為基准
這種方式比較浪費,因為一般的指令不需要那么多的節拍
類比DMA
聯合控制方法:一般使用同步,部分耗時比較長的指令(例如IO指令)使用異步
人工控制:為了調試使用
組合邏輯設計
要求指令沒有先后順序或者指令非常短、在一個節拍中就可以實現
節拍信號的寬度就是一個時鍾周期
不同機器的機器周期中包含的節拍數是不一樣的
Ci表示控制信號:
原則二的意思是如果可能並行的話就盡量並行,安排在同一個節拍中
注意我們約定了一個機器周期內有三個節拍
取指和間指都花費了一個機器周期
下面對一些典型的匯編指令的微操作進行分析:
- CLA:給ACC寄存器賦值為0
- COM:給ACC取反
- SHR:ACC寄存器算術右移
0-》G是停機指令:
- CSL:循環左移
- STP:停機
- ADD X:內存中的X和ACC加
- STA X:將ACC儲存到X
- LDA X:將內存中的X保存到ACC
- JMP X:跳轉到指定的X位置
- BAN X:如果上一條計算結果(ACC,判斷標志寄存器中的標志,這里簡化為只判斷A0)小於0,就跳轉到X
- 保存斷點,寫入到內存地址0處
- 關中斷
- 完成斷點的寫
- 形成中斷服務程序的入口地址
IND:表示加入間指階段
EX:表示進入執行階段
寫出微操作的邏輯表達式,也就是在哪些指令中使用了該微操作:
然后依據此設計電路:
速度快:使用硬件方式連接,這種方式被RISC所采用;CISC的整型計算也是采用的此方法
微程序設計
擴展性強、可以實現復雜化指令
區分我們上面所說的”微操作“和這里的”微程序“、”微指令“
微指令的1表示對應的操作要在該處完成
一條機器指令對應一個微指令,取指、間址階段的微程序是公用的
存儲邏輯
微程序、微指令保存在控制存儲器中,是只讀的
CMAR:控制存儲器地址寄存器,保存微指令在控制存儲器中的地址
CMDR:控制存儲器數據寄存器,保存讀出的微指令
順序邏輯:選擇正確指令來源
微地址形成部件:形成微操作對應的微指令的地址
順序控制:給出下一條微指令的地址
XXX:表示不能直接通過下地址得到要執行的下一條指令是什么(有可能有間址有可能沒有、有可能有中斷有可能沒有、不知道要執行哪一個指令的微程序),需要使用微地址形成部件得到
例如:
微指令的控制方式
直接給出操作、不需要譯碼,速度最快
譯碼器輸出只有一個是有效的
不同組的命令不一定是互斥的,是可能並行執行的
執行較慢
也可以使用增量計數器或者分支轉移
在小范圍內的跳轉和轉移還可以使用測試網絡的方式:
微指令由測試地址和非測試地址拼接而成
對於特殊的部分:
間址也可以使用硬件產生
多路選擇器要依據指令的類型選擇哪一路:
微指令格式
垂直型微指令一般用於比較復雜的指令
靜態微程序和動態微程序
毫微程序設計
將垂直型微指令解釋為水平型毫微指令
串行和並行微程序
微程序設計舉例
Ti表示一條微指令
對於這10條指令,一共有20種不同的微操作,合起來有38條不同的微指令
如果使用水平型直接控制的話,控制字段至少要有20個bit,控制存儲器中要存儲至少38條微指令
還可以再簡化: