微型計算機
理解微型計算機的工作原理才能更好的理解計算機、芯片、單片機等等的工作機理。本文從微機原理出發,整理相關知識並梳理,加深對計算機的理解。
基礎電路
計算機由集成電路構成,可以說計算機是跑在芯片上的,芯片包括CPU芯片例如Intel生產的芯片,以及外設更多的單片機芯片如ARM等,后者是將CPU和一些存儲器和外設集成在一個芯片上。所有的芯片均是由基本的門電路構成的,而門電路可以由硅單質摻雜形成的二極管和三級管構成,因此芯片通電后才能實現電平邏輯的變化。
上面大概梳理了一下不同器件的組成關系,可以看出芯片最終是由無數個門電路和相連的導線構成的,這也是為什么今天的芯片設計相關的視頻介紹中往往以P型或N型半導體的構造為起點,由PN結構成的二極管和三極管組成的門電路是這個龐大工程的起點。
邏輯電路
邏輯電路是集成電路的最小單元,由3種基本門電路組成,
- 門電路
- 基本門電路
- 非門:$Y = \overline {A} $ ,或門:\(Y=A+B\),與門:\(Y=AB\)
- 復雜邏輯電路(自行查找)
- 或非門,與非門,異或門,異或非門,異或同門,緩沖器(\(Y=A\),阻值變小)
- 基本門電路
- 門電路在芯片中的實現:
- 由硅單質經摻雜腐蝕等工藝形成P型半導體和N型半導體,兩者相連部分叫PN結,PN結在正向電流時可導通,反向電流時阻斷,具備單向導電性。在PN結上加入導線和封裝,則構成一個二極管,由兩個PN結構成一個三極管
- 由於二極管的單向導電性,可以構成門電路(以與門為例):
基本運算與加法電路
- 半加器
- 兩個二進制數(A和B)相加,最低位會產生兩個結果,分別是和(S)和進位(C),能夠實現一個二進制位加法運算的電路即半加器,半加器可以這樣設計門電路(根據A、B相加后的運算結果):\(S=A \oplus B\),\(C=AB\)
- 全加器
- 將A、B、C一同運算產生S和新的進位C稱之為全加器,全加器和半加器統稱加法器,全加器相互串聯即構成了二進制數的加法運算,常見的8位、16位、32位、64位為CPU的寄存器位數,不要混淆為加法器的個數(也和總線位數有關)。
- 現在一個CPU中含有的加法器個數非常巨大。
- 基本運算的實現(二進制):
- 減法:由加法計算A和B的補碼即為減法
- 乘除法:由移位實現
基本組成電路
算數邏輯單元ALU
可進行加減法運算和邏輯運算的單元,計算機程序可以認為是程序和數據的組合,ALU即負責執行程序運算邏輯
觸發器
- RS觸發器,S指置位,R指復位,RS觸發器可接一個時鍾CLK用於運算同步,由於RS同時為低時會使輸出無法確定,因此引入D觸發器
- D觸發器,D端為高,表現為S置位,D端為低表現為R復位,CLK在邊沿變化時執行D觸發器動作可以做到動作一致
- JK觸發器是RS觸發器的改進,相比RS觸發器,在RS(JK)端同時為高時Q表現為反碼,同時為低時Q表現為鎖定,JK觸發器可用用在計數器中。
- JK觸發器在JK均為低時
寄存器
- 一個觸發器即一位寄存器,可知32位寄存器至少含有32個觸發器
- 寄存器包括累加器,緩存器,計數器,可以知道用於緩存數據的寄存器由多個觸發器連接而成,而每個觸發器又是由多個門電路構成。
總線結構
-
三態輸出電路:為了能夠使用一組數據線(數據線條數取決於寄存器位數)便可以使任意兩個寄存器相連
E A B 0 1 高阻 0 0 高阻 1 1 1 1 0 0 - E為控制,記L為裝入門,L管理對寄存器裝入數據,E管理由寄存器的輸出。即在L打開時,寄存器可寫入數據,而此時總線上的數據即被寫入寄存器,當L關閉E打開時,總線上數據被寄存器更新。
-
根據寄存器位數可以得到總線的位數,同時還需要總線控制字CON確定數據的流向(從A寄存器到B寄存器還是從B寄存器到A寄存器),每次控制字中只有兩位為高,其余均為低。
存儲器
- 存儲器可以認為是一大群寄存器構成的寄存器堆,根據使用的需要分為ROM和RAM,PROM可以認為是RAM和ROM的功能均支持。
- 數據線個數決定了每個地址有多少位數據可以取,地址線的個數決定了可以訪問多少個地址。
基本工作原理
一個簡化的微型計算機
該計算機實現一個簡單的功能,計算A和B的加減法后停止。
-
虛線框內可以認為是計算機的CPU,MAR和PROM構成存儲器,O和D構成外設,將這些電路集成到一個芯片即為單片機。
-
PROM為8位,16個單元,即16個字節
-
CON總線控制字共12位,PROM存8位的指令字,經IR通過總線W取出后取高4位為指令,低4位為地址
指令系統與程序設計
-
假設支持5條指令,LDA:將數據送入累加器A,ADD:加法運算,SUB:減法運算,OUT輸出,HLT停機
-
將指令與二進制操作碼對應起來:LDA:0000,ADD:0001,SUB:0010,OUT:1110,HLT:1111
-
操作碼的定義與xx有關
-
程序設計:
-
將PROM前8個字節給程序,后8個字節給數據,可知這個計算機只能執行8條指令以內的操作,操作的數據只有8個字節
-
假設執行的操作為(R9表示PROM第9個字節,RA等以此類推):
-
LDA R9 ADD RA ADD RB ADD RC SUB RD OUT HLT
-
翻譯為目的程序:
-
;PROGRAM:16+20+24+28-32 0000 1001 0001 1010 0001 1011 0001 1100 0010 1101 1110 0000 1111 0000 0000 0000 ;DATA 0001 0000;16 0001 0100;20 0001 1000;24 0001 1100;28 0010 0000;32 0000 0000 0000 0000 0000 0000
-
注意,這里只是將匯編翻譯為操作碼
-
執行過程
假設環形計數器的位數是6位,則一個固定周期的CPU在可分為3個機器節拍的取指周期和3個節拍的執行周期,即一條指令的執行占用6個機器節拍,6個最小的時鍾。不同的CPU在指令節拍個數上有所不同
- 取指周期:
- PC是程序計數器,這里計數范圍為0-15,即0000-1111,上電復位時為0,PC被送入MAR時表示要取出的地址為0,即程序0000 1001,因此可以理解為程序從0地址開始執行。CON為011000000000
- 從MAR取出的指令被送入IR,將高4位解析給CON,低4位解析為地址,CON為000110000000
- PC加1,CON為100000000000
- 執行周期:
- 以LDA R9為例:LDA的操作碼為0,設計邏輯門使CON送入0時執行以下動作:
- \(E_I=1\)將IR低4位送入總線,\(L_M=1\),MAR將總線的地址數據送給PROM,CON變為001001000000
- 將R9放入累加器A,CON變為000100100000
- 空拍,保持指令執行時間固定,CON為000000000000
- \(E_I=1\)將IR低4位送入總線,\(L_M=1\),MAR將總線的地址數據送給PROM,CON變為001001000000
- 以LDA R9為例:LDA的操作碼為0,設計邏輯門使CON送入0時執行以下動作:
控制部件
以LDA R9為例,LDA的操作碼被定義為0000,而將0000翻譯為CON的控制字的邏輯實現則需要指令譯碼器。譯碼器將操作碼翻譯為指令動作,在控制部件中,一個指令動作相當於一條信號線,假設一個CPU支持100條指令,則相當於操作碼需要8位,輸出100條信號線,再將這100條信號線與CON字映射起來:
這個過程中,操作碼首先經過譯碼器電路翻譯出執行的指令動作信號線,指令動作與一組CON控制字對應(上面的例子中LDA對應了3條CON),控制矩陣電路將RC和指令動作組合成一系列總線控制字,實現程序執行。
計算機的功能取決於CPU部分,而CPU部分取決於控制器的功能
其他技術
- 流水線技術:取指和執行可同時進行,采用流水線方式
- CACHE:高速緩存,CPU在訪問存儲器前先通過CACHE進行訪問,如果指令存在則直接取走,不存在則訪問存儲器,提高了CPU訪問存儲器的速度
- 虛擬存儲器:通過虛擬映射方式擴大可執行的范圍,當程序大於RAM時可分批從存儲器拷貝