-
聲明:
設計圖紙來自以下連結的部落格,這篇文章是按照自己的想法重構了一下設計思路,寫了一些自己的了解。
https://www.cnblogs.com/kingduan/p/4054484.html#_Toc402178283
文章目錄
- 前言
- 1、CPU精簡結構
-
- 1.1 大體框圖
- 2、CPU工作過程
- 3、宏觀實作預覽
-
- 3.1 系統總覽
- 3.2 舉例示範流程
-
- 3.2.0 機器周期0:
- 3.2.1 機器周期1:
- 3.2.2 機器周期2:
- 3.2.3 機器周期3:
- 4、系統設計
-
- 4.1 CLK子產品
- 4.2 Regs子產品
-
- 子產品内部組成
- 4.2 ALU子產品
-
- 子產品組成:
- 4.3 S-B/I子產品
- 4.4 控制器子產品
-
- 4.4.1 程式計數器(PC)的設計
- 4.4.2 指令寄存器(IR)的設計
- 4.4.3 指令譯碼器(ID)的設計
- 5、指令結構詳解:
前言
或許我們一直有一種疑惑,計算機是怎樣運作起來,他是怎樣通過處理不同的任務與指令完成人腦不輕易可為的複雜運算,這貌似是一件很神奇的事情。
其實很早之前就想進行類似的探究,這次的硬體課設正好是一個契機,從最底層的邏輯單元出發,對CPU的運作原理進行深度探究。
1、CPU精簡結構
我們在學習計算機組成原理的時候了解過CPU是由控制單元和運算單元這兩個主要的功能子產品組成,或許細分還有clk時鐘、存儲器和寄存器組,這些在後文會詳細解釋,在這裡我們隻需要知道CPU的主要功能就是運算,于是我們将CPU的功能精簡為隻剩下加減運算,這樣有助于我們對整個過程的示範與了解。
精簡的CPU主要包括以下部分:
-
控制器(Controller)
協調指揮計算機各部件工作
-
1、 指令控制器
指令控制器是控制器中相當重要的部分,它要完成取指令、分析指令等操作,然後交給執行單元(ALU或FPU)來執行,同時還要形成下一條指令的位址。
-
2、 時序控制器
時序控制器的作用是為每條指令按時間順序提供控制信号。時序控制器包括時鐘發生器和倍頻定義單元,其中時鐘發生器由石英晶體振蕩器發出非常穩定的脈沖信号,就是CPU的主頻;而倍頻定義單元則定義了CPU主頻是存儲器頻率(總線頻率)的幾倍。
-
-
運算器(算術邏輯單元,ALU)
完成算術運算和邏輯運算
ALU主要完成對二進制資料的定點算術運算(加減乘除)、邏輯運算(與或非異或)以及移位操作。在某些CPU中還有專門用于處理移位操作的移位器。
通常ALU由兩個輸入端和一個輸出端。
-
寄存器組(Regs)
通用寄存器組是一組最快的存儲器,用來儲存參加運算的操作數和中間結果。
-
存儲器 (記憶體,RAM)
存儲程式和資料,實作記憶的功能,記憶體儲器(Memory)也被稱為記憶體,其作用是用于暫時存放CPU中的運算資料,以及與硬碟等外部存儲器交換的資料。
-
指令寄存器(IR)
這一部分屬于控制器,CPU中程式起點是這兒,是以着重強調以下,有助于以下内容了解
指令寄存器(IR,Instruction Register),是臨時放置從記憶體裡面取得的程式指令的寄存器,用于存放目前從主存儲器讀出的正在執行的一條指令。
1.1 大體框圖
以下框圖描述了CPU的基本組成以及之間的關系
紅色的為控制線路,藍色部分為資料傳輸的通路
2、CPU工作過程
以下我們先舉一個CPU執行加法操作的例子,了解一下CPU的主要工作過程:
-
總體過程
首先,CPU從存儲器或高速緩沖存儲器中取出預存的操作指令,放入指令寄存器,并對指令譯碼。
它把指令分解成一系列的微操作,然後發出各種控制指令,執行微操作系列,進而完成一條指令的執行。
以上是大體的操作流程,乍一看似懂非懂,沒事,接下來我們逐字解析- -
彙編語言
在介紹指令之前先介紹彙編語言。
是人類所能直接識别的最低層次的語言,也可以說是計算機所能識别的最高層次的語言,人類可以利用彙編語言和計算機交流,讓計算機執行各種指令。
比如在此例加法操作中的彙編代碼是:ADD R2,R0,R1
- 彙編代碼 組成:
-
進行什麼操作?(操作類型,功能選擇)
這裡的操作類型為執行加法操作ADD
-
對什麼進行操作?(操作結果,目标寄存器)
這裡是對寄存器R2進行操作,或者說目标寄存器是R2
加之後的結果存放到目标寄存器R2中
-
操作什麼?(操作數)
這裡進行的操作是将寄存器R0和寄存器R1中的值相加,
或者說源寄存器為R0和R1
-
- 彙編代碼 組成:
這條彙編代碼的執行結果為:$R2=R1+R1,(相加的是寄存器中的數,而不是寄存器本身)
-
彙程式設計式
接下來在彙編語言的基礎上介紹彙程式設計式
彙程式設計式(Assembler)――将彙編語言書寫的程式翻譯成機器語言程式的軟體。
機器其實不能直接識别彙編語言,還需要彙程式設計式将彙編語言翻譯成對應的機器語言,也就是接下要介紹的機器指令
-
指令
指令是計算機規定執行操作的類型和操作數的基本指令。
一條機器指令實際上就是一串二進制序列,
比如本例中的彙編代碼:ADD R2,R0,R1 對應的機器指令就是:
0001 0000 1000 0100
這串指令是16位的,每一位都有其特定的含義或者說都代表對應的操作,
比如說從左往右的3位000 代表的操作就是選擇兩個寄存器運算的功能
後面五位1 0000 代表的意思是選擇加法操作,後面的功能會在後文詳細介紹。
-
第一階段:提取
這些16位的二進制指令實際是存儲在RAM或者Cache中的,執行CPU想要執行這個指令,需要将他從RAM中提取出來。由程式計數器(Program Counter)指定存儲器的位置。(程式計數器儲存供識别程式位置的數值。換言之,程式計數器記錄了CPU在程式裡的蹤迹。)
-
第二階段:解碼
CPU根據存儲器提取到的指令來決定其執行行為。
在解碼階段,指令被拆解為有意義的片段。根據CPU的指令集架構定義将數值解譯為指令。一部分的指令數值為運算碼(Opcode),其訓示要進行哪些運算。
如本例中的指令為:
0001 0000 1000 0100
可以按照不同字段的作用解析為以下格式:
-
第三階段:執行
經過解碼,一條指令可以被解碼成很多不同的微指令,這些微指令片段被控制器輸出到不同的寄存器,進而控制不同的寄存器操作,完成加法功能。比如在例子中,控制器選擇了R0和R1寄存器,并将他們的值送到ALU算術邏輯單元進行加法運算。
-
第四階段:寫回
完成加法功能之後,運算結果被寫入到R2寄存器中。
運算結果經常被寫進CPU内部的暫存器,以供随後指令快速存取。在其它案例中,運算結果可能寫進速度較慢,但容量較大且較便宜的主記憶體中。某些類型的指令會操作程式計數器,而不直接産生結果。這些一般稱作“跳轉”(Jumps),并在程式中帶來循環行為、條件性執行(透過條件跳轉)和函式。許多指令會改變标志暫存器的狀态位元。這些标志可用來影響程式行為,緣由于它們時常顯出各種運算結果。例如,以一個“比較”指令判斷兩個值大小,根據比較結果在标志暫存器上設定一個數值。這個标志可藉由随後跳轉指令來決定程式動向。在執行指令并寫回結果之後,程式計數器值會遞增,反覆整個過程,下一個指令周期正常的提取下一個順序指令。
3、宏觀實作預覽
在這裡我們簡單預覽一下已完成Demo整體的運作步驟,結合着以上的理論簡要分析Demo的大體實作;
目的是經過示例了解CPU各個子產品的功能以及系統資料流圖。
在後文第4部分往後将會詳細講解各個部分的具體實作,第一遍看下留個整體映像,與後文結合,前後對照将會加深了解,
3.1 系統總覽
(使用logisim軟體的仿真功能)
子產品解析:
在以上子產品的基礎上加上了CLK時鐘子產品,RST複位子產品和S-B/I子產品;
其餘子產品上文簡要介紹過,在後文也将具體介紹每個子產品的引腳功能,這邊隻需要大體了解。
- CLK:時鐘子產品,這裡一個指令周期被細分為四個機器周期,以分步執行微指令
- RST:複位子產品,使系統回到初始狀态
- ROM:存放指令的地方,這裡每一條指令以四位16進制序列的形式存放在ROM中
- Controller:控制子產品,包含三部分
- 程式計數器(PC)
- 指令寄存器(IR)
- 指令譯碼器(ID)
- Regs:寄存器組,裡面包含
- R0~2:三個用來存放資料的資料寄存器;
-
R3:一個用來存放位址的位址寄存器
注:寄存器組中的寄存器隻是暫時存放資料。
- S-B/I:通路選擇器,可選擇B通道導通或者I立即數通道導通
- ALU:算術邏輯單元,主要計算A、B通道的輸入,并将他們從output輸出到Regs的data端口。
- RAM:記憶體,CPU内部存放資料的地方,寄存器組中的寄存器隻是暫時存放資料。
3.2 舉例示範流程
還是以上的例子:加法操作,ADD R2,R0,R1
這句代碼在ROM的位置在
于是我們從這裡開始執行:點選clk産生時鐘信号:
3.2.0 機器周期0:
在機器周期0中,順着紅線的思路往下走:
① 、TC_en為PC功能的使能,使能之後,+1後的PC指向現在将要取指的指令的位址,P_addr=0000 0110=06
②、 P_addr輸出到ROM的A口,在ROM中選中位址為06的指令—— 1084
③、指令從ROM的D口傳給指令寄存器(IR)中的指令入口
*因為此時TI_en取指使能口還為0,未使能,是以指令還沒有進入IR
3.2.1 機器周期1:
再次點選clk,進入第二個機器周期:
- 1、系統給了TI_en高電平,使能了取值功能,資料進入指令寄存器IR中;
- 2、 指令進入IR後立即被譯碼器(ID)譯碼,譯碼後變成不同的控制電平從各個控制位輸出;
- 3、不同的控制位控制不同的功能,
-
3.1 R/W控制位為1,意味着實作的是寫功能:
這裡的寫的意思是将計算結果寫入寄存器的意思,W控制位控制寄存器組(Regs)中的R/W位
-
3.2 S-op:選擇運算方法(Select-operation):(5位)
10000這五位控制算術邏輯單元(ALU),表示選擇加法操作。
ALU選擇了這個功能會将A,B通道輸入的值相加,并從output口輸出,預設輸出到寄存器組(Regs)的data口
-
3.3 S-Regs:選擇寄存器(Select-Register)(8位)
1000 0100這八位控制寄存器組,這8位選擇的是加操作時,哪幾個寄存器是加數(源寄存器),哪個寄存器是被存放結果的目的寄存器:
在Regs子產品内部中具體的控制效果如下圖中紅色小圈:
右邊的紅色大圈為Regs子產品中輸出的值,分别輸出給3.2中ALU的A、B通道,給ALU進行加法運算。
在這裡的進度中,ALU還未将計算結果傳回給Regs寄存器組,于是,寄存器組中存入資料的藍色框框為原來的資料。
-
- 緊接在上面的過程之後,是ALU進行加運算的過程。資料流圖如下:
- 4、Regs中輸出的數值傳給ALU的A、B通道。在ALU内部子產品中進行加運算
- 5、加運算後,ALU将結果輸出給Regs的data口,于是又回到寄存器組Regs中了。 這個資料在Regs中等待被存進R2中,需要等到clk時鐘到來時候,才能被使能寫入R2中。
3.2.2 機器周期2:
在這個機器周期中,clk使能RAM,使資料能夠存進去,由于本add操作中不需要把資料存進RAM中,是以此周期沒啥改變:
3.2.3 機器周期3:
在本周期中,clk給了Regs中的clk端口高電平,使能了Regs中資料寫入功能:
在寄存器組子產品内部中,clk得到了高電平,使能了資料寫入功能,待寫入的資料為data,待寫入的寄存器為R2(10)
R2的值變成了03。
至此,整個加法操作完成。接下待進入各個子產品的詳細設計與說明。
4、系統設計
4.1 CLK子產品
子產品在整個CPU中的作用就是将一路CLK信号變成4個循環的機器周期,4個機器周期組成一條指令的執行周期,也就是一個指令周期。
- 預覽
- CLK子產品的内部組成:
- CLK基礎子產品連接配接一個初始為0,最大計數為3,的一個計數器,這樣可以構成一個周期為4的循環
- 計數器的輸出接到一個Decoder解碼器上,将計數輸出轉變成四個不同的CLK輸出,構成四個機器周期
- 內建之後的CLK子產品:
4.2 Regs子產品
-
寄存器組子產品的作用:
選擇待存資料的寄存器和将要輸出資料的寄存器,data
選擇寄存器資料輸出通道A/B
選擇存儲位址的位址寄存器,addr
*寄存器的作用是在運算過程中短暫存儲資料或者位址,不能像ROM那樣長期存儲
- 預覽:
子產品内部組成
内部結構圖示:
- 輸入:
-
data
待存入的8位2進制資料,是ALU子產品的output輸出的數值
-
-
控制位:
Regs子產品共8位控制位
-
R/W (1位)
選擇讀取寄存器的數值還是将數值寫入寄存器,0讀1寫
-
CLK (1位)
讀寫功能的使能,當時鐘到來時才能進行讀寫功能
-
C-Reg (2位):(Choose-Register)
當選擇寫功能的時候,選擇将要寫進資料的寄存器,00代表選擇R0,01-R1,10-R2,11-R3
-
SA (2位)
當選擇讀寄存器功能的時候,選擇A通道輸出哪個寄存器的值
-
SB (2位)
當選擇讀寄存器功能的時候,選擇B通道輸出哪個寄存器的值
-
- 寄存器組:
-
三個資料寄存器,R0,R1,R2
用來短暫存放用于計算的資料的寄存器
-
一個位址寄存器,R3
專用于将資料寫進記憶體的操作中(WM),用于辨別寫進RAM中的位址,有自加的指令,相當于PC
-
-
輸出
寄存器組共一個數值輸入和兩個資料輸出
- A通道有兩個功能 :
- 輸出數值給ALU的A口運算
- 輸出位址給RAM的A(address)口,選擇存進RAM的位置
- B通道也有兩個功能
- 輸出數值給ALU的B口運算
- 輸出資料給RAM的D(Data)口,選擇存進RAM的數值
- A通道有兩個功能 :
-
控制位詳解:
由上可知,共8個控制位;
其中 C-Reg(2位)、SA(2位)、SB(2位)這6位控制位的控制字段來自控制器子產品傳遞過來的8位二進制字段S-Regs,也就是下圖中紅線标注的這一部分:
而R/W(1位)控制位也是由控制器傳出的控制字段R/W決定
clk(1位)控制位則是由CLK子產品的第四個機器周期給的clk信号
- 以下是指令詳解:
- 內建之後的子產品:
4.2 ALU子產品
-
作用
ALU顧名思義算術邏輯單元,CPU的本質就是處理運算,是以,ALU與Controller可以算是CPU的核心部分,
可以簡單的将這部分了解成一個黑匣子;兩個運算輸入和一個運算輸出,還有一個功能選擇。
(其實主要是由于這部分是課設的隊友做的,我也沒太大研究,主要研究指令集以及控制器,寄存器部分,如果以後有興趣了應該會具體補充)
- 預覽
子產品組成:
- 有兩個資料輸入端
-
A通道資料輸入:
是Regs子產品A通道輸出的資料
-
B通道資料輸入
是Regs子產品B通道輸出的資料 ;
或者是 立即數通道的立即數輸入;
由S-B/I子產品決定,一般情況下預設為B通道資料,下文講解
-
-
一個資料輸出端Output:
計算結果輸出,直接輸出到Regs子產品的data(待寫入資料)端口
- 五個控制位,四個控制字段:
- Cin(1位)
- S1 S0 (2位)
- S2(1位)
- S3(1位)
- 控制位詳解:
同上,這五位控制位,來自控制器傳出的五位控制字段:
- 指令詳解:
- 子產品內建:
4.3 S-B/I子產品
這是自己定義的一個子產品名,意為Select-Btunnel/Immediatetunnel選擇B通道還是立即數通道
-
作用
我們知道,我們在進行加法運算的時候需要Regs子產品的A通道輸出R0寄存器的值給ALU的A通道,需要Regs子產品的B通道輸出R1寄存器的值給ALU的B通道,來使ALU完成加運算。
但是在别的指令中,比如說指派MOV指令:MOV R0,1
我們需要将立即數1的值寫進R0寄存器,而已知的寫寄存器的資料是從ALU的Output傳遞給Regs的data口的;
是以我們需要考慮怎麼将立即數傳給ALU,于是我們可以将要寫入的立即數寫入指令中,在解碼之後,傳給立即數通道,通過立即數通道傳給ALU,将B通道與立即數通道複用,通過一位判斷位判斷什麼時候用哪個通道輸入給ALU的B輸入口。
- 預覽如下:
- 子產品組成:
-
B通道資料輸入:
一個8位的Regs子產品的B通道資料輸入
- I 立即數通道資料輸入:
- 一個解碼後的4位的立即數輸入
- 因為輸出為8位,是以還需要一個4位extend8位的拓展器
-
S-B/I的選擇信号:
0代表預設選擇B通道資料,1代表選擇立即數通道
- 一個2選1的選擇器,多路選擇器
-
一個8位資料輸出
輸出選擇的資料到ALU的B資料輸入口
-
- 子產品內建
4.4 控制器子產品
-
作用
我們知道,CPU是計算機的核心,而控制器是一個CPU的核心。控制器的功能主要有取指、解碼、控制各寄存器進行執行微指令。
- 預覽:
-
組成:
控制器包括:
-
PC(程式計數器)
負責儲存程式執行到的位置,
-
IR (指令寄存器)
當計算機的某一計算循環開始時,先根據位址寄存器的位址,從記憶體儲器(RAM)中讀出一條指令,存入指令寄存器中。
-
ID (指令譯碼器)
指令寄存器的相應位送入指令譯碼器(操作碼譯碼、變址譯碼等)。根據譯碼結果産生相應的控制信号,完成指令規定的運算、傳送資料等動作。
-
4.4.1 程式計數器(PC)的設計
-
作用:
PC的作用在于知道指令在哪裡;
一般來說,程式包括三種結構:順序、分支和循環;其中分支和循環實際上可以由跳轉(Jump)實作,
是以程式的執行方式可以歸納為順序和跳轉:
- 對于順序執行,隻需要對程式計數器每次加一個固定的數即可實作;
- 對于跳轉,有兩種方式實作,一種是絕對跳轉,一種是相對跳轉,
- 絕對跳轉直接給出下一條指令的位址,對程式計數器直接置數,
- 對于相對跳轉,則通過程式計數器加上或者減去某個值實作,一般來說大多數情況下用的是相對跳轉。
-
理論實作:
程式計數器可以用寄存器、加法器和資料選擇器實作。
以下是用logisim設計的PC電路:
(電路設計部分參考文章開始的連結)
- 如果程式順序執行,則PC加上MUX選擇的常數01
-
如果程式要跳轉,MUX選擇下方的通路,資料為位址偏移量,PC=PC+位址偏移量
(MUX為二選一的選擇器,或者可以了解為閘門,一個時刻隻有左邊的一路被選擇輸出)
-
實際設計:
由于本次課設要求簡單實作,CPU功能,是以極盡簡化之後的系統隻需要簡單的順序執行程式,是以,選擇分支部分就可以省去,最終的模型如下:
- Tc_en:PC+1的使能,實際作用是将加1後的PC輸出到P_addr
- RST:複位
4.4.2 指令寄存器(IR)的設計
PC将位址傳給P_addr之後經曆如下過程
①、程式計數器給定了位址輸出到存儲器(ROM)中;
②、ROM會将對應位址的16進制指令給IR寄存器的I-in指令入口;
此時指令邏輯上是暫時存在I_in中,還沒有進入IR,需要TI_en取指使能口變成高電平,
資料才會靜茹IR指令寄存器
(指令寄存器與一般的寄存器功能一樣,暫時存放指令)
- 實際實作:
4.4.3 指令譯碼器(ID)的設計
在設計指令譯碼器之前,我們首先要明确指令格式,這裡使用得指令集設計标準類似MIPS,隻不過MIPS指令集為32位,這裡為16位。
這裡的16位指令是根據算術邏輯單元(ALU)與寄存器組(Regs)的控制字段設計的,指令部分在下文會有詳細解釋,這邊先說以下指令譯碼器的設計部分。
-
作用:
指令譯碼器的作用在于翻譯指令,我們知道指令在CPU中實際是一個二進制序列,
是有操作碼,操作數組成,分别代表要進行進行什麼操作,以及操作的具體數值和寄存器,
将一個二進制序列逐位拆解為不同的控制位,以控制不同的子產品單元。
-
實際實作:
注:ID不止是圖中矩形部分,還包括下面的S-op與S-Regs,或者準确說,左邊的分離分支splitter是譯碼器
16位的指令由一個splitter 分離逐位分離之後,變成不同的控制字段輸出-
0-7位:S-Regs
這8位主要控制寄存器或者立即數的選擇,在Regs子產品的設計中有詳細的介紹,在後文的指令格式詳解中也會有詳細介紹
-
8-12位:S-op
這5位主要控制ALU,功能是運算方式的選擇,在上面的例子中1 0000 代表選擇加法運算
- 13位:空位
-
14、15位:
這兩個位組合控制功能的選擇
具體功能如下:
于是我們隻需要将這2位的字段解析成每個控制字段的對應輸出就行
在實際電路中以一個譯碼器的方式實作:将2位二進制譯成4個輸出,實際是由真值表推出來:
-
5、指令結構詳解:
以下内容對應上文中ID指令譯碼器設計部分。
在設計指令譯碼器之前,我們首先要明确指令格式,這裡使用得指令集設計标準類似MIPS,隻不過MIPS指令集為32位,這裡為16位。這裡的16位指令是根據算術邏輯單元與寄存器組的輸入口的控制字段設計的。
而各個操作對應的控制字段如下:
其中V的意思是有效,X的意思是無效(無關),IM指的是立即數。
在上圖中,可以對W/CI/RM/WM/SF/JP/JW進行編碼,編碼成000,001,010,011,100,這樣隻需要三個信号就能确定六個控制信号了,也就是這樣:
以下為寫入ROM中的16進制代碼:
- 4001:
- 8030:
- 1084:
- 1390
- 15f0
- 本次設計用的仿真指令,存在ROM中:
具體釋義:
指令 | 彙編代碼 |
---|---|
4001 | MOV R0,1 |
8030 | STORE R3, R0 |
15f0 | INC R3,R3 |
4042 | MOV R1,2 |
8034 | STORE R3, R1 |
15f0 | INC R3,R3 |
1084 | ADD R2,R0,R1 |
8038 | STORE R3, R2 |
15f0 | INC R3,R3 |
1390 | SUB R2,R1,R0 |
8038 | STORE R3, R2 |
- 仿真效果:
結語:
課設完結,over