tft每日頭條

 > 圖文

 > 服務器怎麼看cpu數

服務器怎麼看cpu數

圖文 更新时间:2024-06-23 10:26:40

本文為《BUT HOW DO IT KNOW – The Basic Principles of Computer for everyone 》筆記,文章絕大部分圖片來自于這本書,用visio重新繪制,并增加不同的顔色,更便于閱讀。

這一篇主要介紹CPU中Control Section的構建。我們先來回憶一下計算機的組成:

服務器怎麼看cpu數(算機是如何讀懂0和1的)1

根據前面所述,計算機有兩大部分組成:CPU和RAM。CPU又包含Control section和ALU以及若幹個寄存器等。

上一篇文章說了,對于CPU來說,我們把具體幹活的部分稱之為ALU,把起調度功能的部分稱之為“Control section”,即控制單元。Control section調度過程又分為兩部分:指令解析數據準備


一、Control Section基本架構

Control section的基本功能很明确,就是通過解析指令,獲得各個寄存器的“讀”和“寫”使能端,大概樣子如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)2

左側為生成的“”使能信号;

右側為生成的“”使能信号;

“讀”使能對象為6個寄存器:RAM、ACC、R0、R1、R2、R3。

“寫”使能對象為8個寄存器,除RAM、ACC、R0、R1、R2、R3之外,還包括MAR、TMP。因為TMP隻有“寫”使能端,“讀”一直使能,而MAR則不要“讀”使能。

下面我們就以“加法”、“存入”以及“取指令”的過程來看一下這些使能信号是如何産生的。

1.1、如何實現加法

服務器怎麼看cpu數(算機是如何讀懂0和1的)3

前面我們介紹了stepper的實現方式,總共分成7步,其中step 7的作用是使stepper跳回至step 1,也就是說,我們能夠利用的是step 1到step 6。在每一步,都會産生clk e“讀”使能信号和clk s “寫”使能信号,其先後關系及持續時間為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)4

可見,“讀”信号先使能,爾後“寫”信号使能,爾後“讀”信号使能結束。這樣就能保證“寫”操作進行時所用的數據為當前step“讀”到的信号。

我們先來看一下step 4到step 6。實現邏輯如上圖所示,還記得我們前面說過的嗎?——左側為“讀”使能,右側為“寫”使能,我們整理一下上圖的邏輯,可以得到:

服務器怎麼看cpu數(算機是如何讀懂0和1的)5

Step 4:寄存器R1中的數在“讀”使能時,傳輸到BUS,在“寫”使能時,寫入到TMP裡;

Step 5:寄存器R0中的數在“讀”使能時傳輸到BUS,ALU開始工作,此時TMP在上一步已經準備好,兩個輸入TMP和R0都就位,ALU計算兩者的;在“寫”使能時,ALU計算的結果存儲到ACC,注意,此時不經過BUS。

Step 6:寄存器ACC中的數在“讀”使能時,傳輸到BUS,在“寫”使能時,寫入到R0裡;

總的效果就是:将R0中的數加上R1中的數,存儲到R0中


1.2、如何存入數據

前面将計算結果存儲到了寄存器R0中, R0是CPU内部寄存器,大多數時候我們想要存到RAM裡面,是否可實現呢?請看下圖:

服務器怎麼看cpu數(算機是如何讀懂0和1的)6

在時鐘的作用下,數據流向為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)7

Step 4:寄存器R2中的數在“讀”使能時,傳輸到BUS,在“寫”使能時,寫入到MAR裡;

Step 5:寄存器R0中的數在“讀”使能時傳輸到BUS,在“寫”使能時,開始往RAM裡寫數據,數值為R0,此時RAM中地位MAR存的數據是R2。

總的效果就是:将R0中的數據存到RAM中,存儲地址是R2中存的數據。


1.3、如何實現“取指令”

前面我們說了兩個例子,分别是将寄存器中的數相加,以及将寄存器中的數存到RAM指定的地址中去。

這是兩種完全不同的操作,怎麼來區分呢?——在step 1到step 3中實現。為此,我們要再增加兩個寄存器:IAR和IR,分别存儲指令地址和指令内容。此時,計算機的繼續豐滿,如下所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)8

其中IAR有“讀”和“寫”兩個使能端,也就是地址寄存器中内容可以有“讀”和“寫”兩個操作;IR隻有“寫”使能端,也就是指令寄存器隻能從總線拿數據。

接下來,我們就看一下取指令的過程是如何實現的,如下圖:

服務器怎麼看cpu數(算機是如何讀懂0和1的)9

數據流向如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)10

具體過程為:

Step 1:地址寄存器IAR在“讀”使能的時候,将數據傳輸到BUS,在“寫”使能的時候,存入MAR,即RAM中地址寄存器;Step 1還有一個動作,後面再說。

Step 2:RAM中地址為MAR的數據,在“讀”使能的時候,将數據傳輸到BUS,在“寫”使能的時候,存入指令寄存器IR;

Step 3:為了能讓程序自動執行,我們還需要更新IAR,一個最簡單的方式就是将IAR加1,這樣就對應RAM中IAR下一條指令。加法很容易實現,ALU中就有加法器,具體實現我們先不管,假設現在ALU的計算結果已經保存在ACC中,我們怎麼能讓程序自動運轉起來?——很簡單,寄存器ACC在“讀”使能的時候,将數據傳輸到BUS,在“寫”使能的時候,存入IAR,對應RAM中下一條指令;

怎麼實現ALU中IAR加1的功能呢?我們知道,ALU有兩個輸入,一個是TMP,一個來自總線BUS,BUS由于連接的東西很多,我們最好不要動他,剩下的就隻能在TMP上做做手腳。——解決方案就是在TMP和ALU中間增加一個模塊,這個模塊要實現的功能是要麼傳輸TMP裡面的數據,要麼傳輸1,具體實現方式如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)11

不難分析,這個電路的實現的功能很簡單,如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)12

那IAR加1的這個動作在哪一步實現呢?——step 1。我們知道在step 1的時候,IAR已經在BUS中,這時候我們bus 1=1,我們再将ACC使能,這樣IAR 1就存入到了ACC中。


二、ALU指令編碼及解析

對于一個8位CPU來說,指令可以分為兩大類,一類為ALU相關指令,主要包括需要ALU參與完成的相關指令,比如加法、移位、比較等;另一類是非ALU相關指令,比如加載數據,存儲數據,跳轉等。

無論哪種指令,都可以分為前4位和後4位,前四位和動作有關,後四位和數據有關

我們先說ALU相關指令,其基本定義如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)13

最高位為1表示該條指令為ALU指令,接下來三位為操作碼,表示ALU要幹的具體工作;後四位的前兩位和後兩位表示ALU運算所需要的數據所在寄存器的編碼,具體定義如上圖所示。

比如,有一條ALU(1)指令執行加法(000)運算,被加的内容是Resister 2(10)裡的數據與Resister 3(11)的數據,結果存放在Resister 3(11)裡面,那麼它對應的指令就是:

服務器怎麼看cpu數(算機是如何讀懂0和1的)14

如果把這條指令(1000 1011)存入RAM中,地址為10,那麼當IAR設為10時,開啟計算機,它就會從IAR為10的RAM中讀取該條指令,通過總線傳輸至IR,然後在Control Section的控制下,去計算R2和R3之和。

如果ALU指令是單輸入指令,比如SHL,SHR或者NOT,數據内容将來自Reg A,經過ALU運算,結果會被存在Reg B中。可以選在從一個寄存器取數,結果存到另外一個寄存器,比如R1→R3;可以選在從一個寄存器取數,結果存到同一個寄存器,比如R2→R2。

如果ALU指令是雙輸入指令,Reg A和Reg B将會被送到ALU,運算結果送到Reg B,Reg A和Reg B可以是同一個寄存器。

通過以上分析我們知道,ALU面對的是兩個輸入:Reg A和Reg B。Reg A和Reg B的邏輯相對是比較明确的,那就是Reg A (ALU) Reg B→Reg B,Reg A和Reg B進過ALU運算,結果存在Reg B裡面,具體實現方式如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)15

數據流總結如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)16

Step 4:“讀”和“寫”使能端有兩個條件:指令寄存器IR最高位為1,Stepper 4的clk信号為高;通過控制“讀”“寫”兩個信号,實現Reg B的内容加載到TMP裡面;

Step 5:“讀”和“寫”使能端有兩個條件:指令寄存器IR最高位為1,Stepper 5的clk信号為高,實現Reg B的内容加上TMP裡面存的Reg A,結果傳輸至Reg B;Stepper 5的clk信号還作為ALU操作碼産生信号的控制,也就是說,隻有在step 5才産生非000的ALU操作碼。

Step 6:隻要不是比較運算(操作碼111),都要将ACC的計算計算結果存儲至Reg B。

可見,對于ALU指令操作,就是Reg A和Reg B兩個寄存器的數據運算和存儲。但是呢,我們手上有4個寄存器:R0、R1、R2、R3,每一個Reg A或Reg B可以是R0、R1、R2、R3中的任意一個,因此,我們需要對R0、R1、R2、R3編碼,這樣,就可以實現對任何一個寄存器的操作,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)17

這樣就可以通過指令後四位的寄存器編碼,實現對寄存器裡面數據的操作。

服務器怎麼看cpu數(算機是如何讀懂0和1的)18

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)19


三、非ALU指令編碼及解析3.1、如何實現“load”和“store”指令

前面說了,當指令的第一位為1時,是ALU相關指令。接下來我們就看看當第一位不為1時的指令情況,見下圖:

服務器怎麼看cpu數(算機是如何讀懂0和1的)20

最高位0表示非ALU指令,接下來三位為000表示加載數據,001表示存儲數據。指令後四位和ALU指令一緻,表示寄存器的編碼。實現邏輯為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)21

當前四位為0000時:

Step 4:Reg A的數據存儲到RAM中(地址為MAR);

Step 5: RAM中地址為MAR的數據存儲到Reg A;

當前四位為0001時:

Step 4:Reg A的數據存儲到MAR;

Step 5: Reg B中的數據存儲到RAM中(地址為MAR);

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)22


3.2、如何實現“data”指令

當指令前四位為0010時,代表的是數據指令。與之前不同的是,這個指令有2個字節,後面緊跟的字節為要寫入寄存器的數據,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)23

實現方式為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)24

Step 4:讀取IAR中的數據,存儲到MAR中;bus 1使能,将IAR 1的結果存到ACC中;

Step 5:讀取RAM中的數據(地址為IAR),存儲到Reg B中;

Step 6:讀取ACC中的數據(此時為IAR 1),更新到IAR中;

注意:由于IAR在step 1的時候已經 1了,在step 4又 1,因此,下一條指令将跳過僅鄰的後一條指令(為需要載入的數據),從而實現将後一條緊鄰的輸入讀入的功能。

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)25


3.3、如何實現“jump”指令

當指令前四位為0011時,代表的是跳轉指令,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)26

實現方式為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)27

Step 4:Reg B中的數據存儲到IAR中,意味着下一次的指令将從IAR(目前為Reg B寄存器中存儲的數據),從而實現跳轉功能。

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)28


3.4、如何實現“jump to”指令

當指令前四位為0100時,代表的是跳轉到指令,注意,這也是一條2字節指令,緊鄰的後1字節代表要跳轉到的地址,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)29

實現方式為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)30

Step 4:将IAR中的數據存儲到MAR;

Step 5:将RAM中地址為IAR的數據存儲到IAR;

也就是IAR中的内容變成了RAM[IAR 1],實現到“跳轉到”功能。

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)31


3.5、如何實現“jump if”指令

當然還可以實現更複雜的跳轉指令,比如說有條件跳轉,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)32

前面我們說了,ALU計算會輸出四個标志位,分别為:carry out、a larger、equal和zero。如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)33

我們可以把這四個标志位作為判斷條件,實現有條件跳轉,實現方式如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)34

Step 4:IAR傳輸至MAR,IAR 1傳輸至ACC;

Step 5:ACC傳輸至IAR;

Step 6:若carry out、a larger、equal或zero其中之一為真,則RAM [IAR] 傳輸至IAR。

也就是說,新的IAR有兩種情況,正常情況下,程序将順序執行(跳過緊鄰的“地址”字節);當carry out、a larger、equal或zero之一為真時,程序跳轉到緊鄰字節所存儲的地址。

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)35

如果我們把指令某個位置1,這樣就可以進行組合标志條件跳轉,因為我們有4個标志位,共計有16種組合,當然,4個标志位都off時,就不需要跳轉,所以我們隻對剩下的15個标志位組合感興趣,其機器語言如下:

兩個标志位組合:

服務器怎麼看cpu數(算機是如何讀懂0和1的)36

三個或四個标志位組合:

服務器怎麼看cpu數(算機是如何讀懂0和1的)37


3.6、如何實現“clear flags”指令

當我們去做加法或者移位運算時,可能會用到carry進位标志位,比如在有條件跳轉時,就會用到這個标志位。

服務器怎麼看cpu數(算機是如何讀懂0和1的)38

Carry标志位還會作為加法和移位運算的輸入,這就帶來一個問題:Carry标志位是存在寄存器裡面的,會一直保存之前的記錄,當我們的運算不需要這個進位的時候,也會被ALU使用,這就可能會出現2 2=5的情況。

有很多種方式可以處理這個問題,現在我們采用一種比較簡單的方式來清除标志位,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)39

看着很簡潔,但是還是很有技巧的。首先,并沒有使能任何寄存器往BUS寫數據,這樣ALU的輸入A就是0000 0000。在Step 4的時候,使能Bus 1,所以此時ALU的輸入B為0000 0001。這是并沒有任何操作碼發送至ALU,因為默認的是ADD操作,這時ALU就會執行0000 0000 0000 0001=0000 0001,此時還可能有進位carry in,所以總的結果可能是0000 0001,也可能是0000 0010,但是肯定不會産生進位carry out。注意此時carry 标志位為off;結果不是零,所以zero标志位也為off;B比A大,所以“‘A larger”和“equal”也為off。也就是說,所有标志位都清零了。

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)40


3.7、如何實現“I/O”指令

當然,我們還需要相關的指令實現CPU和RAM與外部的數據交換,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)41

I/O總線包括數據總線和一些關鍵的内部信号,包括輸入/輸出标志位、數據/地址标志位、“讀”使能标志位、“寫”使能标志位,具體如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)42

其指令格式如下,前四位為0111就表示該指令為I/O指令。後四位第一位表示是輸入/輸出标志,第二位表示數據/地址标志位,最後兩位表示地址/數據的内容(存在Reg B中)。

服務器怎麼看cpu數(算機是如何讀懂0和1的)43

具體實現方式如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)44

Step 4:input/output标志位為1,指令前4位為0111時,Reg B寄存器“讀”使能,Reg B寄存器内容傳輸至BUS;I/O clk s标志位為on;

Step 5:input/output标志位為0,指令前4位為0111時,Reg B寄存器“寫”使能,BUS數據傳輸至Reg B寄存器;I/O clk e标志位為on;

助記符如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)45


四、控制單元集成

把前面所有介紹的指令用或門全部封裝在一起,就可以得到CPU的Control Section了。其實現的功能為:

服務器怎麼看cpu數(算機是如何讀懂0和1的)46

具體實現方式如下:

把前面所列的所有ALU指令封裝在一起,可以得到ALU相關指令的Control Section部分如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)47

繼續把所有非ALU指令封裝在一起,如下:

服務器怎麼看cpu數(算機是如何讀懂0和1的)48

把所有指令封裝在一起,如下圖所示:

服務器怎麼看cpu數(算機是如何讀懂0和1的)49

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved