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

邏輯電路芯片-組合邏輯電路芯片-時(shí)序邏輯電路芯片
放大電路的組成原則是什么?
時(shí)序邏輯電路必不可少的部分是什么
時(shí)序邏輯電路的基本概念、組成、分類及設(shè)計(jì)方法
時(shí)序邏輯電路的功能表示方法有哪些
時(shí)序邏輯電路的描述方法有哪些
時(shí)序邏輯電路有哪些結(jié)構(gòu)特點(diǎn)呢
時(shí)序邏輯會(huì)產(chǎn)生鎖存器嗎
TLC551,TLC551Y單芯片時(shí)序電路數(shù)據(jù)表

評(píng)論