為什麼CPU需要時鐘才能工作?
同意 @梁峰銘 的回答。我稍微展開一點。時鐘不是作用在ALU(邏輯控制單元)上而是寄存器上。
一般對CPU比較樸素的一種理解是,知道它是一組邏輯門組成黑箱。給特定的輸入,會有相應的輸出。就像一個函數。
但情況要是稍微複雜一點,比如說1+1+1=?,怎麼辦?是不是要重新設計一個有3個輸入的邏輯加處理單元?那麼1+2+3+4+...+10=?怎麼計算?同時輸入10個操作數嗎?肯定不行。
解決的方法,就是需要「累加」。就是先計算1+2,得到的結果再+3,以此類推。1+2=3
3+3=66+4=10... ...36+9=4545+10=55
累加的過程,這裡必須用到2個「寄存器」。1-10十個數字排列在2號寄存器里,按順序取出來和上一次計算的和相加。每次得到的暫時的和存在1號寄存器。這時候,CPU的假想結構就變成了下面這樣,
輸入:A=1,y=0
輸出:Z=1,Y=1
但如果沒有時鐘脈衝的控制,這個穩定狀態一瞬間就會被打破。因為0+1=1的結果馬上會被寫入1號寄存器。馬上1又作為輸入重新回到邏輯運算單元。假設此時2號寄存器還沒來得及讀取出下一個參與計算的數字2,邏輯運算單元此時的輸入變為1+1,輸出變成2。情況也有可能完全反過來,2號寄存器跑得快,上一次計算的和1還沒來的及回到邏輯運算單元,下一個數字2已經到了,於是2+0=2就成了第二個輸出。因為像這樣操作數順序不確定,導致一切都會亂套。
解決問題的辦法,就是加個時鐘。真正神奇的地方在於,時鐘不是直接作用於ALU邏輯運算單元上。而是作用在寄存器上,寄存器上,寄存器上。
這種特殊的寄存器叫:時鐘寄存器。只有在時鐘信號的上升沿(比如說5V高位)才能往裡寫入。其他時候,輸入只能在外面等著。(圖源:《深入理解計算機系統》P249)
還是從第一個穩態開始:
輸入:A=1,y=0
輸出:Z=1,Y=1
這時候雖然邏輯運算單元的輸出是Y=1,但只要時鐘的高壓5V脈衝沒有到,這個Y=1的輸入一直無法寫進1號寄存器。所以它的輸出y一直保持初始值0。同理2號寄存器也必須等時鐘脈衝到達才能讀取第二個操作數2。
所以當時鐘電壓升高以後,兩個寄存器同時被寫入新的值。邏輯運算單元接收到兩個新輸入,在下一個時鐘脈衝到達之前,一直保持第二個穩態。輸入:A=2,y=1
輸出:Z=3,Y=3
以此類推,直到得到最後計算結果,都保證下一個操作數和上一次計算的和是同時進入邏輯運算單元。
最後再貼個圖,也是《深入理解計算機系統》里的一個例子,可能更貼近實際情況,注意2號圖,周期3結束時。這裡有3個寄存器。
- 組合邏輯內部寄存器,記錄臨時狀態。下一個狀態000已經得出,但還沒寫入寄存器,寄存器還保持100的初始狀態。在等待下一個時鐘脈衝才能寫入。
- 程序計數器的下一條指令0x00e也等待下一個時鐘脈衝到達才能寫入。
- 寄存器文件的上一次計算的輸出0x300已經等在外面,準備寫入%ebx地址。還是在等下一個時鐘高位。
注意3號圖,等第4個周期開始的一瞬間,也就是電壓升高的瞬間,三個寄存器的值同時被寫入。此時組合邏輯的平衡立刻被打破,內部邏輯馬上會得到一個新的輸出,在下一個脈衝到達前,三個寄存器再次改變狀態前,保持暫時的平衡。
總之,如果沒有寄存器這種被控制寫入時機的特性,邏輯電路之間的迭代將是毫無章法的。就是靠時鐘脈衝這個節拍器,系統才能在一次接一次的短暫穩態中得到最後想要的計算結果。
因此CPU大部分時間都沒有在計算,都處於時鍾低平的穩態中等待。所以說CPU為什麼越高頻越好。時鐘頻率越高每秒完成的步數越多,CPU的利用率越高。
最後展示一下組成寄存器最基本的神奇單元,鎖存器(Latch)。當時鐘處於5V高電平:輸出
當時鐘處於1V低電平:輸入等於輸入
,輸出
和輸入
相反。而且一直保持這個輸出。
對輸出
和
沒有影響。
更高級一點的是「D-觸發器(Flip Flop)」。它和鎖存器的區別在於,鎖存器在5V高電平的任何時間都可以對內部數據進行改寫。而觸發器只有在時鐘信號從低平變為高平的上升沿(一瞬間)內部信號才能被改寫。
觸發器可以簡單通過反向連接兩個鎖存器獲得:首先,這個問題就是錯的。
CPU就是CPU,他是中央處理單元,他是數字電路,但它並不一定要有時鐘。
前面有人說到需要時鐘是因為寄存器的工作原理,其實非也。甚至有人說需要時鐘是因為CPU是時許電路,甚至搬出了狀態機做例子,其實沒有時鐘一樣是可以有時序的好嗎?
這個問題的正確回答是:CPU可以有時鐘,也可以沒有時鐘。使用時鐘工作的CPU被稱為同步CPU(synchronous CPU),而不使用時鐘工作的CPU被稱為非同步CPU(asynchronous CPU)。目前市面上廣泛銷售的CPU都是同步CPU。
非同步CPU的設計思路有很多種,某些設計方法的電路特徵從門級開始就已經與同步CPU有質的區別。本人研究生的畢業設計就是一顆非同步CPU,三級流水,整個系統里沒有一個時鐘,控制通路全部用握手完成,數據通路全部是特殊設計的雙線邏輯(dual-wire logic)。
這個展開說的話內容太多了,總之就是這個提問根本就是錯的,樓上的回答基於一個錯誤的提問當然也是錯的,他們實際上只回答了「為什麼同步CPU需要時鐘」這個問題。說白了,現在的計算機都是基於圖靈機的思想,計算機系統就是一個有限狀態機,有限狀態機就需要改變狀態,改變狀態就需要時鐘觸發。
也有不用時鐘就能工作的計算機和CPU,那就是二戰期間使用運算放大器構成的模擬電路計算機,主要用於炮彈軌跡的計算。CPU的時鐘是用於「同步」的。
CPU從內存讀取一個32或64位的數(指令或者數據),要求32位同時讀入,不能有先後順序。所以僅僅靠簡單的邏輯運算是做不到的。所謂的「同時讀32個bit」,就需要有同一個時鐘控制,在同一個上升沿或下降沿去讀取,然後到下一個上升沿或下降沿前什麼都不做,但是能保持住讀進來的數值。做加法的時候,就同時把2個值放到邏輯計算面前,邏輯電路則可以在電平的下一個上升沿或下降沿去做加法(或者讀在上升沿,加法在下降沿)。
數值的上升沿讀入,其他時間保持,就是寄存器。因為有了寄存器,保證了邏輯運算的時候,輸入的1和0是穩定的,不是變化的。這就是時鐘的基本作用。如果沒有時鐘,可能32位讀入有時間順序的差異,哪怕是納秒的差異,也會讓結果不穩定,不可預期。
如果有複雜的計算,可能需要多次讀入(例如計算2個64位整數的加法),讀入指令一次,讀入A一次,讀入B一次,相加輸出再一次。每一次就是一個時鐘的上升沿或下降沿操作。
這是最基本的CPU工作原理。現代的CPU已經非常非常複雜了,但是時鐘的基本作用還是類似的。比如,CPU可以操作複雜的指令,這些複雜的指令可能在CPU裡面幾個模塊間傳遞數據,那麼模塊間的讀寫,數據傳遞,同樣是通過時鐘控制的。硬體電路有兩種,一種是組合電路,一種是時序電路。只有時許電路有記住功能,也只有這樣,更複雜的功能才能容易實現。沒有存儲,就沒法復用
硬體上大家說得很透徹了,我想從抽象機器和計算理論的角度談談我的理解。這篇回答默認您具備基本的計算機專業常識。
對於這個問題,我的理解是:時鐘是時序的物理實現手段之一。既然是從抽象機器的角度來談,那麼,就說說「為什麼計算機的運行是時序性的」這個問題。
【首先一句話概括結論】
計算機之所以需要「時鐘」這麼個東西,是因為圖靈機需要時序性地運行。圖靈機本質上就是「時序的」,這和我們的常規思維一致,也是諾依曼架構流行的原因之一。
完成相同的工作,如果採用不同的計算模型,也許並不需要「時序」的概念。
這張圖片描述了自動機的幾個概念。我們所說的「組合邏輯電路」,實際上是有限狀態機(FSM)的特例。當組合邏輯和觸發器等時序電路結合起來,便可以實現由時鐘控制的狀態機。同步和非同步只是技術細節上的問題,本質上都是狀態隨時間的轉換,即「時序」。最強大的自動機便是著名的圖靈機。
為理解「同步和非同步」的狀態轉換本質,我們可以從加法器入手。基本的加法器有串列加法器和超前進位加法器兩種。串列加法器是一種非同步加法器,每個子加法器的計算結果像行波一樣在各位子加法器間傳播,最終形成計算結果,換句話說,系統的第N個環節只有受到第(N-1)個環節的驅動才能開始執行。這是一種典型的非同步電路。在傳輸上最典型的非同步特徵就是握手機制,比如TCP的三次握手什麼的。
之所以說非同步電路和同步電路一樣具有狀態轉換的本質,是因為如果我們把非同步電路的整體運行狀態視為一個configuration,那麼整體上來看,非同步電路的運行實際上就是在各種configuration(子電路的state構成的集合)間不停轉換。如果您懂得NFA到DFA的轉換演算法,應該能夠立刻理解這個問題。所以說,同步和非同步只是自動機實現上的技術手段,本質上都是狀態轉換。
————
【圖靈機與時序】當今主流的計算機架構是馮·諾依曼架構。
諾依曼架構是基於圖靈機計算模型的。
圖靈機本質上是一種自動機。
自動機的狀態轉化是一個顯然的時序性過程。
時序正是描述這種狀態轉化的「過程性」。
我們熟悉的各種演算法,不就是一種操作順序嘛?我們熟悉的C語言、彙編程序,不就是一串按順序執行的指令序列嘛?我們執行的每一條指令,實際上不都是順序執行的微操作序列嘛?
實際上都是圖靈機的狀態轉換,即「時序」。
自動機的每一次狀態轉換,都是時鐘的每個節拍。
————
【圖靈機並不是唯一的計算模型】事實上,時序反映了狀態機的運行過程,換句話說就是對一個有向圖求路徑。
但是,以圖靈機為代表的計算模型並不是唯一的計算模型,在Lisp、Haskell等函數式語言背後,是一種同樣強大的計算模型——Lambda Calculus。Lambda演算是一種極其簡潔但是足夠強大的符號運算體系,它的運行規則是變數替換,而非狀態轉換。
因此,Lambda演算很可能在未來的人工智慧領域大放異彩,而人工智慧的實現很大程度上依賴於高度並行化的人工神經網路,這實際上就是一種「空間換時間」的思路。如果您玩過FPGA,就可以明白硬體FFT相比於運行在軟核上的FFT程序不知道快到哪裡去了。國內的寒武紀、國外的IBM都在研究如何從傳統的諾依曼架構中解放出來,就是為了突破智能演算法中「時間」的瓶頸。
現代編程語言,遑論Haskell、Clojure等原生函數式語言,Python、Ruby、C#、甚至最新的C++和Java標準都支持了基於lambda演算的函數式編程範式,這種函數式編程範式與我們熟悉的過程式程序設計是截然不同的兩種思路。在《計算的本質》這本書中有一個絕妙的例子,將一個典型的過程性演算法改寫成了lambda表達式(Ruby的proc表達式)。如果看過這個例子,您應該就可以理解「時序」在函數式編程範式中被極大弱化的現象,取而代之的是遞歸和表達式代換的概念。(如果您對lambda演算下的遞歸感興趣,歡迎您閱讀答主本人的文章《Y組合子使用說明書》http://www.jianshu.com/p/64786c4396a7 ,文中附有參考資料目錄,也許對您有所幫助。)
因此,不能說諾依曼架構會永遠統治計算機世界。隨著技術的發展,也許會出現基於非圖靈機模型的新的計算機實現方式。如果系統足夠精巧複雜,可能未必需要「時序」這種概念,比如我們的大腦。
現階段,在計算機的實現,或者說演算法的操作性實現方面,仍然離不開自動機(Lisp machine);但是在解決問題的方法論層面,「時序」並非必需。
————
【番外篇:舉例子說明過程化思路和函數化思路的區別】首先我們必須明確,圖靈機和lambda演算是兩種具有代表性的、計算能力上等價的計算模型。
比如我們現在打算解決這樣一個問題:計算一個自然數N後面的那個數(N+1)。
如果採用圖靈機,那麼可能的解決方案是這樣的:
例如我們規定N以二進位的形式按照LSB(最低有效位)在右的順序記錄在紙帶上,初始時讀寫頭在LSB那個格子的位置。在時鐘節拍的驅動下,機器按照下列規則運行(註:X代表空格子,X→1代表「如果當前格子是空,則改寫為1」,(L)代表讀寫頭左移一格,等等):
ZERO(f,x)=x
ONE(f,x)=f(x)
TWO(f,x)=f(f(x))
THREE(f,x)=f(f(f(x)))
……
這裡的ONE(),TWO()等等都是lambda函數。這裡定義自然數的方式叫做Church encoding(丘奇編碼,Church encoding),簡單來說就是每個自然數N都是一個函數,返回的是某個其他函數迭代N次後的結果。那麼,我們需要的「+1s」操作就可以這樣寫成這樣的lambda函數:(INC(number))(f, x)=f(number(f, x))
也就是為number(f,x)又增加了一次迭代。
問題就這樣解決了。
從這個簡單的例子可以看出,圖靈機思路是一種節拍式、按部就班的方法,操作性極強;而lambda演算的解決方案則更「符號化」,側重數學上的邏輯性。
這啟發我們,「時序」是一種操作性的理解和解決問題的極好方法,但並不意味著所有問題都必須依賴於序列化的操作——即自動機。
————
【進階閱讀】
https://www.zhihu.com/question/52327948/answer/130223359————
圖片來自維基百科和答主手寫。
答主才疏學淺,回答僅供參考,同時也希望得到高人指點。如有錯漏之處,歡迎各位指正~答案說得比較啰嗦,謝謝各位的閱讀。【參考資料推薦】1. 計算的本質,計算的本質 (豆瓣),計算理論入門讀物,讀起來很舒服,適合計算機專業本科生和工程師閱讀。答主讀過這本書之後才想到從抽象機器的角度來回答這個問題。2. GEB,哥德爾、艾舍爾、巴赫 (豆瓣),算是科普讀物吧,天馬行空的一本書。3. 各種教材,關鍵字:形式語言與自動機,編譯原理,數字電路,計算機體系結構。因為你接觸到的cpu都是數字電路的產物。。
而有的專用模擬運算電路,有不少還真就不需要時鐘。但是他們的開關,往往也離不開數字電路來做控制和同步。。
也可以沒有啊,只是一個樂隊有一個指揮比較方便
時序就像機械設備上的齒輪,小齒輪帶動大齒輪,大齒輪帶動設備動作,最小的齒輪相當於是時鐘,而大齒輪相當於是些計數器,如果沒有時序就沒有最小的齒輪運動,相當於沒有時鐘,實際上就是靜止,機械也就是電路根本就動作不起來
沒有時鐘一樣可以工作,無非是非同步電路嘛。
同步電路的重點是用時鐘+寄存器達到每一級電路同時運行的效果而已,比如一個加法器,兩個INPUT一個OUTPUT,如果一個INPUT上的值先於另一個INPUT發生變動,輸出就會錯誤,並且這個錯誤在後面的電路中會被進一步放大。這時候如果把兩個INPUT都用寄存器緩存起來,一個時鐘過來同時刷新結果,OUTPUT就不會出現異常。
當然對非同步電路來說解決這問題也很簡單,在跑得快的那條線路上面多加幾個反向器補償就行了——如果要電路跑得快的話(比如1秒鐘內INPUT變化100M次)還得考慮線路的容抗問題,你管子擺的位置不一樣,那電容都不一樣,電容得充電放電有延時吧。問題來了,你設計的是有至少million數量級的晶體管的CPU,不是只有幾十個晶體管的2bit加法器,並且就算沒有時鐘,你的CPU一秒鐘也要能夠做100M以上的加法運算,你確定要把整個CPU的後端layout全部用手畫出來,保證所有時間敏感的電路的長度一樣容抗一樣然後用模擬工具來保證時序(不是時鐘)的正確性?我覺得,雖然很多專業人士解釋的非常專業,但都沒有說出根本原因。
引入「時鐘」最重要的作用是為了簡化 從而降低計算機的設計成本。
好幾個答案中也說了:可以,並且也存在無時鐘的CPU;
但是,CPU是不可能自己單獨完成工作的,而無固定頻率(即「時鐘「)的CPU和周邊工作單元協同工作時,因為大家步調不一致,溝通起來效率會打折扣,想像一下,大BOSS就是CPU分配工作,時刻提醒自己,記著要告訴RAM:你準備好,我要在0.000000000000123456........秒後調用你的數據哦,還有要再對Modem說:0.000000234567....秒開始給我下載,哎那個鍵盤,老子正忙著呢,你這時候給我提交輸入不是添亂嘛!。。。。。。。。哎唷,搞的大家都很累好么!引入時鐘(周期)的話,這些都簡化了:比如只要在固定周期去接收和處理鍵盤提交的輸入就好了。
更直接的打個比方:
CPU接了個給廣場鋪磚的活,於是帶一幫只懂鋪磚的RAM、Modem、key、、去幹活,用邊長1×1的地磚是最簡單的,只要給大家說:A你從第一塊開始鋪,B從100塊開始,C從200塊開始。。。。。。這樣大家可以同步工作了而如果ABCDEFG.....大家各用各自規格的地板磚來開工,CPU准得急死!
簡單說,時鐘(周期)就是為了規定一個最小單位的地板磚。學數電的時候強烈推薦這個軟體! Logic Circuit official web site
首先要做一個 D-Latch
照例,我不是回答問題,而是寫我對問題的思考,或者說是我在回答自己的疑惑。我就在想一個問題,現在大家理解晶元都非常抽象了,因為已經比較複雜了,想要看清本質真的是太困難了,如果退回到最開始最簡單的情況是什麼樣的呢。我們拿來一個晶體管,當然只是一個晶體管我們什麼也做不了也不知道它內部情況,所以還需要兩個東西,輸入電流的裝置,最好這個裝置也能控制輸入電壓的大小,再來一個輸出裝置,那就一盞燈吧,最好這盞燈有檢測電壓功能可以用他亮還是滅來判斷晶體管輸出電壓,如果是高電壓,那麼燈亮,如果是低電壓,那麼等滅。好了,我覺得這就算是一個最最最最簡單的計算機了。這時還需要手工輸入,那麼我們升級一點點,還是不要太複雜,用個紙帶打孔來當做內存,畫好格子,每個格子打孔,有孔就是高電壓,沒空就是低電壓。事先存好高電壓和低電壓,然後開始轉。這時你就可以展開想像了,這種形式的計算機,我們可以讓紙帶無限快速的轉么?(就像電流一樣的快速),好像不可以,無論如何識別孔洞都需要時間(為什麼會有這個時間,為什麼識別效率不能達到光速,我也不知道,可能就是另一個話題了吧。),就算我們讓識別能力提升,也不可能提升到像電流一樣快,所以必須有一個節奏,然後一個格子一個格子的識別。再升級,如果說也不需要人來驅動了,換電動,也一樣,需要一個節奏。時鐘就是這個節奏的提供者。
說道這,我不禁想起了蒸汽機,蒸汽火車,內燃機,它們提供動力的形式也是周而復始的一個節奏,如果沒有這個周而復始的節奏,那就成了導彈,飛出去就飛出去了,什麼也做不了。更本質一點就像是驢或者人拉磨,水車,風車。。。似乎人類就一直都是這樣在使用動力,為什麼呢?為什麼非要這樣,驢子永遠向前狂奔不行么?好像真的不行啊,必須困起來有節奏才能運轉。
說個題外話,似乎自由是真的不可能存在的,自由就意味著沒有節律,人類社會將無法運轉,文明不復存在。
時鐘對cpu來說就是時間。生活沒了時間會怎麼樣,嗯,暫停。CPU也是如此。可以嘗試拔掉89C51開發板的晶振,你會發現程序執行暫停。就是這樣。
沒有時鐘計算機怎麼自動計算呢?簡單的說就是人通過各種控制器將程序代碼和數據寫入存儲器,然後計算機將時鐘信號轉化成存儲器的地址,讓計算機取出相應的代碼和數據通過一系列的門電路進行計算處理。
同步讓一切變得簡單,非同步讓一切變得複雜。
加拿大蒙特利爾的Octasic公司用非同步電路來設計cpu,可以不要時鐘。不知道這家公司在國內有客戶沒有。Wireless Base Stations amp;amp; Media Gateways | Octasic
沒讀過他們的產品手冊,不知道是不是徹底脫離了時鐘。不過聽過介紹,說非同步電路設計很省電。
時鐘就是口哨,讓組合電路X進入到下一個組合電路Y,組合電路就是一個個子功能,當然之間靠鎖存器來銜接。當然理論上不要時鐘和鎖存器應該也行吧,那電路何時穩定下來很燒腦...
時鐘能讓信號有規律,因為很多電路都是公用的,而cpu里有很多1 0開關,沒有時鐘調節的話,是沒法工作的,會混亂的。
同樣是高電平輸入,一塊晶元怎麼知道這代表了一個1還是兩個1呢,雖然可以用編碼方式去解決,但是相比之下,還是另外搞一路標準的信號作為比對來的方便一點
推薦閱讀:
※學習excel ,word ,ppt的具體用法,有什麼書籍,視頻,軟體可推薦的么?
※NTFS 是目前最先進的文件系統嗎?
※如何從零開始構建計算機軟體系統?
※如何把兩台電腦連接在一起,並行執行?
※Windows 10 已經推出 1 年多了到底跟 Windows 7 比怎麼樣?