深入理解計算機系統 邏輯設計和硬體控制語言HCL

2021-08-27 08:56:03 字數 4083 閱讀 9597

目錄

在硬體設計中,用電子電路來計算對位進行運算的函式,以及在各種儲存器元素中儲存位。大多數現代電路技術都是用訊號上的高電壓或者低電壓來表示不同的位值。在當前的技術中心,邏輯 1 是用 1.0 伏特的高電壓表示,而邏輯 0 是用 0.0 伏特的低電壓表示。要實現乙個數字系統需要三個組成部分:

①、計算對位進行邏輯操作的函式的組合邏輯

②、儲存位的儲存器元素

③、控制儲存器元素更新的時鐘訊號

本篇部落格我們就介紹這些不同的組成部分,以及用來描述不同處理器設計的控制邏輯——hcl(hardware control language,硬體控制語言)

邏輯門是數位電路的基本計算元素,它們產生的輸出,等於它們輸入位值的某個布林函式。如下圖:

這三個邏輯門和我們前面講c語言運算子是對應的。但是要注意區別:

①、邏輯門只對單個位進行操作,而不是整個字。這很好理解,因為硬體識別的是高低電平。

②、邏輯門總是活動的,一旦乙個門的輸入變化了,在很短的時間內,輸出就會相應的變化。

回到頂部

上面說的都是單個邏輯門,只能執行很簡單的計算,如果遇到稍微複雜點的,就不能計算了,這時候組合電路就出現了。

將很多邏輯門組合成乙個網所構建的計算塊稱為組合電路。構建這個網有兩個限制:

①、兩個或多個邏輯門的輸出不能連在一起。否則它們可能會導致線上的訊號矛盾,可能會導致乙個不合法的電壓或電路故障。

②、這個網必須是無環的,也就是在網中不能有路徑經過一系列的門而形成乙個迴路,這樣的迴路會導致該網路計算的函式有歧義。

我們給出幾個非常有用的簡單組合電路例子:

1、== 表示式(單個位)

上圖我們用hcl來寫就是:eq = (a && b) || (!a && !b)。這個表示式的結果分析,只有a 和 b 都為 0 或者都為 1 的時候,輸出才為1。而這個對應於我們高階程式語言中的 a == b 表示式。

2、hcl表示式:(a && s) || (b && !s)

對於上面電路的結果,我們分析如果s為1,則結果為a,否則結果為b。

回到頂部

區別有以下三點:

①、邏輯門是持續輸出的,如果電路的輸入變化了,在一定的延遲之後,輸出也會相應的變化,而c表示式是在執行到的時候才會求值。

②、兩者操作的值不同,邏輯門只對值 0 和值 1 進行操作,而c 邏輯表示式允許引數是任意整數,0表示false,其它任意值都表示true。

③、c 邏輯表示式存在短路,比如對於a && b這個符號來說,c語言中的規定是如果前者為假,則後者不會再計算。而hcl當中沒有這種說法。

回到頂部

前面我們說的高階邏輯設計,也依然是針對1位進行操作的。那麼如何才能真正操作多個位呢,比如平時常用的32位或者64位。那麼我們就必須將多個位一起操作,比如下面的:

這個圖當中每個位相等的判斷都是上面所提到的兩個not門,兩個and門和乙個or門組成的組合電路(第乙個講的組合電路(a && b) || (!a && !b))。總共32個,它們並列的一起進行,最終再通過乙個and門,就完成了判斷兩個32位的數字是否相等的操作。也就是表示式a == b,值得注意的是,這裡的a和b都是32位的。c語言中可以假設為 int 型的。

還有一種字級多路復用器用hcl來描述就是:

它代表的意思就是如果s為1,則輸出a,否則輸出b,同樣,這裡的a和b都是32位的。那麼使用電路如何表達呢?其實就是第二個組合電路的32位版本。如下圖:

可以看到,s的not值是被復用的,否則的話,這裡需要32個not門。值得一提的是,hcl中條件選擇表示式中的條件是不需要互斥的,只是按照優先順序依次選取,這與c語言中的switch是不同的。

最後一種hcl表示式,選擇表示式可以是任意的布林表示式,可以有任意多的情況。

用邏輯門表示如下:

上述的表示式可以簡化,比如第二個表示式為!s1,而不用寫的完整!s1&&s0,因為另一種情況s1=0已經出現在第乙個表示式中了。

回到頂部

上面我們介紹的都是組合電路,它們的作用是根據輸入來產生乙個值。但是剛才也說過,組合電路是一直持續輸出的,因此它無法保持乙個狀態不變。也就是說組合電路從本質上來講,不儲存任何資訊。他們只是簡單的響應輸入訊號,產生等於輸入的某個函式的輸出。但我們的計算機是需要儲存資料的,因此就需要能儲存狀態的儲存裝置。儲存裝置是由乙個時鐘控制,時鐘是乙個週期型號,它控制著儲存裝置什麼時候更新裝置裡的值。

常用的儲存裝置一般有兩種:

①、時鐘暫存器:簡稱暫存器,儲存單個位或字。時鐘訊號控制暫存器載入輸入值。

時鐘暫存器的典型應用是程式計數器pc、條件碼暫存器以及程式狀態。它們都有明確的輸入,這意味著它們的值其實是某幾個值的乙個函式,比如條件碼暫存器的輸入主要就是邏輯計算單元的值,因此條件碼暫存器的值就可以看做是邏輯計算單元的函式。

下圖表示暫存器的工作狀態。大多數時候,暫存器都保持在穩定狀態(用x表示),產生的輸出等於它的當前狀態,訊號沿著暫存器前面的組合邏輯傳播,這時產生了乙個新的暫存器輸入(用y表示),但是只要時鐘訊號是低電位的,暫存器的輸出就保持不變。當時鐘變為高電位時,輸入訊號就載入到暫存器中,稱為下乙個狀態y,直到下乙個時鐘上公升沿,這個狀態就一直是暫存器的新輸出。

隨即訪問儲存器最典型的例子就是我們的暫存器檔案(也就是8個程式暫存器)和隨即訪問儲存器(也就是我們常說的記憶體)。它們沒有明確的輸入值,因此不存在函式關係。不論是暫存器檔案還是隨即訪問儲存器,都有讀和寫兩種操作,而對於時鐘暫存器來說,是無所謂讀和寫的,因為它只會根據輸入的變化改變輸出的值,是可以直接連線到電路上去的。

如下圖:暫存器檔案一般有兩個讀埠(a和b)和乙個寫埠(w)。每個埠都附帶乙個位址來標識操作的是哪個暫存器,而對於寫埠,還有乙個輸入資料,對於讀埠,則還有乙個輸出資料。具體的圖示如下。

上面的暫存器檔案,電路可以讀取兩個程式暫存器的值,同時更新第三個暫存器的狀態。每個埠都有乙個位址輸入,表明該選擇是哪個程式暫存器,另外還有乙個資料輸出或對應該程式暫存器的輸入值。可以看到在暫存器檔案的寫埠處,有乙個時鐘(clock)控制著寫的操作。當時鐘變化時,輸入資料的值將會更新到對應的暫存器當中。而對於讀資料,則類似於組合電路,根據輸入的位址值(src),暫存器檔案會輸出相應的資料。

對於隨即訪問儲存器來說,與暫存器檔案非常相似。不同的是,隨即訪問儲存器有乙個位址輸入,乙個寫的資料輸入以及乙個讀的資料輸出。

讀操作:如果我們在輸入address上提供乙個位址,並將write控制訊號設定為0,那麼經過一段延遲之後,儲存在那個位址上的值就會出現在輸出data上。如果位址超出了範圍,error訊號會設定為1,否則就設定為0。

寫儲存器是由時鐘控制的:我們將address設定為期望的位址,將data in(資料輸入) 設定為期望的值,而 write設定為1,然後當我們控制時鐘時,只要位址是合法的,就會更新儲存器中指定的位置。對於讀操作來說,如果位址是不合法的,error訊號會被設定為1.這個訊號由組合邏輯產生,因為所需的邊界檢查純粹就是位址輸入的函式,不涉及任何儲存狀態。

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...

深入理解計算機系統

系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...