數(shù)字電路分為組合( combinational)電路和時(shí)序(sequential)電路。組合電路的輸出僅取決于它的輸入,時(shí)序電路的輸出取決于當(dāng)前的輸入和之前的輸入。組合電路是不需要記憶的,但時(shí)序電路有記憶功能。
在紅色方框處會(huì)因?yàn)閚1n2響應(yīng)時(shí)間的延遲不同導(dǎo)致 OR門產(chǎn)生一個(gè)本不期望出現(xiàn)的低電平。盡管很短暫,但在復(fù)雜電路中該現(xiàn)象還是會(huì)影響某些破壞性的效果。
為了防止毛刺出現(xiàn)我們可以修改電路,原因與本節(jié)內(nèi)容無(wú)關(guān),所以不展開:
(二)??時(shí)序邏輯電路
前面提過,時(shí)序邏輯電路的輸出響應(yīng)同時(shí)取決于當(dāng)前的輸入與之前的輸入狀態(tài),所以需要一個(gè)存儲(chǔ)器件保存之前的出入狀態(tài)。存儲(chǔ)元器件的基本模塊為一個(gè)雙穩(wěn)態(tài)(bistable)的元件。該元件需要有兩種穩(wěn)定的狀態(tài),即0和1。我們首先可以想到將兩個(gè)反相器(非門)交叉耦合(cross coupled),即可形成一個(gè)最簡(jiǎn)單的雙穩(wěn)態(tài)電路。
我們可以假設(shè)Q為0或1,都可以發(fā)現(xiàn)輸出始終保持穩(wěn)定。但是該器件有兩個(gè)問題:
無(wú)法確定Q和~Q的初始值;
沒有出入信號(hào)。
我們?cè)诖嘶A(chǔ)上需要逐步修改出有實(shí)際意義的存儲(chǔ)器件。本節(jié)關(guān)注點(diǎn)在時(shí)序分析,所以不做詳細(xì)分析,只需要抽象化知道功能即可。
1.????SR鎖存器
將非門改為或非門,即SR鎖存器。
它有置位(SET)和復(fù)位(RESET)兩個(gè)輸入信號(hào),以此控制Q的輸出。真值表如下:
當(dāng)S和R均為0時(shí),Q可以保存之前的狀態(tài)。Q也可以通過S和R來控制。但是SR鎖存器并沒有引入時(shí)鐘的概念,即它無(wú)法決定什么時(shí)間來控制Q的狀態(tài)。
2.????D鎖存器
引入CLK,和D信號(hào)來決定在何時(shí)根據(jù)D的狀態(tài)來控制輸出Q電路和真值表如下圖:
由真值表可知D鎖存器(Latch)是電平敏感的,當(dāng)CLK=1時(shí),Q=D,當(dāng)CLK=0時(shí),Q保持之前的狀態(tài),無(wú)視D的變化。
3.????D觸發(fā)器(filpflop)
我們使用兩個(gè)由反向時(shí)鐘控制的D Latch級(jí)聯(lián)(背靠背,back to back)組成DFF,因?yàn)榉聪驎r(shí)鐘的作用可以使時(shí)鐘電平敏感變?yōu)檫呇孛舾?,電路如下圖:
DFF在時(shí)鐘的上升沿將D賦值給Q,在其它時(shí)刻Q保持不變。DFF也常常被稱為主從觸發(fā)器,邊沿觸發(fā)器,正邊沿觸發(fā)器。
4.????寄存器
將N個(gè)共享同一時(shí)鐘的DFF并聯(lián)即為N位寄存器,如圖:
5.????時(shí)序邏輯電路的時(shí)序
當(dāng)觸發(fā)器或寄存器在時(shí)鐘上升沿到達(dá)時(shí)將D的值賦給Q,這個(gè)過程稱之為采樣(sampling)。當(dāng)時(shí)鐘上升沿時(shí),如果D是0或者1的穩(wěn)定狀態(tài),那么Q也會(huì)輸出一個(gè)穩(wěn)定的對(duì)應(yīng)值。但如果運(yùn)氣不好,在時(shí)鐘上升沿,輸入D正處于變化狀態(tài)(比如一個(gè)0-1上升的過程中),那么Q的值將不確定。所以對(duì)于Latch和FF我們都有一個(gè)約束,即建立時(shí)間(setup time)和保持時(shí)間(hold time)。
即在時(shí)鐘上升沿到來之前Tsetup,輸入信號(hào)必須穩(wěn)定,且保持到上升沿到來之后Thold時(shí)刻。也就是在Tsetup和Thold時(shí)刻之間,必須確保輸入D保持穩(wěn)定,才能使Q采樣成功。
a)???觸發(fā)器的動(dòng)態(tài)規(guī)范(dynamic discipline)
同組合邏輯一樣,電子在任何電路元器件傳播均需要時(shí)間,在latch和FF中也不例外,如下圖所示。當(dāng)時(shí)鐘上升沿到來,采樣輸入值后,會(huì)經(jīng)過最短延遲Tccq(Time for ff Contamination Clk-to-Q delay),輸出才會(huì)發(fā)生變化,最遲在Tpcq(flip-flop PropagationClk-to-Q delay)之前穩(wěn)定下來。
b)???建立時(shí)間約束
以一個(gè)簡(jiǎn)單的時(shí)序邏輯電路(reg to reg)為例,如下圖所示:
數(shù)據(jù)從R1輸出的Q1開始,經(jīng)過一個(gè)未知的組合邏輯電路并輸出D2,進(jìn)入R2,其中R1和R2的CLK為同一時(shí)鐘且不考慮布線差異。
如以上時(shí)序圖所示,時(shí)鐘周期為Tc,在一個(gè)Cycle內(nèi),
我們首先看Q1:
Q1來自寄存器R1的輸出,所以Q1必定是不穩(wěn)定的,看5.a那張時(shí)序圖,Q1會(huì)在第一個(gè)CLK的上升沿到來后Tccq和Tpcq之間的某個(gè)時(shí)間穩(wěn)定下來,具體時(shí)間不知道也不重要,反正我們可以確定最遲Tpcq肯定是穩(wěn)定的。
隨后穩(wěn)定的Q1會(huì)進(jìn)入組合邏輯電路,最遲經(jīng)過Tpd時(shí)刻穩(wěn)定下來并輸出(不記得Tpd是什么的往前面翻翻,注意要區(qū)別于Tpcq),如果這個(gè)時(shí)刻處在第2個(gè)CLK上升沿Tsetup之前,那么第2個(gè)CLK就能夠順利采樣。
我們就稱這種情況為滿足建立時(shí)間約束。我們可以很容易得到一個(gè)等式:
在正常的數(shù)字電路系統(tǒng)設(shè)計(jì)中,系統(tǒng)時(shí)鐘周期通常由架構(gòu)師、市場(chǎng)部門決定(以確保產(chǎn)品有足夠的性能和競(jìng)爭(zhēng)力)?;蛘哂稍O(shè)計(jì)者本人確定,反正鍵盤在你手里,你是老大你說了算。Tpcq和Tsetup這是由制造工藝決定的,越先進(jìn)的制程則延遲越小(或者你是用fpga做產(chǎn)品,那么fpga的型號(hào)決定了這兩個(gè)時(shí)鐘參數(shù))。所以通常對(duì)于設(shè)計(jì)者來說,為了滿足建立時(shí)間,你能修改的或者說決定的只有Tpd,即組合邏輯電路的傳播延遲。所以我們可以將上述公式變換為:
括號(hào)內(nèi)的項(xiàng)Tpcq+Tsetup我們稱之為時(shí)序開銷,反正這是一個(gè)由制造工藝或者芯片型號(hào)決定的固定值。我們想要Tc更短(時(shí)鐘頻率更快),就要確保組合邏輯的傳播延遲不能太大。如果代碼是固定的(比如用的ip),組合邏輯的傳播延遲沒辦法縮減,那么就只能降低時(shí)鐘頻率(增大Tc)。
減少組合邏輯的傳播延遲主要辦法就是減少邏輯的關(guān)鍵路徑上的門電路的數(shù)量,如果是fpga的話就是減少lut的級(jí)聯(lián)級(jí)數(shù)。
c)???保持時(shí)間約束
同樣關(guān)注目的寄存器(destination)R2,R2采樣的輸入信號(hào)是D2,D2來自于經(jīng)過組合邏輯電路的Q1,Q1來自R1的輸出,且在Tccq之前都是穩(wěn)定的(即使R1的輸入變化導(dǎo)致Q1變化,最快也要等到Tccq之后,沒想明白的看5.a),在經(jīng)過組合邏輯電路之后,同理也會(huì)在Tcd之前保持穩(wěn)定,為了確保在Thold之間D2都是穩(wěn)定的, 會(huì)得到下列公式:
同樣Tccq和Thold都是由觸發(fā)器的制造工藝決定的,所以我們可以變化等式得到:
也就是組合邏輯的最小延遲Tcd的值。我們從公式可以發(fā)現(xiàn),滿足保持時(shí)間約束與系統(tǒng)時(shí)鐘周期無(wú)關(guān),僅與組合邏輯的最小延遲有關(guān)。
在實(shí)際電路中,我們有一種情況是2個(gè)觸發(fā)器直接級(jí)聯(lián),中間不經(jīng)過任何組合邏輯電路:
也就是Tcd=0,所以
換句話說就是一個(gè)可靠觸發(fā)器的保持時(shí)間必定要小于它的最小延遲時(shí)間。在實(shí)際的數(shù)字IC設(shè)計(jì)中,因?yàn)門cd=0這種情況都能滿足,那加了組合邏輯電路Tcd>0必定不會(huì)出現(xiàn)不滿足的情況。但是因?yàn)槲覀兊睦又袥]有考慮CLK的時(shí)鐘抖動(dòng),以及CLK時(shí)鐘同源但是布線長(zhǎng)度不同而導(dǎo)致的偏移,所以實(shí)際也會(huì)出現(xiàn)Tcd<0的情況。但是作為前端設(shè)計(jì)不會(huì)關(guān)注保持時(shí)中違例,而是在用工具生成時(shí)序分析報(bào)告后由后端通過插入Buffer來處理。在在FPGA設(shè)計(jì)中,時(shí)序分析會(huì)在綜合和實(shí)現(xiàn)兩個(gè)步驟分別產(chǎn)生,如果綜合的時(shí)序報(bào)告中有保持時(shí)間違例一般不做處理(如果違例太大就需要考慮提前進(jìn)行處理了),工具會(huì)在實(shí)現(xiàn)的布局布線階段自動(dòng)fix違例。如果布局布線后的時(shí)序報(bào)告依舊有保持時(shí)間違例,一般小于300ps的不做處理,因?yàn)楣ぞ哂?jì)算的時(shí)候往往是用最差策略來計(jì)算的。如果違例數(shù)值過于大的話,就要考慮修改代碼,或者通過ECO的方式修改時(shí)鐘BUFF位置,減少時(shí)鐘偏移。
編輯:黃飛
?
評(píng)論