時序電路
首先來看兩個問題:
1.為什么CPU要用時序電路,時序電路與普通邏輯電路有什么區(qū)別。
2.觸發(fā)器、鎖存器以及時鐘脈沖對時序電路的作用是什么,它們是如何工作的。
帶著這兩個問題,我們從頭了解一下邏輯電路。要了解邏輯電路,首先我們便要了解組成邏輯電路的基本單位:邏輯門。
邏輯門
邏輯門是數(shù)字電路組成的基本單元,它們的輸出是它們輸入位值的布爾函數(shù)。最常用的邏輯門便是我們熟知的與、或、非。
對于與門,只有a、b輸入都為1時,輸出才為1。
對于或門,輸入a、b只要有一個為1,輸出便為1。
對于非門,若輸入為1則輸出為0,輸入為0則輸出為1。
以上三種是最基本的邏輯門,我們可以通過它們的組合來實現(xiàn)復(fù)雜的邏輯推演,最簡單的比如與或、異或等。再復(fù)雜的邏輯,都可以用最基本的邏輯的特定組合實現(xiàn)出來,就像我們應(yīng)用層工程師靠有限的語法可以創(chuàng)造出近乎無限的應(yīng)用一樣。
邏輯門總是活動的,一旦一個門的輸入變化了,在很短的時間內(nèi),輸出便會相應(yīng)的變化。
使用很多的邏輯門構(gòu)建成一張網(wǎng),便得到了一個實現(xiàn)的復(fù)雜邏輯的計算塊(computational Block),稱為組合電路。組合電路的構(gòu)成遵循以下原則:
1. 每個邏輯門的輸入必須連接了一個系統(tǒng)的輸入、某個存儲單元的輸出或某個邏輯門的輸出(三選一)。
2. 兩個或多個邏輯門的輸出不能連接在一起,否則可能產(chǎn)生互相矛盾的信號造成錯誤或電路故障。
3. 這個網(wǎng)必須是無環(huán)的,也就是說不能有回路,否則會使網(wǎng)的計算邏輯有歧義。
了解了基本的邏輯門和組合電路的概念,我們再介紹一下電路中的控制信號是如何實現(xiàn)的。
控制信號
我們說過再復(fù)雜的邏輯也可以靠最基本的邏輯組合而成,輸入輸出的控制邏輯也不例外。為了更好的理解控制信號是如何工作的,我們介紹一種非常有用的組合電路:位多路復(fù)用器。
其中的 s 輸入控制著兩個與門。其中位于上方的與門的邏輯是 !s && b ,位于下方的與門的邏輯是 s && a 。
也就是說當(dāng) s 的輸入為 1 時,b的輸入是無法到達或門的, 0&&b 恒為零。此時 a 的輸入便是整個電路的輸出。
反之當(dāng) s 輸入為 0 時,a 的輸入是無法到達或門的 ,0&&a 恒為零。此時 b 的輸入便是整個電路的輸出。
可以看到 s 輸入的電位高低直接決定著 a、b 中哪個輸入有效,這便是控制信號工作的一個典型例子。
看到控制信號是如何工作的,我們來假想一下簡單的寄存器是如何依賴一個時鐘控制信號工作的。一個時鐘信號周期的由低電平變?yōu)楦唠娖皆儆筛唠娖阶優(yōu)榈碗娖健?/p>
以該信號作為寄存器的控制信號,寄存器內(nèi)每一位輸入位都與該信號進行與邏輯后再進入寄存器,那么可以想象,在時鐘周期內(nèi)的低電平部分,任何信號無法寫入寄存器,等待時鐘信號變?yōu)楦唠娖綍r寄存器才變?yōu)榭蓪懭霠顟B(tài)。這就是一個簡單的觸發(fā)器了,隨著時鐘信號周而復(fù)始的改變著自己的狀態(tài)。
當(dāng)然真正的觸發(fā)器的實現(xiàn)比這復(fù)雜的多,這里只是方便理解舉了最簡單的例子。
明白了上述基本概念,我們看一下普通組合邏輯電路與時序電路的區(qū)別。
普通組合邏輯電路與時序電路的區(qū)別
1.毛刺容忍
組合邏輯電路從本質(zhì)上講,不存儲任何信息。它們只是簡單的響應(yīng)輸入信號,產(chǎn)生符合輸入的某個邏輯表達式結(jié)果的輸出。
而時鐘電路是擁有自己的狀態(tài)的,時序電路某一個狀態(tài)除了依賴當(dāng)前的輸入外,還依賴電路的上一個狀態(tài)。
而我們想要電路擁有自己的狀態(tài)并可以基于這個狀態(tài)進行計算,必須在組合邏輯電路中引入存儲設(shè)備和控制存儲設(shè)備的周期性變化的時鐘信號。
引入存儲設(shè)備是容易理解的,沒有存儲設(shè)備的電路當(dāng)然是沒有自己的狀態(tài)的,因為它沒有存儲狀態(tài)信息的載體,存儲器就是存儲電路狀態(tài)信息的載體。
而時鐘周期的作用相對就不是那么容易理解,我們舉個例子來理解時鐘信號的作用:
我們來看一個沒有時鐘信號的組合邏輯電路:
我們前面說過,邏輯門總是活動的,一旦一個邏輯門的輸入改變,則輸出會在很短的時間內(nèi)發(fā)生改變。
但是需要注意的是,這個“很短時間內(nèi)”的描述。由于元器件的質(zhì)量/種類不同、路線的長度不同等物理因素的限制,不同的輸入到達輸出的時間是不同的。
比如圖中,c 輸入到達下方的與門與到達上方的與門的兩條路線中,到達下方與門的路線多出了一個非門。那么 c 信號到達上方的與門自然要比到達下方的與門的速度快。
所以當(dāng) c 信號發(fā)生改變時,有一段時間內(nèi),F(xiàn) 端的輸出是錯誤的,因為 A&&C 已經(jīng)到達 F 端但 B&&!C 還沒有到達,也就是說 F1 是比 F0 到達的慢的,存在延遲,如下圖所示:
我們稱這種情況為“毛刺”。
雖然毛刺出現(xiàn)的時間是很短暫的,但是對于一個電路系統(tǒng)的輸出來說卻是致命的。如果我們在發(fā)生毛刺的時間內(nèi)將錯誤的輸出寫入存儲器,接下來的邏輯會一錯再錯并讓我們摸不到頭腦。
而時序電路則不會出現(xiàn)上述問題,我們將A/B/C的輸入到F的輸出看作一個完整的動作,在一個時鐘周期內(nèi)完成。那么,A/B/C的輸入將在時鐘沿觸發(fā),F(xiàn)也將在時鐘沿采集結(jié)果。而在采集結(jié)果時,F(xiàn)的輸出已經(jīng)跨越了毛刺處于穩(wěn)定狀態(tài)。當(dāng)然,這樣時一個鐘周期內(nèi)高電平持續(xù)的時間必須足夠使 F 輸出達到穩(wěn)定狀態(tài)。
這樣,下一個動作(發(fā)生在下一個時鐘周期)如果基于 F 輸出,將得到正確的結(jié)果。這是時序電路與普通邏輯電路的區(qū)別之一:對毛刺的容忍。
可以看到,通過時鐘周期,組合邏輯電路中輸入的變化可以看作一個一個的動作。而在一個時鐘周期內(nèi),電路完成一個最基本的動作,保證下個時鐘周期的動作可以獲取正確的電路狀態(tài)。
如果無法理解電路按動作運轉(zhuǎn)的意義,我們看一個非常簡單的例子:
int a=0; int b=a;
我們需要將 a=0 執(zhí)行完后,執(zhí)行 b=a 才有意義。a=0沒有執(zhí)行完成或未執(zhí)行時,b=a 的執(zhí)行完全沒有意義。這就是程序按指令運轉(zhuǎn)的重要性,正如電路按動作運轉(zhuǎn)的重要性。
時鐘周期將一個一個的動作隔離開來,確保每個動作在執(zhí)行時,上一個動作已經(jīng)完全執(zhí)行完成了。而存儲器則記錄電路的狀態(tài),每個動作的執(zhí)行結(jié)果放在存儲器中供下個動作使用。
這正是CPU所需要的,CPU執(zhí)行一條一條的指令正可以看作一個一個的動作(當(dāng)然這里并不是指的一條指令,CPU的基本動作是比指令更加細(xì)化的單位,尤其是在流水線的引入之后。指令正是由一個個基本的動作構(gòu)成的,這些基本動作指的是取指令/指令譯碼/指令執(zhí)行/訪存/寫回/PC增加等等)。
時鐘周期像人類的心跳,CPU隨著時鐘節(jié)拍快速又有條不紊的運行。正如前面所說,一個時鐘周期必須足夠CPU完全完成耗時最長的基本動作,時鐘周期對于不同的CPU來說并不是固定的,確定一個CPU的時鐘周期也是一個非常復(fù)雜的任務(wù)。
2.支持反饋邏輯
如果我們要實現(xiàn)一個計數(shù)器,如果用非時序電路實現(xiàn)是這樣的:
上述電路是完全無法使用的,電路的下一個輸出依賴電路現(xiàn)在時刻的狀態(tài),除了上一節(jié)所述的毛刺現(xiàn)象會造成結(jié)果的不可預(yù)計外,電路本身的邏輯存在死循環(huán)。
要支持反饋邏輯,必須使用寄存器將結(jié)果暫存起來,由時鐘沿控制數(shù)據(jù)的反饋更新。
說完了時序電路的特性,我們看看時序電路如何組成處理器。
時序電路構(gòu)成處理器
我們可以看到,一個最基本的處理器是這樣一個電路:
1. 可以完成邏輯的運算。
2. 電路需要有自己的狀態(tài)。
3. 每一個輸出除了基于輸入和處理邏輯外,還需要基于當(dāng)前電路的狀態(tài)。
時序電路可以很好的滿足上述特性。對于時序電路來說,時鐘脈沖便是電路的心跳,而寄存器是協(xié)同整個電路按心跳節(jié)拍運轉(zhuǎn)的動脈瓣。
大多數(shù)時候,寄存器處于一種穩(wěn)定狀態(tài),產(chǎn)生的輸出等于它的當(dāng)前狀態(tài)。信號沿著寄存器前面的組合電路傳播。這時產(chǎn)生一個新的寄存器輸入,但當(dāng)當(dāng)前時鐘脈沖處于低電位時,寄存器的輸出仍保持不變。直到時鐘脈沖變?yōu)楦唠娢?,輸入信號便寫入到寄存器中,成為下一個狀態(tài)。直到下一個時鐘上升沿,寄存器的狀態(tài)和輸出都不會發(fā)生改變。
電信號暢通無阻的在組合電路中傳播,而寄存器就成為這種傳播的屏障。只有在每個時鐘的上升沿時,信號才可以通過寄存器進入下一個組合電路。
而一個個的組合電路執(zhí)行著不同的動作,對于整個電路而言,時鐘脈沖與寄存器的配合使得電路在每個動作執(zhí)行完成后才會執(zhí)行下一個動作。處理器在一個時鐘周期內(nèi),執(zhí)行完一個動作并把狀態(tài)更新到寄存器。直到下一個時鐘周期再執(zhí)行下一個動作,此時上個動作已經(jīng)完全執(zhí)行完成了,而電路的最新狀態(tài)也已經(jīng)通過寄存器傳播到了負(fù)責(zé)當(dāng)前動作的電路中來。
換個角度,時鐘周期保證了每個周期結(jié)束時,這個周期內(nèi)的輸入已經(jīng)完整的轉(zhuǎn)化為了輸出。而這個輸出保存在寄存器內(nèi)供下個周期的動作使用。時鐘周期和寄存器的配合將電路要執(zhí)行的動作與動作之間隔離開來。每個動作的結(jié)尾會更新PC寄存器,而這也將成為下一個動作的開始。一個一個動作有條不紊的執(zhí)行,周而復(fù)始。(這種描述僅適用于最簡單的處理器模型,即一個時鐘周期完成一條指令的執(zhí)行的處理器。當(dāng)引入流水線后,由于分支、控制指令等原因造成了流水線冒險,PC的更新有著更加完備的機制,而不是固定的在一條指令的最后更新)
上面便是一個最簡單的處理器結(jié)構(gòu),左邊標(biāo)識了每部分電路對應(yīng)的動作。
我們可以使一個時鐘周期內(nèi)執(zhí)行完成整個指令執(zhí)行(上述所有動作),這樣下一個時鐘周期執(zhí)行下一條指令時可以保證上條指令可以執(zhí)行完成。雖然這樣時鐘周期會長到讓人難以接受,但它保證了指令流的正常流轉(zhuǎn)。
我們可以想象,這樣一個完整的過程是從讀PC計數(shù)器數(shù)值并取指令開始的。PC計數(shù)器中的數(shù)值造成了后面一系列電路狀態(tài)的變化,在PC不改變時,電路處于一個穩(wěn)定的狀態(tài),也就是完整執(zhí)行完一個指令的狀態(tài)。
而當(dāng)PC計數(shù)器一旦發(fā)生改變,將引起整個電路的新一輪的狀態(tài)改變。指令執(zhí)行的最后一個動作便是改變PC計數(shù)器,這樣在下一個時鐘周期,整個電路將執(zhí)行新的指令。
或者我們可以將負(fù)責(zé)各個動作的電路間用寄存器隔離開來,一個時鐘周期內(nèi)只執(zhí)行一個動作而不是一條指令,這樣可以大大加快電路的整體效率。事實上流水線便是這樣做的,為了更高的效率,許多流水線的層級非常深,一個取指/譯碼/執(zhí)行三個動作可能被拆分成十五個甚至更多個動作。這樣一個時鐘周期內(nèi),就可以處理多條指令(當(dāng)然它們處于不同的動作階段)。
典型的流水線簡圖如下:
我們用寄存器將負(fù)責(zé)每一個動作的模塊隔離開來,然后將時鐘周期設(shè)為每個模塊剛好可以向本模塊寄存器寫入數(shù)據(jù)的時間(而不是信號從頭傳播到尾的時間)。這樣一個時鐘周期內(nèi),每個模塊都執(zhí)行一次完整的動作。在單個時鐘周期內(nèi),每個模塊在服務(wù)不同的指令,而不是所有模塊服務(wù)同一個指令(如果這樣則每個模塊只在高電平持續(xù)時間的一小塊時間內(nèi)工作)。在單位時間內(nèi),整個邏輯電路服務(wù)的指令總數(shù)大大增加,也就是吞吐量得到了增加。
因為增加了電路的復(fù)雜性,對于一條指令而言,從頭走到尾所需的時間變長了,但對整個電路而言,吞吐量增加了。這便是流水線機制的意義。
我們在試圖理解流水線的動作時,不要將關(guān)注點放在邏輯電路上,而要將關(guān)注點放在寄存器值的變化上。因為組合邏輯電路不受時鐘信號影響,僅負(fù)責(zé)信號的傳播,真正依賴時鐘信號的是寄存器的寫入行為。我們的目標(biāo)便是寄存器的值隨著時鐘周期發(fā)生正確的變化。當(dāng)組合邏輯A前的輸入(也就是PC寄存器值)發(fā)生變化后,每過一個時鐘周期,該變化便依次傳遞到后面模塊的寄存器中。
流水線聽起來很完美,但也存在一些缺陷。比如我們很難將各個模塊的延遲變?yōu)橐恢碌模麄€電路的速度將受限于最慢的模塊。時鐘周期必須大于最慢模塊的整體計算時間,這就給其它模塊帶來了延遲。另外,流水線的層級也并非是越深越好。隨著流水線層架的加深,寄存器的增多將導(dǎo)致整體電路延遲的增加,當(dāng)層級到達一定深度時,該延遲占用總計算時間的比例增大,造成收益的減小。
指令如流水一樣進入處理器,而不是一條指令執(zhí)行完成后下一條指令才進入處理器。雖然將指令的執(zhí)行拆分成多個小動作會帶來許多麻煩,比如流水線冒險,但其帶來的吞吐量及縮短時鐘周期的收益是值得我們花費精力來解決這些麻煩的。
一個最基本的處理器的實現(xiàn)需要組合邏輯電路和兩種存儲設(shè)備:時鐘寄存器(程序計數(shù)器和指令狀態(tài)寄存器)和隨機訪問存儲器(指令內(nèi)存/數(shù)據(jù)內(nèi)存和寄存器文件)。
組合邏輯不需要任何時序或控制,只要輸入變化了,值就通過邏輯門網(wǎng)絡(luò)傳播。
那么我們還有四個硬件需要用時序控制:程序計數(shù)器/指令狀態(tài)寄存器/數(shù)據(jù)內(nèi)存和寄存器文件。因為時序控制的都是寫入操作,而指令內(nèi)存不需要寫入操作,所以也不需要時序控制。
時鐘脈沖控制著上述四個元器件的寫入操作。時鐘信號觸發(fā)將值寫入到指令狀態(tài)寄存器和隨機訪問存儲器。
處理器真的是一個非常宏大的話題,筆者能力極其有限,只能盡量的從非常宏觀的角度上描述一下對處理器的認(rèn)識(依然很吃力)。
混亂的戰(zhàn)場上,兩個士兵在黑暗的建筑里遇到。 不知道對方是否自己人,只能祈禱對方別沖動。 但如果聽到了槍聲,就已經(jīng)沒有了選擇的余地。
編輯:hfy
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94476 -
時序電路
+關(guān)注
關(guān)注
1文章
114瀏覽量
21696 -
多路復(fù)用器
+關(guān)注
關(guān)注
9文章
873瀏覽量
65297 -
控制信號
+關(guān)注
關(guān)注
0文章
164瀏覽量
11957
發(fā)布評論請先 登錄
相關(guān)推薦
評論