上一講,咱們看到,要可以實現一個完整的CPU功能,除了加法器這樣的電路以外,咱們還須要實現其餘功能的電路。其中有一些電路,和咱們實現過的加法器同樣,只須要給定輸入,
就能獲得固定的輸出。這樣的電路,咱們稱之爲 組合邏輯電路(Combinational Logic Circuit)。編程
可是,光有組合邏輯電路是不夠的。你能夠想一下,若是隻有組合邏輯電路,咱們的CPU會是什麼樣的?電路輸入是肯定的,對應的輸出天然也就肯定了。ui
那麼,咱們要進行不一樣的計算,就要去手動撥動各類開關,來改變電路的開閉狀態。這樣的計算機,不像咱們如今天天用的功能強大的電子計算機,spa
反倒更像古老的計算尺或者機械計算機,幹不了太複雜的工做,只能協助咱們完成一些計算工做。3d
這樣,咱們就須要引入第二類的電路,也就是 時序邏輯電路(Sequential Logic Circuit)。時序邏輯電路能夠幫咱們解決這樣幾個問題。blog
第一個就是 自動運行的問題。時序電路接通以後能夠不停地開啓和關閉開關,進入一個自動運行的狀態。這個使得咱們上一講說的,控制器不停地讓PC寄存器自增讀取下一條指令成爲可能。事件
第二個是 存儲的問題。經過時序電路實現的觸發器,能把計算結果存儲在特定的電路里面,而不是像組合邏輯電路那樣,一旦輸入有任何改變,對應的輸出也會改變。ip
第三個本質上解決了各個功能按照 時序協調的問題。不管是程序實現的軟件指令,仍是到硬件層面,各類指令的操做都有前後的順序要求。時序電路使得不一樣的事件按照時間順序發生。內存
想要實現時序邏輯電路,第一步咱們須要的就是一個 時鐘。我在第3講說過,CPU的主頻是由一個晶體振盪器來實現的,而這個晶體振盪器生成的電路信號,就是咱們的時鐘信號。路由
實現這樣一個電路,和咱們以前講的,經過電的磁效應產生開關信號的方法是同樣的。只不過,這裏的磁性開關,打開的再也不是後續的線路,而是當前的線路。it
在下面這張圖裏你能夠看到,咱們在原先通常只放一個開關的信號輸入端,放上了兩個開關。一個開關A,一開始是斷開的,由咱們手工控制;另一個開關B,
一開始是合上的,磁性線圈對準一開始就合上的開關B。
因而,一旦咱們合上開關A,磁性線圈就會通電,產生磁性,開關B就會從合上變成斷開。一旦這個開關斷開了,電路就中斷了,磁性線圈就失去了磁性。因而,開關B又會彈回到合上的狀態。這樣一來,電路接通,線圈又有了磁性。咱們的電路就會來回不斷地在開啓、關閉這兩個狀態中切換。
這個不斷切換的過程,對於下游電路來講,就是不斷地產生新的0和1這樣的信號。若是你在下游的電路上接上一個燈泡,就會發現這個燈泡在亮和暗之間不停切換。
這個按照固定的週期不斷在0和1之間切換的信號,就是咱們的 時鐘信號(Clock Signal)。
通常這樣產生的時鐘信號,就像你在各類教科書圖例中看到的同樣,是一個振盪產生的0、1信號。
這種電路,其實就至關於把電路的輸出信號做爲輸入信號,再回到當前電路。這樣的電路構造方式呢,咱們叫做 反饋電路(Feedback Circuit)。
接下來,咱們還會看到更多的反饋電路。上面這個反饋電路通常能夠用下面這個示意圖來表示,其實就是一個輸出結果接回輸入的 反相器(Inverter),也就是咱們以前講過的非門
有了時鐘信號,咱們的系統裏就有了一個像「自動門」同樣的開關。利用這個開關和相同的反饋電路,咱們就能夠構造出一個有「記憶」功能的電路。這個有記憶功能的電路,
能夠實如今CPU中用來存儲計算結果的寄存器,也能夠用來實現計算機五大組成部分之一的存儲器。
咱們先來看下面這個RS觸發器電路。這個電路由兩個或非門電路組成。我在圖裏面,把它標成了A和B。
1. 在這個電路一開始,輸入開關都是關閉的,因此或非門(NOR)A的輸入是0和0。對應到我列的這個真值表,輸出就是1。而或非門B的輸入是0和A的輸出1,
對應輸出就是0。B的輸出0反饋到A,和以前的輸入沒有變化,A的輸出仍然是1。而整個電路的 輸出Q,也就是0。
2. 當咱們把A前面的開關R合上的時候,A的輸入變成了1和0,輸出就變成了0,對應B的輸入變成0和0,輸出就變成了1。B的輸出1反饋給到了A,A的輸入變成了1和1,
輸出仍然是0。因此把A的開關合上以後,電路仍然是穩定的,不會像晶振那樣振盪,可是整個電路的 輸出Q變成了1。
3. 這個時候,若是咱們再把A前面的開關R打開,A的輸入變成和1和0,輸出仍是0,對應的B的輸入沒有變化,輸出也仍是1。B的輸出1反饋給到了A,A的輸入變成了1和0,輸出仍然是0。這個時候,電路仍然穩定。 開關R和S的狀態和上面的第一步是同樣的,可是最終的輸出Q仍然是1,和第1步裏Q狀態是相反的。咱們的輸入和剛纔第二步的開關狀態不同,可是輸出結果仍然保留在了第2步時的輸出沒有發生變化。
4. 這個時候,只有咱們再去關閉下面的開關S,才能夠看到,這個時候,B有一個輸入必然是1,因此B的輸出必然是0,也就是電路的最終 輸出Q必然是0。
這樣一個電路,咱們稱之爲觸發器(Flip-Flop)。接通開關R,輸出變爲1,即便斷開開關,輸出仍是1不變。接通開關S,輸出變爲0,即便斷開開關,輸出也仍是0。也就是,
當兩個開關都斷開的時候,最終的輸出結果,取決於以前動做的輸出結果,這個也就是咱們說的記憶功能。這裏的這個電路是最簡單的RS觸發器,也就是所謂的復位置位觸發器(Reset-Set Flip Flop) 。對應的輸出結果的真值表,你能夠看下面這個表格。能夠看到,當兩個開關都是0的時候,對應的輸出不是1或者0,而是和Q的上一個狀態一致。
再往這個電路里加兩個與門和一個小小的時鐘信號,咱們就能夠實現一個利用時鐘信號來操做一個電路了。這個電路能夠幫咱們實現何時能夠往Q裏寫入數據。
咱們看看下面這個電路,這個在咱們的上面的R-S觸發器基礎之上,在R和S開關以後,加入了兩個與門,同時給這兩個與門加入了一個時鐘信號CLK做爲電路輸入
這樣,當時鍾信號CLK在低電平的時候,與門的輸入裏有一個0,兩個實際的R和S後的與門的輸出必然是0。也就是說,不管咱們怎麼按R和S的開關,根據R-S觸發器的真值表,對應的Q的輸出都不會發生變化。
只有當時鍾信號CLK在高電平的時候,與門的一個輸入是1,輸出結果徹底取決於R和S的開關。咱們能夠在這個時候,經過開關R和S,來決定對應Q的輸出。
若是這個時候,咱們讓R和S的開關,也用一個反相器連起來,也就是經過同一個開關控制R和S。只要CLK信號是1,R和S就能夠設置輸出Q。而當CLK信號是0的時候,不管R和S怎麼設置,輸出信號Q是不變的。這樣,這個電路就成了咱們最經常使用的D型觸發器。用來控制R和S這兩個開關的信號呢,咱們視做一個輸入的數據信號D,也就是Data,這就是D型觸發器的由來。
一個D型觸發器,只能控制1個比特的讀寫,可是若是咱們同時拿出多個D型觸發器並列在一塊兒,而且把用同一個CLK信號控制做爲全部D型觸發器的開關,這就變成了一個N位的D型觸發器,也就能夠同時控制N位的讀寫。
CPU裏面的寄存器能夠直接經過D型觸發器來構造。咱們能夠在D型觸發器的基礎上,加上更多的開關,來實現清0或者所有置爲1這樣的快捷操做。
好了,到了這裏,咱們能夠順一順思路了。經過引入了時序電路,咱們終於能夠把數據「存儲」下來了。咱們經過反饋電路,建立了時鐘信號,而後再利用這個時鐘信號和門電路組合,
實現了「狀態記憶」的功能。電路的輸出信號不僅僅取決於當前的輸入信號,還要取決於輸出信號以前的狀態。最多見的這個電路就是咱們的D觸發器,它也是咱們實際在CPU內實現存儲功能的寄存器的實現方式。
這也是現代計算機體系結構中的「馮·諾伊曼」機的一個關鍵,就是程序須要能夠「存儲」,而不是靠固定的線路鏈接或者手工撥動開關,來實現計算機的可存儲和可編程的功能。
有了時鐘信號和觸發器以後,咱們還差一個「自動」需求沒有實現。咱們的計算機還不能作到自動地不停地從內存裏面讀取指令去執行。這一部分,咱們留在下一講。下一講裏,咱們看看怎麼讓程序自動運轉起來。