標籤:style blog code http com 使用
引言
這個系列已經很久沒更新了,記得上一篇博文已經是三月份了,實在是抱歉。最近業餘時間沒有以前充裕了,因此更新一篇博文已經變成了一種奢侈。記得以前剛開始寫的時候,最多的時候LZ一天寫過3篇博文,現在想想,往事如夢。
好了,好不容易寫一次,就不多說廢話了,本文主要介紹一下硬體以及HCL語言的內容。
從疑問開始
首先,在介紹本文的內容之前,我們先來思考一個看似簡單,卻實際比較“高深”的問題。眾所周知,電腦歸根結底是在和0、1打交道,那麼到底0和1是如何被電腦記住的呢?
怎麼樣,這個問題是不是有點像數學界的1+1為什麼等於2?是否瞬間感覺自己很高大上?
請穩住,其實這個問題的答案比1+1=2要簡單多了。答案就是電腦通過電壓來記錄0和1。在學習物理的時候大家肯定都聽說過電壓這個東西,它的單位一般是伏特(V)。比如我們常用的電壓一般是220V。電腦當中使用1V來代表1,使用0V代表0。
解答了這個問題,接下來我們就可以繼續我們的設計之路了。
設計的基礎
要談設計,就要知道設計的基礎。剛才其實我們瞭解了最基本的基礎,就是0和1如何表示,不過這隻是最根本的立足之本,我們還需要一些基本的元素。就像你要畫一個物體一樣,首先是點,然後才能點動成線,進而線動成面,最終面動成體。
剛才的0和1隻不過是點而已,接下來,我們要用點變換成線。這個東西就叫做邏輯門。
邏輯門是數字電路的基本計算元素,也可以看做是物理結構與邏輯結構的映射,它們實際上是由晶體管組成的。邏輯門接受訊號的輸入,並根據訊號產生一定的輸出,而輸出則是輸入的布爾函數,也就是說,輸出只能是0或者1。是and門(‘與’門)、or門(‘或’門)和not門(‘非’門)的標準符號,你可以看做它們代表了一組線路的組成方式。
and: or: not:
可以看出,and和or都是2個輸入,而not為1個輸入。前面我們提到了HCL硬體設計語言,上面的三個圖分別用HCL表示則是,a&&b、a||b以及!a。
舉個例子,比如對於and門來說,它接受2個輸入,如果2個輸入都是高位電壓,則輸出的為高位電壓,也就是輸出為1。否則的話,都是輸出低位電壓,也就是輸出為0。這些就是建立在剛才1V為1,0V為0的基礎之上的。
進階設計
現在我們已經掌握了基礎,那麼在基礎之上,我們就可以玩點花樣了。比如剛才所提到的邏輯門,它們只能接受1位的輸入和1位的輸出,比如我們可以計算0&&1為0。那如果我們希望計算更加複雜的運算式該如何做呢,比如10001&&11111=?(注意,這裡是位‘與’運算,而不是邏輯運算)。
答案就是組合電路。道理很簡單,一個邏輯門可以計算1位,如果我們弄來32個邏輯門,不就可以計算32位了嗎?那麼像上面那個10001&&11111的運算,我們就可以採取5個邏輯門去計算。當然,實際上並不是這樣的,這個後續我們會更加詳細的介紹。
不過電路往往是複雜的,不能隨便亂接,否則電死了誰負責?因此組合的電路需要遵循以下兩個原則。
1、兩個邏輯門的輸出不能串連到一起,否則它們可能會使線上的訊號矛盾,因此可能會得到一個不合法的電壓或故障。比如1個0V和1個1V接到一起,會不會出來個0.5V,又或者類似於正負極相接,直接短路了呢。
2、組合的電路必須是無環的。也就是說輸出不能再當做輸入,否則會使這個函數產生歧義。這個道理很簡單,比如數學上來說,如果c=a+b。我們這裡可以把c看做輸出,a和b看做輸入。如果a又等於c了,那麼是不是b就等於0了呢?當然不是,因為a此時其實是a+b,第二輪的c又會等於a+2b,同理,第三輪的c又會等於a+3b。那麼到底c=a+b還是c=a+2b還是c=a+3b?(這裡有點繞,請各位猿友仔細品味)
遵循以上原則,我們就可以隨意組裝電路了。比如在書中的這個電路。
它代表著輸出是a和b是否相等,如果用HCL來描述電路,就是(a && b) || (!a && !b)。我們不難看出來,這個運算式就是程式設計語言當中的a == b。
接下來這個圖是另外一個書中的例子,它被翻譯為多工器。其實之所以叫這個,就是因為其中的控制位s是可以複用的。如。
在這個例子當中還不是特別明顯,但是之後有更明顯的例子說明“複用”的含義。以上這個電路如果用HCL表達,則是(a && s) || (b && !s)。這個電路的含義是如果s為1,則結果為a,否則結果為b。
在書中對HCL運算式與C語言的運算式做了區分,有以下三點。
1、邏輯門是持續輸出的,但C語言運算式是執行到的時候才會求值。這個區別可以把邏輯門當成一個電路來看,電路是不能斷電的,電流會一直存在。
2、C語言中輸入可以是任意整數,而HCL只能是1和0。這點比較好理解。
3、對於a && b這個符號來說,C語言中的規定是如果前者為假,則後者不會再計算。而HCL當中沒有這種說法。
按位計算
以上所提到的,哪怕是進階設計,也依然是針對1位進行操作的。那麼如何才能真正操作多個位呢,比如平時常用的32位或者64位。
道理很簡單,就是多個1位操作一起進行,例如下面這個圖。
這個圖當中每個位相等的判斷都是上面所提到的兩個not門,兩個and門和一個or門組成的組合電路。它們並列的一起進行,最終再通過一個and門,就完成了判斷兩個32位的數字是否相等的操作。也就是運算式A == B,值得注意的是,這裡的A和B都是32位的。
還有一種類似於C語言中switch語句的運算式,就是如下形式。
它代表的意思就是如果s為1,則輸出A,否則輸出B,同樣,這裡的A和B都是32位的。那麼使用電路如何表達呢?其實就是上次的複用電路的32位版本。如。
可以看到,s的not值是被複用的,否則的話,這裡需要32個not門。值得一提的是,HCL中條件選擇運算式中的條件是不需要互斥的,只是按照優先順序依次選取,這與C語言中的switch是不同的。
最後一種HCL運算式,是集合的形式。它表示需要拿一個輸入訊號與某些值做匹配。比如當中的S1和S0。
其中如果S1為code == 2 || code == 3,S0為code == 1 || code == 0。那麼HCL可以用另外一種方式表達,即code in {2,3}和code in {1,0}。可以看出,HCL運算式其實就是一種硬體表述方式。
儲存空間和時鐘
上面我們介紹的都是組合電路,它們的作用是根據輸入來產生一個值。但是剛才也說過,組合電路是一直持續輸出的,因此它無法保持一個狀態不變。但我們的電腦是需要儲存資料的,因此就需要能儲存狀態的存放裝置。存放裝置則是由一個時鐘控制,時鐘就像一個開關一樣,它控制著存放裝置什麼時候更新裝置裡的值。
常用的存放裝置一般有兩種。
1、時鐘寄存器:儲存單個位或者單個字。時鐘訊號來控制寄存器是否要載入輸入的值。
2、隨即訪問儲存空間:儲存多個字。用地址來選擇該讀、寫哪個字。
時鐘寄存器的典型應用是PC、條件碼寄存器以及程式狀態。它們都有明確的輸入,這意味著它們的值其實是某幾個值的一個函數,比如條件碼寄存器的輸入主要就是邏輯計算單元的值,因此條件碼寄存器的值就可以看做是邏輯計算單元的函數。
時鐘寄存器一般是根據時鐘訊號來更新狀態的,而時鐘訊號就像一個表一樣,比如每到12點,寄存器的值就更新一下。就像下面的圖示一樣,當時鐘變化時,值就會變化y。
隨即訪問儲存空間最典型的例子就是我們的寄存器檔案(也就是8個程式寄存器)和隨即訪問儲存空間(也就是我們常說的記憶體)。它們沒有明確的輸入值,因此不存在函數關係。不論是寄存器檔案還是記憶體,都有讀和寫兩種操作,而對於時鐘寄存器來說,是無所謂讀和寫的,因為它只會根據輸入的變化改變輸出的值,是可以直接連接到電路上去的。
寄存器檔案一般有兩個讀連接埠和一個寫連接埠。每個連接埠都附帶一個地址來標識操作的是哪個寄存器,而對於寫連接埠,還有一個輸入資料,對於讀連接埠,則還有一個輸出資料。具體的圖示如下。
可以看到在寄存器檔案的寫連接埠處,有一個時鐘(clock)控制著寫的操作。當時鐘變化時,輸入資料的值將會更新到對應的寄存器當中。而對於讀資料,則類似於組合電路,根據輸入的地址值(src),寄存器檔案會輸出相應的資料。
對於隨即訪問儲存空間來說,與寄存器檔案非常相似。不同的是,隨即訪問儲存空間只有一個地址輸入,而不是三個,只有一個資料輸出而不是兩個。具體的圖示如下。
當地址(address)輸入,並且輸入資料(data in)輸入時,如果寫(write)輸入為1並且時鐘(clock)變化時,儲存空間中地址為輸入地址值的值將會變化,值就是輸入資料(data in)的值。同樣的,如果地址(address)輸入,並且寫(write)輸入為0,則輸出資料(data out)會輸出地址為輸入地址值的值。這裡還有一點特殊的是,當讀資料的時候,如果地址超出了範圍,error訊號將會輸出為1。回憶一下剛才的HCL語言,error其實就可以看做是一個組合電路的輸出,等於(address in > max address ) || (address in < 0),即當輸入的地址值不在合法範圍內時,它的輸出為1。
小結
回憶一下本章的內容,其實就是結合HCL語言在講硬體的組成。而這些硬體,就是Y86處理器需要使用的。比如組合電路,儲存空間。到本章最後的時候,已經非常接近我們的編程領域了,可以看到有寄存器和記憶體的出現。但要注意的是,這裡的寄存器檔案並不等於寄存器,隨即訪問儲存空間也不等於記憶體,LZ只是想讓各位猿友更形象的去理解它。
下一章,就是帶著大家一起做一個順序實現的Y86處理器,這是一個非常低級但卻最基礎的處理器。如果你慢慢的進入了這個世界,你會覺得這是一件非常有意思的事情。就LZ本身來講,讀這本書的時候,最大的感受就是,每一章剛開始讀的時候都非常枯燥無味,但每當讀了幾節以後,就有種豁然開朗的感覺,這種感覺相信你一定也非常喜歡。
最後LZ再說明一下,本系列博文都是LZ在自己理解的基礎上寫的,因此儘管核心內容與原著相似,但語言描述上差異甚大,如果各位猿友看著不習慣的話,不妨去看看原著,或許會有不一樣的收穫。