深入理解计算机系统(4.2)---硬件的魅力
引言
?
這個(gè)系列已經(jīng)很久沒更新了,記得上一篇博文已經(jīng)是三月份了,實(shí)在是抱歉。最近業(yè)余時(shí)間沒有以前充裕了,因此更新一篇博文已經(jīng)變成了一種奢侈。記得以前剛開始寫的時(shí)候,最多的時(shí)候LZ一天寫過3篇博文,現(xiàn)在想想,往事如夢(mèng)。
好了,好不容易寫一次,就不多說廢話了,本文主要介紹一下硬件以及HCL語言的內(nèi)容。
?
從疑問開始
?
首先,在介紹本文的內(nèi)容之前,我們先來思考一個(gè)看似簡(jiǎn)單,卻實(shí)際比較“高深”的問題。眾所周知,計(jì)算機(jī)歸根結(jié)底是在和0、1打交道,那么到底0和1是如何被計(jì)算機(jī)記住的呢?
怎么樣,這個(gè)問題是不是有點(diǎn)像數(shù)學(xué)界的1+1為什么等于2?是否瞬間感覺自己很高大上?
請(qǐng)穩(wěn)住,其實(shí)這個(gè)問題的答案比1+1=2要簡(jiǎn)單多了。答案就是計(jì)算機(jī)通過電壓來記錄0和1。在學(xué)習(xí)物理的時(shí)候大家肯定都聽說過電壓這個(gè)東西,它的單位一般是伏特(V)。比如我們常用的電壓一般是220V。計(jì)算機(jī)當(dāng)中使用1V來代表1,使用0V代表0。
解答了這個(gè)問題,接下來我們就可以繼續(xù)我們的設(shè)計(jì)之路了。
?
設(shè)計(jì)的基礎(chǔ)
?
要談設(shè)計(jì),就要知道設(shè)計(jì)的基礎(chǔ)。剛才其實(shí)我們了解了最基本的基礎(chǔ),就是0和1如何表示,不過這只是最根本的立足之本,我們還需要一些基本的元素。就像你要畫一個(gè)物體一樣,首先是點(diǎn),然后才能點(diǎn)動(dòng)成線,進(jìn)而線動(dòng)成面,最終面動(dòng)成體。
剛才的0和1只不過是點(diǎn)而已,接下來,我們要用點(diǎn)變換成線。這個(gè)東西就叫做邏輯門。
邏輯門是數(shù)字電路的基本計(jì)算元素,也可以看做是物理結(jié)構(gòu)與邏輯結(jié)構(gòu)的映射,它們實(shí)際上是由晶體管組成的。邏輯門接受信號(hào)的輸入,并根據(jù)信號(hào)產(chǎn)生一定的輸出,而輸出則是輸入的布爾函數(shù),也就是說,輸出只能是0或者1。下圖是and門(‘與’門)、or門(‘或’門)和not門(‘非’門)的標(biāo)準(zhǔn)符號(hào),你可以看做它們代表了一組線路的組成方式。
?
and:? ? ? ? ? ? ? ?or:? ? ? ? ? ? ? ? not:
可以看出,and和or都是2個(gè)輸入,而not為1個(gè)輸入。前面我們提到了HCL硬件設(shè)計(jì)語言,上面的三個(gè)圖分別用HCL表示則是,a&&b、a||b以及!a。
舉個(gè)例子,比如對(duì)于and門來說,它接受2個(gè)輸入,如果2個(gè)輸入都是高位電壓,則輸出的為高位電壓,也就是輸出為1。否則的話,都是輸出低位電壓,也就是輸出為0。這些就是建立在剛才1V為1,0V為0的基礎(chǔ)之上的。
高級(jí)設(shè)計(jì)
?
現(xiàn)在我們已經(jīng)掌握了基礎(chǔ),那么在基礎(chǔ)之上,我們就可以玩點(diǎn)花樣了。比如剛才所提到的邏輯門,它們只能接受1位的輸入和1位的輸出,比如我們可以計(jì)算0&&1為0。那如果我們希望計(jì)算更加復(fù)雜的表達(dá)式該如何做呢,比如10001&&11111=?(注意,這里是位‘與’運(yùn)算,而不是邏輯運(yùn)算)。
答案就是組合電路。道理很簡(jiǎn)單,一個(gè)邏輯門可以計(jì)算1位,如果我們弄來32個(gè)邏輯門,不就可以計(jì)算32位了嗎?那么像上面那個(gè)10001&&11111的運(yùn)算,我們就可以采取5個(gè)邏輯門去計(jì)算。當(dāng)然,實(shí)際上并不是這樣的,這個(gè)后續(xù)我們會(huì)更加詳細(xì)的介紹。
不過電路往往是復(fù)雜的,不能隨便亂接,否則電死了誰負(fù)責(zé)?因此組合的電路需要遵循以下兩個(gè)原則。
1、兩個(gè)邏輯門的輸出不能連接到一起,否則它們可能會(huì)使線上的信號(hào)矛盾,因此可能會(huì)得到一個(gè)不合法的電壓或故障。比如1個(gè)0V和1個(gè)1V接到一起,會(huì)不會(huì)出來個(gè)0.5V,又或者類似于正負(fù)極相接,直接短路了呢。
2、組合的電路必須是無環(huán)的。也就是說輸出不能再當(dāng)做輸入,否則會(huì)使這個(gè)函數(shù)產(chǎn)生歧義。這個(gè)道理很簡(jiǎn)單,比如數(shù)學(xué)上來說,如果c=a+b。我們這里可以把c看做輸出,a和b看做輸入。如果a又等于c了,那么是不是b就等于0了呢?當(dāng)然不是,因?yàn)閍此時(shí)其實(shí)是a+b,第二輪的c又會(huì)等于a+2b,同理,第三輪的c又會(huì)等于a+3b。那么到底c=a+b還是c=a+2b還是c=a+3b?(這里有點(diǎn)繞,請(qǐng)各位猿友仔細(xì)品味)
遵循以上原則,我們就可以隨意組裝電路了。比如在書中的這個(gè)電路。
它代表著輸出是a和b是否相等,如果用HCL來描述電路,就是(a && b) || (!a && !b)。我們不難看出來,這個(gè)表達(dá)式就是編程語言當(dāng)中的a == b。
接下來這個(gè)圖是另外一個(gè)書中的例子,它被翻譯為多路復(fù)用器。其實(shí)之所以叫這個(gè),就是因?yàn)槠渲械目刂莆籹是可以復(fù)用的。如下圖。
在這個(gè)例子當(dāng)中還不是特別明顯,但是之后有更明顯的例子說明“復(fù)用”的含義。以上這個(gè)電路如果用HCL表達(dá),則是(a && s) || (b && !s)。這個(gè)電路的含義是如果s為1,則結(jié)果為a,否則結(jié)果為b。
在書中對(duì)HCL表達(dá)式與C語言的表達(dá)式做了區(qū)分,有以下三點(diǎn)。
1、邏輯門是持續(xù)輸出的,但C語言表達(dá)式是執(zhí)行到的時(shí)候才會(huì)求值。這個(gè)區(qū)別可以把邏輯門當(dāng)成一個(gè)電路來看,電路是不能斷電的,電流會(huì)一直存在。
2、C語言中輸入可以是任意整數(shù),而HCL只能是1和0。這點(diǎn)比較好理解。
3、對(duì)于a && b這個(gè)符號(hào)來說,C語言中的規(guī)定是如果前者為假,則后者不會(huì)再計(jì)算。而HCL當(dāng)中沒有這種說法。
?
按位計(jì)算
?
以上所提到的,哪怕是高級(jí)設(shè)計(jì),也依然是針對(duì)1位進(jìn)行操作的。那么如何才能真正操作多個(gè)位呢,比如平時(shí)常用的32位或者64位。
道理很簡(jiǎn)單,就是多個(gè)1位操作一起進(jìn)行,例如下面這個(gè)圖。
這個(gè)圖當(dāng)中每個(gè)位相等的判斷都是上面所提到的兩個(gè)not門,兩個(gè)and門和一個(gè)or門組成的組合電路。它們并列的一起進(jìn)行,最終再通過一個(gè)and門,就完成了判斷兩個(gè)32位的數(shù)字是否相等的操作。也就是表達(dá)式A == B,值得注意的是,這里的A和B都是32位的。
還有一種類似于C語言中switch語句的表達(dá)式,就是如下形式。
它代表的意思就是如果s為1,則輸出A,否則輸出B,同樣,這里的A和B都是32位的。那么使用電路如何表達(dá)呢?其實(shí)就是上次的復(fù)用電路的32位版本。如下圖。
可以看到,s的not值是被復(fù)用的,否則的話,這里需要32個(gè)not門。值得一提的是,HCL中條件選擇表達(dá)式中的條件是不需要互斥的,只是按照優(yōu)先順序依次選取,這與C語言中的switch是不同的。
最后一種HCL表達(dá)式,是集合的形式。它表示需要拿一個(gè)輸入信號(hào)與某些值做匹配。比如下圖當(dāng)中的S1和S0。
其中如果S1為code == 2 || code == 3,S0為code == 1 || code == 0。那么HCL可以用另外一種方式表達(dá),即code in {2,3}和code in {1,0}。可以看出,HCL表達(dá)式其實(shí)就是一種硬件表述方式。
存儲(chǔ)器和時(shí)鐘
?
上面我們介紹的都是組合電路,它們的作用是根據(jù)輸入來產(chǎn)生一個(gè)值。但是剛才也說過,組合電路是一直持續(xù)輸出的,因此它無法保持一個(gè)狀態(tài)不變。但我們的計(jì)算機(jī)是需要存儲(chǔ)數(shù)據(jù)的,因此就需要能保存狀態(tài)的存儲(chǔ)設(shè)備。存儲(chǔ)設(shè)備則是由一個(gè)時(shí)鐘控制,時(shí)鐘就像一個(gè)開關(guān)一樣,它控制著存儲(chǔ)設(shè)備什么時(shí)候更新設(shè)備里的值。
常用的存儲(chǔ)設(shè)備一般有兩種。
1、時(shí)鐘寄存器:存儲(chǔ)單個(gè)位或者單個(gè)字。時(shí)鐘信號(hào)來控制寄存器是否要加載輸入的值。
2、隨即訪問存儲(chǔ)器:存儲(chǔ)多個(gè)字。用地址來選擇該讀、寫哪個(gè)字。
時(shí)鐘寄存器的典型應(yīng)用是PC、條件碼寄存器以及程序狀態(tài)。它們都有明確的輸入,這意味著它們的值其實(shí)是某幾個(gè)值的一個(gè)函數(shù),比如條件碼寄存器的輸入主要就是邏輯計(jì)算單元的值,因此條件碼寄存器的值就可以看做是邏輯計(jì)算單元的函數(shù)。
時(shí)鐘寄存器一般是根據(jù)時(shí)鐘信號(hào)來更新狀態(tài)的,而時(shí)鐘信號(hào)就像一個(gè)表一樣,比如每到12點(diǎn),寄存器的值就更新一下。就像下面的圖示一樣,當(dāng)時(shí)鐘變化時(shí),值就會(huì)變化為y。
隨即訪問存儲(chǔ)器最典型的例子就是我們的寄存器文件(也就是8個(gè)程序寄存器)和隨即訪問存儲(chǔ)器(也就是我們常說的內(nèi)存)。它們沒有明確的輸入值,因此不存在函數(shù)關(guān)系。不論是寄存器文件還是隨即訪問存儲(chǔ)器,都有讀和寫兩種操作,而對(duì)于時(shí)鐘寄存器來說,是無所謂讀和寫的,因?yàn)樗粫?huì)根據(jù)輸入的變化改變輸出的值,是可以直接連接到電路上去的。
寄存器文件一般有兩個(gè)讀端口和一個(gè)寫端口。每個(gè)端口都附帶一個(gè)地址來標(biāo)識(shí)操作的是哪個(gè)寄存器,而對(duì)于寫端口,還有一個(gè)輸入數(shù)據(jù),對(duì)于讀端口,則還有一個(gè)輸出數(shù)據(jù)。具體的圖示如下。
可以看到在寄存器文件的寫端口處,有一個(gè)時(shí)鐘(clock)控制著寫的操作。當(dāng)時(shí)鐘變化時(shí),輸入數(shù)據(jù)的值將會(huì)更新到對(duì)應(yīng)的寄存器當(dāng)中。而對(duì)于讀數(shù)據(jù),則類似于組合電路,根據(jù)輸入的地址值(src),寄存器文件會(huì)輸出相應(yīng)的數(shù)據(jù)。
對(duì)于隨即訪問存儲(chǔ)器來說,與寄存器文件非常相似。不同的是,隨即訪問存儲(chǔ)器只有一個(gè)地址輸入,而不是三個(gè),只有一個(gè)數(shù)據(jù)輸出而不是兩個(gè)。具體的圖示如下。
當(dāng)?shù)刂?#xff08;address)輸入,并且輸入數(shù)據(jù)(data in)輸入時(shí),如果寫(write)輸入為1并且時(shí)鐘(clock)變化時(shí),存儲(chǔ)器中地址為輸入地址值的值將會(huì)變化,值就是輸入數(shù)據(jù)(data in)的值。同樣的,如果地址(address)輸入,并且寫(write)輸入為0,則輸出數(shù)據(jù)(data out)會(huì)輸出地址為輸入地址值的值。這里還有一點(diǎn)特殊的是,當(dāng)讀數(shù)據(jù)的時(shí)候,如果地址超出了范圍,error信號(hào)將會(huì)輸出為1。回憶一下剛才的HCL語言,error其實(shí)就可以看做是一個(gè)組合電路的輸出,等于(address in > max address ) || (address in < 0),即當(dāng)輸入的地址值不在合法范圍內(nèi)時(shí),它的輸出為1。
?
小結(jié)
?
回憶一下本章的內(nèi)容,其實(shí)就是結(jié)合HCL語言在講硬件的組成。而這些硬件,就是Y86處理器需要使用的。比如組合電路,存儲(chǔ)器。到本章最后的時(shí)候,已經(jīng)非常接近我們的編程領(lǐng)域了,可以看到有寄存器和內(nèi)存的出現(xiàn)。但要注意的是,這里的寄存器文件并不等于寄存器,隨即訪問存儲(chǔ)器也不等于內(nèi)存,LZ只是想讓各位猿友更形象的去理解它。
下一章,就是帶著大家一起做一個(gè)順序?qū)崿F(xiàn)的Y86處理器,這是一個(gè)非常低級(jí)但卻最基礎(chǔ)的處理器。如果你慢慢的進(jìn)入了這個(gè)世界,你會(huì)覺得這是一件非常有意思的事情。就LZ本身來講,讀這本書的時(shí)候,最大的感受就是,每一章剛開始讀的時(shí)候都非常枯燥無味,但每當(dāng)讀了幾節(jié)以后,就有種豁然開朗的感覺,這種感覺相信你一定也非常喜歡。
最后LZ再說明一下,本系列博文都是LZ在自己理解的基礎(chǔ)上寫的,因此盡管核心內(nèi)容與原著相似,但語言描述上差異甚大,如果各位猿友看著不習(xí)慣的話,不妨去看看原著,或許會(huì)有不一樣的收獲。
轉(zhuǎn)載于:https://www.cnblogs.com/zuoxiaolong/p/computer22.html
總結(jié)
以上是生活随笔為你收集整理的深入理解计算机系统(4.2)---硬件的魅力的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP - PDO 之 mysql 基础
- 下一篇: Debian 系统修改语言为英文