廢話少說,先聊聊我們要造的這個計算機的硬件結構,本項目(整體計劃的實現,對于個人來說算個小吧,權當上勞動實驗課了)的目標是一個模型級的計算機,因此本著只要五臟俱全,不管是麻雀還是老鼠,只要包含主要結構就行。首先百度點基礎知識先科普一下。
馮諾依曼體系結構
馮氏結構是基本上目前市場上所有看到的通用計算機采用的結構,從我們見到的PC到各種平板電腦,到手機,幾乎全部都是這個結構(如果有專利費的,估計能夠收不少,可惜老馮早逝)簡單來說,如圖所示:
馮諾依曼計算機體系結構圖
關于這個結構的詳細的、專業的介紹,請參考百度百科:馮·諾依曼結構,馮·諾依曼體系結構
還好本項目的主要目標是把這樣一個模型給的玩意給造出來,就跟造車模一樣,能跑就行,至于原理術語什么的,知道和不知道對于這個事情來說區別不大,因此如果打開看不懂的話,也絲毫不影響接下來的工作。
簡單解釋一下:
1、 輸入設備: 就是不斷往對著電腦輸入信息的東西,最原始古老的當然是鍵盤,但是從廣義上來說,所有各種往計算機/手機里面能夠用于輔助把信息傳入的設備都算,鼠標啊,攝像頭,指紋識別,(當然,手指頭不算,嚴格來說,手指頭所接觸的那一層電容屏幕算),在本項目里面,當然,我們只考慮鍵盤,最標準最簡單的鍵盤。
2、存儲器:廣義來說,各種帶存的東西都算,內存,硬盤,SD卡,各種東西,反正就是能存東西的,相片、視頻、文件、軟件等等,當然內存和其它的還是有所區別,不過無所謂了。
3、輸出設備:顧名思義,輸入的信息在電腦里面加工處理了,就得在輸出設備上輸出來,最多的就是屏幕,各種屏幕,電腦顯示屏、手機、平板的顯示屏,打印機也是。
4、運算器和控制器:這兩塊內容是CPU里面的,關于CPU,一般人可能聽得很多,但做得很少,當然一個能夠賣錢的CPU很復雜,但是對于本項目來說,復雜度會降低很多個量級(當然,也還是整個設計里面硬件部分最復雜的內容),運算器做為CPU的核心部分,實現的功能就是運算,CPU的主要功能就是實現在控制器控制下的運算(廣義的)。
簡單的舉個例子說明這幾部分是怎么接在一起干活的,就是上面圖是提到的數據流、指令流和控制流什么的,其實撇開這些術語,比如在鍵盤上按一下字母“1+1=”,然后在屏幕的上顯示出來“2”,主要的實現過程是這樣的:
1、在鍵盤上依次按下“1”“+”“1”“=”,回車這幾個鍵。
2、按了這幾個鍵以后,實際上傳輸過去的是一些電流信號(不用care),這個時候,CPU里面的控制器就告訴鍵盤和存儲器,讓把這些上面輸入的東西依次存在存儲器里面,比如說內存,同時還要告訴屏幕,你把內存里面的這些字符串顯示出來吧。
3、存了以后,這個時候,運算器就把這個內容讀進來,然后算一下,在這里結果是等于2(當然,我們希望他等于別的也行),然后把2這個結果完了以后,再寫到內存里面,然后控制器再告訴屏幕,把2顯示出來。
OK,整個結果基本就是這樣,這是老馮這幫牛人的偉大和牛X之處,總能夠提出一些簡單易懂但是強大好用的東西。
怎么好用呢?以后再聊。
運算器設計
這里最核心的是運算器的設計,在本項目里面,設計的運算器,基本上就是一個very 的計算器,支持一些最簡單的運算。這個東東有一個比較學術的詞(算術邏輯單元, Logic Unit,ALU)以下都叫ALU,或者就叫運算器。在本項目里面要實現的ALU是這么樣的一個東西
ALUf
解釋一下,整個運算器的主要運算是支持兩個16的輸入x和y的運算,運算結果的輸出也是16位的,支持的計算包括:x+y, x-y, y–x,0, 1, -1,x, y, -x, -y,!x, !y,x+1, y+1, x-1, y-1,x&y, x|y,上面的zx、nx、zy什么的是控制位,主要的作用這樣的:
ALU的計算指令表
這個表里面,上面的這些位都是一個bit的控制位,第一行,當zx位是1話,那么x就是0,然后zy是1,y就是0, 然后f是1,最終結果就是x+y,在這種情況下,x和y不管輸入是多少,計算的結果都是0,這一共18條運算指令就構成了這個ALU的指令集,比如倒數第5行,只有在zx、nx zy ny no都為0,f位為1時,才會執行x+y操作,當輸入x為00010(十進制的2), y為00011(十進制的3),輸出的out為00101(十進制的5)。
zr和ng是兩個標志位,當輸出out為零的時候,zr為1,否則 為0;當out總之,這個東西實際造出來以后,就是一個很強大計算器。看看當年這么強大的計算器,引發了沃茲的個人電腦構想,才有了蘋果的誕生。
傳說中個人計算機鼻祖--牛郎星8800
牛郎星8800開箱圖
這個電腦的輸入設備是什么呢?就是看到的那個銀色的小旋鈕,可以上下扳的那種,代表輸入的0或1, 輸出設備是什么呢?就是這些漂亮的小紅燈。
神奇不,據說當時推出的時候,只要397美元,不是9999,也不是999,是397,你沒有聽錯,就是美元,這樣的低價,這么強大的功能, 我勒個去!
邏輯門的概念
關于上述的運算器,怎么開始實現呢?這個需要從最簡單的邏輯門開始。
在學習數字電路這門課的時候,老師上來就講邏輯函數,畫卡諾圖什么的,主要就是怎么對付考試,實際上真正有趣的東西好像基本上就沒講,還是在某次做實習的才發現這個東東確實非常有趣,可以通過自己接線,來按照你自已的意圖進行實現,可惜的是一學期就讓上了一次實驗課。。現在大學教育確實有點那啥。。盡整高大上,也不怎么接地氣。算了,扯遠了,還是回來吧。
關于邏輯門的基本概念還是介紹一下,這個東西還是需要理解的。
邏輯運算又稱布爾運算,無論是輸入還是輸出,都只有0和1,用來表示兩個對立的邏輯狀態。用來執行與、或、非這三種最基本邏輯運算的元件稱為與、或、非門。在圖中左側是輸入的信號,右側是輸出的信號,對于邏輯門元件來說,必須有輸入和輸出,可以是一對一,也可以是多對多。
非門:執行的是“非”的操作,一個輸入信號和一個輸出,對于輸入的數據,取該數據的相反數據。
非的邏輯示意圖
以下的幾張物理實現的示意圖是丹尼爾.希利斯在他的書《通靈芯片》里面提到的用彈簧和本桿實現的與 或 非門,假如把木桿往前視為1電腦計算器怎么算反三角函數,往回視回0,從該圖可以看到,當輸入為前時,輸出則為后,輸入為后時,則輸出為前,實現了非門的邏輯。
非門的一個物理實現示意
或門:執行的是“或”的操作,兩個輸入信號和一個輸出,對于兩個輸入x和y,當x或y只要其中一個為1時,輸出就為1。
或門邏輯示意
同樣,在這個物理實現的或門上,可以看到無論哪個輸入是往前,那么輸出都會往前。
或門的物理實現示意
與門:執行的是“與”的操作,兩個輸入信號和一個輸出,對于兩個輸入x和y,只有x與y都為1時,輸出才為1。和或門的圖標相比,左邊的輸入線是直的。
與門邏輯示意圖
這個與門的實現,你自已就得好好看看了。
與門物理實現示意
通過這三種基本的邏輯門,就可以實現所有的邏輯運算,進而在上面構造出一整套的計算。沒錯,計算機的本質就是上述提到的與門、或門、非門等等各種門,只要實現了類似的功能,把成千上萬個這些東西連接在一起,任何東西都能夠做成一臺計算機。木頭,水泵,塑料,卡子,只要能夠完成基本邏輯門的功能,任何東西都能夠制成計算機。
丹尼爾.希利斯的積木計算機
丹尼爾.希利斯的積木計算機(全景)
我們的征途,從這里開始。
從加法開始
上面說的邏輯門聽起來圖森破的樣子,或許你會懷疑這些簡單的邏輯門能夠做什么事情,接下來我們看看邏輯門怎么實現基本的計算功能。
與我們平常支持0 到9 的十進制計算不同。因為整個計算機系統只有0 和1兩個數,所以這樣的計算機系統只能夠支持0 和1 的二進制計算,在計算機系統里面電腦計算器怎么算反三角函數,所有的計算都需要轉換成二進制。十進制與二進制的對應轉換關系如表所示。(話說當初萊布尼茲,沒錯就是微積分里面那個,發明二進制運算的時候)
十進制和二進制轉換表
舉個簡單的例子,比如實現2 + 3 = 5 這樣的計算,在二進制加法中規則是:1和0相加得1,1和 相加需要往前進一位,得10。二進制和十進制的基本操作過程是一樣的,例子是一個2+3=5的二二進制計算示例。
為了實現上述計算功能,需要首先實現半加器,通過半加器實現全加器,再通過三個全加器的連接,就能夠形成支持上述計算的一個三位加法器了。
半加器(Half Adder):如圖所示,對于給定的輸入a 和b(它們都只能取0或者1),通過一個或門、兩個與門、一個非門(圖中小圓點)的組合,可以對兩個位進行加法并形成進位。(sum表示求和結果,carry表示進位)
半加器實現示例
半加器的輸入和輸出過程
全加器(Full Adder):如圖所示,通過兩個半加器和一個或門的組合,形成了一個全加器。與半加器相比,全加器在輸入上多了一個接收的進位,可以把從低位進位而來的數據納入到計算中,將從低位計算產生的進位也加在一起。(其中x、y 表示兩數相加,c 表示接收低位的進位)。全加器的輸入和輸出過程見表3-3。
全加器實現示例
全加器的輸入和輸出表
三位加法器:通過三個全加器的組合,就形成了一個三位加法器。該加法器可以把從低位相加產生的進位依次傳遞到高位,可以實現任意三位的二進制數的加法,即可以實現上述例子中的計算。
三位加法器的實現示例圖
依次把進位傳到下一個全加器。同理,我們可以通過任意位的加法器來實現對于較長二進制數的計算。盡管我們只介紹了加法運算的實現,實際上數學家已經證明,加法是實現所有數學運算的基礎。有了加法器,原則上就能通過它們搭建任何其他計算,像乘法、除法、平方、開方、三角函數、對數函數等。
而另外一個大牛圖靈在一百年前(好像還不到一百年,當年年輕的圖靈躺在劍橋國王學校前草坪上開始在腦子里面構想這些東西的時候,好像是三十年代,那是一個科學和恐怖主義都極度興盛的時代啊)就已經指明,這些簡單運算足以支撐任何信息處理過程。
這個事情看起來似乎太扯了,搞這么一個東西,從邏輯門開始,要拼這么多東西,才能夠實現一個8(2的3次方)以內的加法運算。但是這個東西的牛X之處在于,簡單的東西是可以連接在一起變成復雜的東西。兩個算盤連在一起只是一個更長的算盤,而這些邏輯門連在一起,可以構成復雜的計算世界。而且可以體積很小,大規模的疊加。這也是現在整個時代的秩序運行的基礎,如果一旦發生了像劉慈欣在《球狀閃電》里面描述的那個宏中子爆炸引起的效果,那無數的低頭一族將會全部崩潰(或許我們的世界能夠因此更美好?)
整體實現
OK,OK,加法有了,ALU就搞定了嗎?很抱歉,還差點,不過差得不多了。
加法器是最核心的部分,但是我們還差一些別的東西,現在再看下我們需要實現的計算指令:
ALU支持的計算指令
在這里面,除了x+y,還有對x和y取反, 還有與(&)和或(|),沒有提x-y關于這里面的設計,有一個東西是必不可少的,就是多路選擇器。
選擇器示意圖
這個東東實現的的功能就是根據sel位的控制,判斷輸出的時候,選擇a或者b中的哪一個,這個東西當然也是由基本的與或非門組成的。而且這個東西也可以擴展,比如a和b可以是多位的,在咱們要用的cpu里面,選擇的是16位的,而且這個sel可以是兩位或者更多,可以選擇從四個或者8個輸入里面選擇指定的一個作為輸出。 當然,也有反過來選擇器 ,根據sel位判斷對于輸入的in,從給定的A和B哪個輸出口進行輸出。
針對上面提到的這些運算指令,可以有無數中實現方法,這個圖給出的是實現方法之一:
ALU實現示意圖
在這個圖里面用了好幾個,就是指的一個16位選擇器, 用到了一個16位的加法器,,然后就是眾多的與或非門。
含有計算指令表的計算器有了,接下來干什么呢, 且聽下回分曉。
讓蘋果砸得更猛烈些吧!!!