話接上文:? 造個(gè)計(jì)算機(jī)
廢話少說(shuō),先聊聊我們要造的這個(gè)計(jì)算機(jī)的硬件結(jié)構(gòu),本項(xiàng)目(整體計(jì)劃的實(shí)現(xiàn),對(duì)于個(gè)人來(lái)說(shuō)算個(gè)小project吧,權(quán)當(dāng)上勞動(dòng)實(shí)驗(yàn)課了)的目標(biāo)是一個(gè)模型級(jí)的計(jì)算機(jī),因此本著只要五臟俱全,不管是麻雀還是老鼠,只要包含主要結(jié)構(gòu)就行。首先百度點(diǎn)基礎(chǔ)知識(shí)先科普一下。 ??
馮諾依曼體系結(jié)構(gòu)
馮氏結(jié)構(gòu)是基本上目前市場(chǎng)上所有看到的通用計(jì)算機(jī)采用的結(jié)構(gòu),從我們見到的PC到各種平板電腦,到手機(jī),幾乎全部都是這個(gè)結(jié)構(gòu)(如果有專利費(fèi)的,估計(jì)能夠收不少,可惜老馮早逝)簡(jiǎn)單來(lái)說(shuō),如圖所示:

關(guān)于這個(gè)結(jié)構(gòu)的詳細(xì)的、專業(yè)的介紹,請(qǐng)參考百度百科:?馮·諾依曼結(jié)構(gòu),?馮·諾依曼體系結(jié)構(gòu)
還好本項(xiàng)目的主要目標(biāo)是把這樣一個(gè)模型給的玩意給造出來(lái),就跟造車模一樣,能跑就行,至于原理術(shù)語(yǔ)什么的,知道和不知道對(duì)于這個(gè)事情來(lái)說(shuō)區(qū)別不大,因此如果打開看不懂的話,也絲毫不影響接下來(lái)的工作。
簡(jiǎn)單解釋一下:
1、 輸入設(shè)備: 就是不斷往對(duì)著電腦輸入信息的東西,最原始古老的當(dāng)然是鍵盤,但是從廣義上來(lái)說(shuō),所有各種往計(jì)算機(jī)/手機(jī)里面能夠用于輔助把信息傳入的設(shè)備都算,鼠標(biāo)啊,攝像頭,指紋識(shí)別,(當(dāng)然,手指頭不算,嚴(yán)格來(lái)說(shuō),手指頭所接觸的那一層電容屏幕算),在本項(xiàng)目里面,當(dāng)然,我們只考慮鍵盤,最標(biāo)準(zhǔn)最簡(jiǎn)單的鍵盤。
2、存儲(chǔ)器:廣義來(lái)說(shuō),各種帶存的東西都算,內(nèi)存,硬盤,SD卡,各種東西,反正就是能存東西的,相片、視頻、文件、軟件等等,當(dāng)然內(nèi)存和其它的還是有所區(qū)別,不過(guò)無(wú)所謂了。
3、輸出設(shè)備:顧名思義,輸入的信息在電腦里面加工處理了,就得在輸出設(shè)備上輸出來(lái),最多的就是屏幕,各種屏幕,電腦顯示屏、手機(jī)、平板的顯示屏,打印機(jī)也是。?
4、運(yùn)算器和控制器:這兩塊內(nèi)容是CPU里面的,關(guān)于CPU,一般人可能聽得很多,但做得很少,當(dāng)然一個(gè)能夠賣錢的CPU很復(fù)雜,但是對(duì)于本項(xiàng)目來(lái)說(shuō),復(fù)雜度會(huì)降低很多個(gè)量級(jí)(當(dāng)然,也還是整個(gè)設(shè)計(jì)里面硬件部分最復(fù)雜的內(nèi)容),運(yùn)算器做為CPU的核心部分,實(shí)現(xiàn)的功能就是運(yùn)算,CPU的主要功能就是實(shí)現(xiàn)在控制器控制下的運(yùn)算(廣義的)。
簡(jiǎn)單的舉個(gè)例子說(shuō)明這幾部分是怎么接在一起干活的,就是上面圖是提到的數(shù)據(jù)流、指令流和控制流什么的,其實(shí)撇開這些術(shù)語(yǔ),比如在鍵盤上按一下字母“1+1=”,然后在屏幕的上顯示出來(lái)“2”,主要的實(shí)現(xiàn)過(guò)程是這樣的:
1、在鍵盤上依次按下“1”“+”“1”“=”,回車這幾個(gè)鍵。
2、按了這幾個(gè)鍵以后,實(shí)際上傳輸過(guò)去的是一些電流信號(hào)(不用care),這個(gè)時(shí)候,CPU里面的控制器就告訴鍵盤和存儲(chǔ)器,讓把這些上面輸入的東西依次存在存儲(chǔ)器里面,比如說(shuō)內(nèi)存,同時(shí)還要告訴屏幕,你把內(nèi)存里面的這些字符串顯示出來(lái)吧。
3、存了以后,這個(gè)時(shí)候,運(yùn)算器就把這個(gè)內(nèi)容讀進(jìn)來(lái),然后算一下,在這里結(jié)果是等于2(當(dāng)然,我們希望他等于別的也行),然后把2這個(gè)結(jié)果完了以后,再寫到內(nèi)存里面,然后控制器再告訴屏幕,把2顯示出來(lái)。
OK,整個(gè)結(jié)果基本就是這樣,這是老馮這幫牛人的偉大和牛X之處,總能夠提出一些簡(jiǎn)單易懂但是強(qiáng)大好用的東西。
怎么好用呢?以后再聊。
運(yùn)算器設(shè)計(jì)
這里最核心的是運(yùn)算器的設(shè)計(jì),在本項(xiàng)目里面,設(shè)計(jì)的運(yùn)算器,基本上就是一個(gè)very sample的計(jì)算器,支持一些最簡(jiǎn)單的運(yùn)算。這個(gè)東東有一個(gè)比較學(xué)術(shù)的詞(算術(shù)邏輯單元,Arithmetic Logic Unit,ALU)以下都叫ALU,或者就叫運(yùn)算器。在本項(xiàng)目里面要實(shí)現(xiàn)的ALU是這么樣的一個(gè)東西

解釋一下,整個(gè)運(yùn)算器的主要運(yùn)算是支持兩個(gè)16的輸入x和y的運(yùn)算,運(yùn)算結(jié)果的輸出也是16位的,支持的計(jì)算包括: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什么的是控制位,主要的作用這樣的:

這個(gè)表里面,上面的這些位都是一個(gè)bit的控制位,第一行,當(dāng)zx位是1話,那么x就是0,然后zy是1,y就是0, 然后f是1,最終結(jié)果就是x+y,在這種情況下,x和y不管輸入是多少,計(jì)算的結(jié)果都是0,這一共18條運(yùn)算指令就構(gòu)成了這個(gè)ALU的指令集,比如倒數(shù)第5行,只有在zx、nx zy ny no都為0,f位為1時(shí),才會(huì)執(zhí)行x+y操作,當(dāng)輸入x為0000000000000010(十進(jìn)制的2), y為0000000000000011(十進(jìn)制的3),輸出的out為0000000000000101(十進(jìn)制的5)。
zr和ng是兩個(gè)標(biāo)志位,當(dāng)輸出out為零的時(shí)候,zr為1,否則 為0;當(dāng)out<0的時(shí)候,ng為1,否則為0。在這里對(duì)于!x, x&y, x|y需要解釋嗎?需要嗎?不需要嗎?
總之,這個(gè)東西實(shí)際造出來(lái)以后,就是一個(gè)很強(qiáng)大計(jì)算器??纯串?dāng)年這么強(qiáng)大的計(jì)算器,引發(fā)了沃茲的個(gè)人電腦構(gòu)想,才有了蘋果的誕生。


這個(gè)電腦的輸入設(shè)備是什么呢?就是看到的那個(gè)銀色的小旋鈕,可以上下扳的那種,代表輸入的0或1, 輸出設(shè)備是什么呢?就是這些漂亮的小紅燈。
神奇不,據(jù)說(shuō)當(dāng)時(shí)推出的時(shí)候,只要397美元,不是9999,也不是999,是397,你沒有聽錯(cuò),就是美元,這樣的低價(jià),這么強(qiáng)大的功能, 我勒個(gè)去!
邏輯門的概念
關(guān)于上述的運(yùn)算器,怎么開始實(shí)現(xiàn)呢?這個(gè)需要從最簡(jiǎn)單的邏輯門開始。
在學(xué)習(xí)數(shù)字電路這門課的時(shí)候,老師上來(lái)就講邏輯函數(shù),畫卡諾圖什么的,主要就是怎么對(duì)付考試,實(shí)際上真正有趣的東西好像基本上就沒講,還是在某次做實(shí)習(xí)的才發(fā)現(xiàn)這個(gè)東東確實(shí)非常有趣,可以通過(guò)自己接線,來(lái)按照你自已的意圖進(jìn)行實(shí)現(xiàn),可惜的是一學(xué)期就讓上了一次實(shí)驗(yàn)課?!,F(xiàn)在大學(xué)教育確實(shí)有點(diǎn)那啥。。盡整高大上,也不怎么接地氣。算了,扯遠(yuǎn)了,還是回來(lái)吧。
關(guān)于邏輯門的基本概念還是介紹一下,這個(gè)東西還是需要理解的。
邏輯運(yùn)算又稱布爾運(yùn)算,無(wú)論是輸入還是輸出,都只有0和1,用來(lái)表示兩個(gè)對(duì)立的邏輯狀態(tài)。用來(lái)執(zhí)行與、或、非這三種最基本邏輯運(yùn)算的元件稱為與、或、非門。在圖中左側(cè)是輸入的信號(hào),右側(cè)是輸出的信號(hào),對(duì)于邏輯門元件來(lái)說(shuō),必須有輸入和輸出,可以是一對(duì)一,也可以是多對(duì)多。
非門:執(zhí)行的是“非”的操作,一個(gè)輸入信號(hào)和一個(gè)輸出,對(duì)于輸入的數(shù)據(jù),取該數(shù)據(jù)的相反數(shù)據(jù)。

以下的幾張物理實(shí)現(xiàn)的示意圖是丹尼爾.希利斯在他的書《通靈芯片》里面提到的用彈簧和本桿實(shí)現(xiàn)的與 或 非門,假如把木桿往前視為1,往回視回0,從該圖可以看到,當(dāng)輸入為前時(shí),輸出則為后,輸入為后時(shí),則輸出為前,實(shí)現(xiàn)了非門的邏輯。

或門:執(zhí)行的是“或”的操作,兩個(gè)輸入信號(hào)和一個(gè)輸出,對(duì)于兩個(gè)輸入x和y,當(dāng)x或y只要其中一個(gè)為1時(shí),輸出就為1。

同樣,在這個(gè)物理實(shí)現(xiàn)的或門上,可以看到無(wú)論哪個(gè)輸入是往前,那么輸出都會(huì)往前。

與門:執(zhí)行的是“與”的操作,兩個(gè)輸入信號(hào)和一個(gè)輸出,對(duì)于兩個(gè)輸入x和y,只有x與y都為1時(shí),輸出才為1。和或門的圖標(biāo)相比,左邊的輸入線是直的。

這個(gè)與門的實(shí)現(xiàn),你自已就得好好看看了。

通過(guò)這三種基本的邏輯門,就可以實(shí)現(xiàn)所有的邏輯運(yùn)算,進(jìn)而在上面構(gòu)造出一整套的計(jì)算。沒錯(cuò),計(jì)算機(jī)的本質(zhì)就是上述提到的與門、或門、非門等等各種門,只要實(shí)現(xiàn)了類似的功能,把成千上萬(wàn)個(gè)這些東西連接在一起,任何東西都能夠做成一臺(tái)計(jì)算機(jī)。木頭,水泵,塑料,卡子,只要能夠完成基本邏輯門的功能,任何東西都能夠制成計(jì)算機(jī)。


我們的征途,從這里開始。
從加法開始
上面說(shuō)的邏輯門聽起來(lái)圖森破的樣子,或許你會(huì)懷疑這些簡(jiǎn)單的邏輯門能夠做什么事情,接下來(lái)我們看看邏輯門怎么實(shí)現(xiàn)基本的計(jì)算功能。
與我們平常支持0 到9 的十進(jìn)制計(jì)算不同。因?yàn)檎麄€(gè)計(jì)算機(jī)系統(tǒng)只有0 和1兩個(gè)數(shù),所以這樣的計(jì)算機(jī)系統(tǒng)只能夠支持0 和1 的二進(jìn)制計(jì)算,在計(jì)算機(jī)系統(tǒng)里面,所有的計(jì)算都需要轉(zhuǎn)換成二進(jìn)制。十進(jìn)制與二進(jìn)制的對(duì)應(yīng)轉(zhuǎn)換關(guān)系如表所示。(話說(shuō)當(dāng)初萊布尼茲,沒錯(cuò)就是微積分里面那個(gè),發(fā)明二進(jìn)制運(yùn)算的時(shí)候,)


舉個(gè)簡(jiǎn)單的例子,比如實(shí)現(xiàn)2 + 3 = 5 這樣的計(jì)算,在二進(jìn)制加法中規(guī)則是:1和0相加得1,1和 相加需要往前進(jìn)一位,得10。二進(jìn)制和十進(jìn)制的基本操作過(guò)程是一樣的,例子是一個(gè)2+3=5的二二進(jìn)制計(jì)算示例。
為了實(shí)現(xiàn)上述計(jì)算功能,需要首先實(shí)現(xiàn)半加器,通過(guò)半加器實(shí)現(xiàn)全加器,再通過(guò)三個(gè)全加器的連接,就能夠形成支持上述計(jì)算的一個(gè)三位加法器了。
半加器(Half Adder):如圖所示,對(duì)于給定的輸入a 和b(它們都只能取0或者1),通過(guò)一個(gè)或門、兩個(gè)與門、一個(gè)非門(圖中小圓點(diǎn))的組合,可以對(duì)兩個(gè)位進(jìn)行加法并形成進(jìn)位。(sum表示求和結(jié)果,carry表示進(jìn)位)?


全加器(Full Adder):如圖所示,通過(guò)兩個(gè)半加器和一個(gè)或門的組合,形成了一個(gè)全加器。與半加器相比,全加器在輸入上多了一個(gè)接收的進(jìn)位,可以把從低位進(jìn)位而來(lái)的數(shù)據(jù)納入到計(jì)算中,將從低位計(jì)算產(chǎn)生的進(jìn)位也加在一起。(其中x、y 表示兩數(shù)相加,c 表示接收低位的進(jìn)位)。全加器的輸入和輸出過(guò)程見表3-3。


全加器的輸入和輸出表
三位加法器:通過(guò)三個(gè)全加器的組合,就形成了一個(gè)三位加法器。該加法器可以把從低位相加產(chǎn)生的進(jìn)位依次傳遞到高位,可以實(shí)現(xiàn)任意三位的二進(jìn)制數(shù)的加法,即可以實(shí)現(xiàn)上述例子中的計(jì)算。

依次把進(jìn)位傳到下一個(gè)全加器。同理,我們可以通過(guò)任意位的加法器來(lái)實(shí)現(xiàn)對(duì)于較長(zhǎng)二進(jìn)制數(shù)的計(jì)算。盡管我們只介紹了加法運(yùn)算的實(shí)現(xiàn),實(shí)際上數(shù)學(xué)家已經(jīng)證明,加法是實(shí)現(xiàn)所有數(shù)學(xué)運(yùn)算的基礎(chǔ)。有了加法器,原則上就能通過(guò)它們搭建任何其他計(jì)算,像乘法、除法、平方、開方、三角函數(shù)、對(duì)數(shù)函數(shù)等。
而另外一個(gè)大牛圖靈在一百年前(好像還不到一百年,當(dāng)年年輕的圖靈躺在劍橋國(guó)王學(xué)校前草坪上開始在腦子里面構(gòu)想這些東西的時(shí)候,好像是三十年代,那是一個(gè)科學(xué)和恐怖主義都極度興盛的時(shí)代啊)就已經(jīng)指明,這些簡(jiǎn)單運(yùn)算足以支撐任何信息處理過(guò)程。
這個(gè)事情看起來(lái)似乎太扯了,搞這么一個(gè)東西,從邏輯門開始,要拼這么多東西,才能夠?qū)崿F(xiàn)一個(gè)8(2的3次方)以內(nèi)的加法運(yùn)算。但是這個(gè)東西的牛X之處在于,簡(jiǎn)單的東西是可以連接在一起變成復(fù)雜的東西。兩個(gè)算盤連在一起只是一個(gè)更長(zhǎng)的算盤,而這些邏輯門連在一起,可以構(gòu)成復(fù)雜的計(jì)算世界。而且可以體積很小,大規(guī)模的疊加。這也是現(xiàn)在整個(gè)時(shí)代的秩序運(yùn)行的基礎(chǔ),如果一旦發(fā)生了像劉慈欣在《球狀閃電》里面描述的那個(gè)宏中子爆炸引起的效果,那無(wú)數(shù)的低頭一族將會(huì)全部崩潰(或許我們的世界能夠因此更美好?)
整體實(shí)現(xiàn)
OK,OK,加法有了,ALU就搞定了嗎?很抱歉,還差點(diǎn),不過(guò)差得不多了。
加法器是最核心的部分,但是我們還差一些別的東西,現(xiàn)在再看下我們需要實(shí)現(xiàn)的計(jì)算指令:

在這里面,除了x+y,還有對(duì)x和y取反, 還有與(&)和或(|),沒有提x-y關(guān)于這里面的設(shè)計(jì),有一個(gè)東西是必不可少的,就是多路選擇器,

這個(gè)東東實(shí)現(xiàn)的的功能就是根據(jù)sel位的控制,判斷輸出的時(shí)候,選擇a或者b中的哪一個(gè),這個(gè)東西當(dāng)然也是由基本的與或非門組成的。而且這個(gè)東西也可以擴(kuò)展,比如a和b可以是多位的,在咱們要用的cpu里面,選擇的是16位的,而且這個(gè)sel可以是兩位或者更多,可以選擇從四個(gè)或者8個(gè)輸入里面選擇指定的一個(gè)作為輸出。 當(dāng)然,也有反過(guò)來(lái)選擇器 ,根據(jù)sel位判斷對(duì)于輸入的in,從給定的A和B哪個(gè)輸出口進(jìn)行輸出。
針對(duì)上面提到的這些運(yùn)算指令,可以有無(wú)數(shù)中實(shí)現(xiàn)方法,這個(gè)圖給出的是實(shí)現(xiàn)方法之一:
在這個(gè)圖里面用了好幾個(gè)busmux16,就是指的一個(gè)16位選擇器, 用到了一個(gè)16位的加法器,Adder16,然后就是眾多的與或非門。
含有計(jì)算指令表的計(jì)算器有了,接下來(lái)干什么呢, 且聽下回分曉。