電路為什麼要有觸發器這種結構?

電路為什麼要有觸發器這種結構?為什麼要用時鐘同步起來呢?一個乘法器如果不設計成觸發的會是什麼狀態?最近在想電路同步非同步的時候想到這個問題,現在還是大二,感覺知識不夠無法從宏觀角度理解。


題主,這是個很好的問題,因為觸發器(flip flop)是數字電路很重要的基礎,會了這個才能設計大規模電路,我來認真回答下,另補上了流水線的知識
------------------------------------------------------------------------------------------------------------------------
先簡短回答問題:用觸發器是因為觸發器能保存數據,保存電路狀態;觸發器是在時鐘邊沿觸發,用時鐘同步是讓整個電路能同步整齊劃一的工作;乘法器的計算部分是組合邏輯,不需要觸發器,計算後的結果可以用觸發器保存起來。

接下來詳細解釋。
電路系統中是有兩種電路,一種是組合邏輯(Combinational Logic),其輸出只是當前輸入的函數,與之前狀態無關,無存儲功能;另一種是時序邏輯(Sequential Logic ),能夠存儲數據供以後使用,如觸發器,memory,寄存器(register,由多個觸發器組成)。

舉個例子,如果你要做累加,計算

s=0;
for (i=0;i&

如果不用觸發器,只用組合邏輯,設計為下圖。但可以看到這個設計有問題,無法實現結果,因為無法存儲中間值,無法控制狀態轉換。

所以就需要觸發器存儲中間值,結構如下:

所以在實際的電路系統中,是由時序邏輯與組合邏輯共同組成。時序邏輯儲存中間值,可分割組合邏輯,讓每個組合邏輯變成一小塊。流水線就是這樣,能提高時鐘頻率,增加系統吞吐量,讓每個模塊的利用率達到最大。如下圖所示:

設計觸發器時,需要注意觸發器的幾個時間特性,滿足這些特性觸發器才能正常工作:
建立時間(T setup time):是指在時鐘沿到來之前數據從不穩定到穩定所需的時間,如果建立的時間不滿足要求那麼數據將不能在這個時鐘上升沿被穩定的打入觸發器。
保持時間(T hold):是指觸發器的時鐘信號上升沿到來以後,數據也必須保持一段時間,數據保持不變以便能夠穩定讀取。如果保持時間不滿足要求那麼數據同樣也不能被穩定的打入觸發器。
數據輸出延時(Tco, Clock-to-Output Delay):當時鐘有效沿變化後,數據從輸入端到輸出端的最小時間間隔。

為避免競爭冒險,需保證 Thold &< Tco +T logic-min ,也就是確保在新的時鐘周期,新的 數據不會在小於 Thold 時間內到達寄存器,否則會衝掉之前的數據,從而可能導致Thold 時間不滿足。

注意只有建立時間(T setup time)與 數據輸出延時(Tco, Clock-to-Output Delay)是在critical path上,是電路delay,如下圖:

最後說下,觸發器的內容一定要認真理解,這個是整個數字電路的基礎。

你說到了同步非同步,那我說下非同步電路吧。非同步電路不需要時鐘,低功耗,速度快,但需要用大量握手信號來同步電路,設計起來很複雜,目前還是非主流,至少十年內時序同步電路仍會是主流。

-----------------------------------------------流水線分割------------------------------------------------------

PS.有小夥伴說最好擴充下流水線(pipeline)知識,那我補充下吧

pipeline是將組合邏輯進行分割,能讓任務以類似並行方式處理,提高系統頻率,提高吞吐量(throughput).

舉個例子,假設洗衣分為四個步驟,分別在四個設備上進行,其中漂洗機器,烘乾機器,在衣架上摺疊衣服,把衣服放進柜子里各用30分鐘,全過程需兩小時。現有四個人去洗衣服,若sequential處理,一個人完成全步驟別人才開始,每人兩小時,四個人共用八小時。如下圖:

但如果利用pipeline式的流水處理,當某人完成某步驟,其所用的設備就空閑了,後面的人就開始使用,四個人洗衣服只用3.5小時就能完成。如下圖:

注意,pipeline只是提高系統的吞吐量,不能改善單個任務的latency。在實際電路中是在組合邏輯中插入register,分割組合邏輯,實現pipeline,而register讀寫也需要時間,所以單個任務的執行時間反而會增長。另外在分割組合邏輯時,使分割後的每段處理時間盡量相同,因為系統時鐘是由最慢的那段決定的。如下圖:

總結:

一個經典的五級流水線處理器如下圖:

------------------------------------------------------------------------------------------------------------------------
PS. 得到大家這麼多贊,那補上另一個關於流水線中會出現的hazards的成因與解決方法的回答是否有既用到 狀態機 又用到 流水線 的module? - young cc 的回答

http://www-inst.eecs.berkeley.edu/~cs61c/sp15/lec/09/2015Sp-CS61C-L09-kavs-SDS-1up.pdf

http://www-inst.eecs.berkeley.edu/~cs61c/sp15/lec/13/2015Sp-CS61C-L13-kavs-Pipelining-1up.pdf


@young cc的回答已經非常好了,我再補充一點他沒有詳細提到的東西。

類似於乘法器這類用來做算術邏輯運算的電路都是組合邏輯電路。為什麼是組合邏輯電路?因為要完成運算這個過程,需要運算的規則。比如

code:
a=2;b=3;
c=a*b;
print c;

output:
6

這樣的一個過程,我們需要一個乘法的規則。

組合邏輯電路由基本的邏輯門組成,內部沒有反饋迴路。所以組合邏輯的輸出端和輸入端狀態有著唯一的與電路先前狀態無關的邏輯約束條件。通過將不同的邏輯門按特定的連接方式進行組合,所得到的約束條件能夠映射到特定的數學函數上,我們就可以用這個電路實現對應的數學函數上運算的功能了。類似於乘法器這類電路就是提供了一個運算的規則,相當於一個

*

提供的意義一樣。

但是組合邏輯的問題是只要輸入端的信號撤走了,輸出端的結果也就不見了。就好比你在心算2*3的結果,然後在腦子裡得到了6,沒寫在草稿紙上就去看下一步要幹什麼,結果回來還要重新算一遍2*3,記在草稿紙上,然後代入下一步的式子里。「記在草稿紙上」就相當於用觸發器把它存起來。

當然這個比喻有不恰當的地方,因為我們小時候都背過乘法表,2*3這麼簡單的運算實際是用查表法解決的,而不是真的去算一遍2+2+2。。。


其實就是同步電路和非同步電路的區別。兩者的優缺點對比詳情見書和wiki。

簡單說非同步電路,它的優點是面積小,速度快;缺點是易受干擾,出現亞穩態。非同步電路的一堆優點也抵不過它這個致命的缺點,試想你會選擇一個非常不靠譜的傢伙么?所以只有在一些特殊的場景下才會用非同步設計。

同步基本就是非同步的對偶,而我們是可以忍受同步的缺點,面積大就大唄,速度慢就慢唄,但是起碼能靠譜工作啊,這些缺點以後還可以隨著工藝和基礎研究的發展逐漸彌補。 兩者的優缺點導致了現狀:非同步設計的研究遠沒有同步深入廣泛,目前的電路設計主要集中在同步。

為什麼電路要用 ff + clock ?答案顯而易見:因為有了它們之後才是同步電路啊。


看了大神們這麼詳細的回答,我簡單說一下吧:

數字電路主要分為兩個部分門電路組合和寄存器(觸發器),門電路負責實現邏輯功能,寄存器負責存儲各種中間狀態。明白了這一點,其它的看自己了~


觸發器是 實現 數字(時序)邏輯的一種方式。


題主能問出這個問題,想必功課很好,已經開始考慮書本以外更深層次的東西了,這個習慣一定要保持住啊!

@young cc的答案很詳細,但是我猜測對於題主來說可能不夠「解癢」,所以嘗試從另一個角度答一下「電路為什麼要有觸發器這種結構?」這個問題:

首先要說的是,非線性大法好。宇宙中非線性是一般存在,而線性才是特例,需要忽略很多高階量才能得到一個線性關係。所以,線性關係在解決實際問題的時候一般沒什麼用(電阻是線性元件,但是也需要忽略電流過大燒化了帶來的斷路這個非線性關係)。

然後是對於數字電路來說,一般非線性關係用處也不太大。因為數字電路中狀態值才是有意義的,0和1以外的其他值都沒有用,所以傳遞函數或者說響應曲線如果是單值函數的元件也可以拜拜了,因為輸入輸出是一一對應的,無法根據不同的情況輸出不同的狀態值。因此,數字電路需要的是傳遞函數為多值函數元件,最好是二值函數,分別對應0和1。

然後就是要介紹一下雙穩態的概念。數字電路里的元件單單二值函數還不行,還得能保持住,比如類似於x=left| y 
ight| 這種二值函數,電路本身並不知道應該取正值還是取負值來輸出。要確定最終輸出的狀態值,需要根據之前一段時間的輸入來確定,就好比下面這個圖(隨便Google了一個光學雙穩態的圖,看個意思),箭頭可以理解為時間。這樣一來,對於任意輸入Iin left( c,d 
ight) ,輸出都是穩定的a或者b,這就是雙穩態的含義。

剛才提到了輸出由前一段時間的輸入來確定,這裡包含了時間和強度兩個變數,所以是個信號的概念,我們稱之為觸發信號,輸出裝態由觸發信號來確定。

最後就是,具備上述雙穩態特性的元件,我們稱之為觸發器。有了觸發器,才能夠根據不同的輸入信號來輸出不同的狀態值。然後,我們才能夠用應用觸發器來實現邏輯電路,進行邏輯運算。在我個人的理解里,觸發器是數字電路的基礎,沒有觸發器就沒有數字電路。

後續幾個關於觸發器應用的問題可以參照其他大神的答案。


其實上面的回答,甚至高票的,都沒回答到點子上。

這些答案都是回答了「觸發器」的功能,而不是為什麼要有觸發器。

看看軟體,沒有觸發器一樣可以用內存來存儲。

觸發器最大的好處,是把系統這個巨大系統,分解成為小的功能。

從而提供了一種簡化系統的模式。使得EDA工具能夠只對小的功能進行操作即可。

這個你可以想像數百萬人的戰爭,指揮就是靠軍團-師-營-連-班,一級一級簡化。

有了這種簡化,你才可能按照功能來完成系統任務。


我覺得你的數字電路老師在講到Latch的時候,應該告訴你為什麼要學Latch、FF這樣的element。前面的回答已經很好了,一句話,使得電路才有了記憶的功能。舉一個經典的栗子,如果沒有memory element,你手上有兩個一元硬幣,需要去自動售貨機買一瓶價值2元的水。如果沒有FF,你永遠買不到,因為電路記不住你之前投進去的硬幣,不管你投多少次,電路都覺得你只投了1元。


大二應該單片機玩的很6了吧 單片機裡面有個東西叫寄存器 寄存器的原理就是觸發器哦 這樣才能鎖存住電平的狀態 這種有記憶效應的就是時序邏輯啦 然後時序邏輯到處都是啊 學習下cpu原理吧 推薦cousera公開課 from nand to terris 跟著老師從一個nand gate和 觸發器搞一個cpu出來


簡而言之就是同步化。

設計電路的時候你可以精確地知道在哪一個時刻獲得什麼結果,這樣功能設計變得有可能。

如果沒有觸發器,組合邏輯鏈有長有短,天知道我這個輸入進去,測到的是哪個時候的輸出。

不可預測,就談不上設計。

把組合電路塞到兩個觸發器之間,我就可以明確的知道,下一個時鐘,我在觸發器的輸出端,得到的是什麼。


建議回大一去把introduction to computer organization的FSM controller和pipelining補補


觸發器能讓數據在一個或者多個時鐘的控制下有序傳遞,是同步數字系統的基礎。這樣設計簡單,也便於進行時序分析,便於最終的物理實現。


題主大二就刷知乎!我大二還刷人人!你這起步就很厲害啊,大神們回答好棒,我崇拜一下


觸發器,狀態的改變需要外界作用的改變。如果沒有觸發器的話就需要外界的作用不斷的進行,不能間斷。或者說,有了觸發器,外界的作用更多的是為了改變,沒有觸發器,外界的作用更多的是維持。


觸發器的作用是存儲,而存儲是計算或者說演算法的要素。

工程上,觸發器使用起來比其它類型的memory更方便靈活


沒有觸發器就沒有數字電路啊


時序邏輯必須要觸發器來控制。不然怎麼鎖存呢?觸發器→鎖存器→寄存器


上面的回答已經說的很好了,因為電路分為 時序邏輯(能存儲數據)與組合邏輯(無存儲功能),而時序邏輯用觸發器存儲數據,用時鐘觸發


將過去和未來聯繫在了一起


電路當然可以沒有FF,那就是組合邏輯。

你輸入一個信號經過有限的延時之後得到輸出信號。

但是複雜的電路系統光有組合邏輯這樣還不夠。所以你需要時序電路來控制。時序電路的核心就是FF。

當然你也可以設計成非同步電路。那就要涉及到很複雜的模塊之間的溝通問題,一堆握手協議,反而會讓電路變複雜,也不穩定。

同步電路還是主流設計方法。

另外乘法器也有純組合邏輯實現的和流水線實現的。前者要在一個時鐘周期內做完,電路太複雜,做不完的話就會有timing violation。這時候就只能利用流水線型乘法器在多個時鐘周期里一步一步慢慢做,經過一定的時鐘延時之後輸出結果


有了觸發器才能有副作用……………………題主用haskell編幾個程序就明白了………………


用同步時鐘,延遲好計算,設計方便簡單。

非同步不是不可以,但延時不確定,雖然速度快效率高,但設計不方便。


推薦閱讀:

怎麼看懂Arduino的電路圖?
插麵包板對集成電路設計的學習有何幫助?
買電子模塊都能下載到原理圖,不怕自己的設計被盜用嗎?

TAG:現場可編輯邏輯門陣列FPGA | 晶元集成電路 | 數字電路 | Verilog | 電路設計 |