FPGA設計系統時(shí)鐘的影響因素及其分析
時(shí)鐘是整個(gè)電路最重要、最特殊的信號,系統內大部分器件的動(dòng)作都是在時(shí)鐘的跳變沿上進(jìn)行, 這就要求時(shí)鐘信號時(shí)延差要非常小, 否則就可能造成時(shí)序邏輯狀態(tài)出錯;因而明確FPGA設計中決定系統時(shí)鐘的因素,盡量較小時(shí)鐘的延時(shí)對保證設計的穩定性有非常重要的意義。
本文引用地址:http://dyxdggzs.com/article/201706/349117.htm1.1 建立時(shí)間與保持時(shí)間
建立時(shí)間(Tsu:set up time)是指在時(shí)鐘沿到來(lái)之前數據從不穩定到穩定所需的時(shí)間,如果建立的時(shí)間不滿(mǎn)足要求那么數據將不能在這個(gè)時(shí)鐘上升沿被穩定的打入觸發(fā)器;保持時(shí)間(Th:hold time)是指數據穩定后保持的時(shí)間,如果保持時(shí)間不滿(mǎn)足要求那么數據同樣也不能被穩定的打入觸發(fā)器。建立與保持時(shí)間的簡(jiǎn)單示意圖如下圖1所示。
圖1 保持時(shí)間與建立時(shí)間的示意圖
在FPGA設計的同一個(gè)模塊中常常是包含組合邏輯與時(shí)序邏輯,為了保證在這些邏輯的接口處數據能穩定的被處理,那么對建立時(shí)間與保持時(shí)間建立清晰的概念非常重要。下面在認識了建立時(shí)間與保持時(shí)間的概念上思考如下的問(wèn)題。
圖2 同步設計中的一個(gè)基本模型
圖2為統一采用一個(gè)時(shí)鐘的同步設計中一個(gè)基本的模型。圖中Tco是觸發(fā)器的數據輸出的延時(shí);Tdelay是組合邏輯的延時(shí);Tsetup是觸發(fā)器的建立時(shí)間;Tpd為時(shí)鐘的延時(shí)。如果第一個(gè)觸發(fā)器D1建立時(shí)間最大為T(mén)1max,最小為T(mén)1min,組合邏輯的延時(shí)最大為T(mén)2max,最小為T(mén)2min。問(wèn)第二個(gè)觸發(fā)器D2立時(shí)間T3與保持時(shí)間T4應該滿(mǎn)足什么條件,或者是知道了T3與T4那么能容許的最大時(shí)鐘周期是多少。這個(gè)問(wèn)題是在設計中必須考慮的問(wèn)題,只有弄清了這個(gè)問(wèn)題才能保證所設計的組合邏輯的延時(shí)是否滿(mǎn)足了要求。
下面通過(guò)時(shí)序圖來(lái)分析:設第一個(gè)觸發(fā)器的輸入為D1,輸出為Q1,第二個(gè)觸發(fā)器的輸入為D2,輸出為Q2;
時(shí)鐘統一在上升沿進(jìn)行采樣,為了便于分析我們討論兩種情況即第一:假設時(shí)鐘的延時(shí)Tpd為零,其實(shí)這種情況在FPGA設計中是常常滿(mǎn)足的,由于在FPGA設計中一般是采用統一的系統時(shí)鐘,也就是利用從全局時(shí)鐘管腳輸入的時(shí)鐘,這樣在內部時(shí)鐘的延時(shí)完全可以忽略不計。這種情況下不必考慮保持時(shí)間,因為每個(gè)數據都是保持一個(gè)時(shí)鐘節拍同時(shí)又有線(xiàn)路的延時(shí),也就是都是基于CLOCK的延遲遠小于數據的延遲基礎上,所以保持時(shí)間都能滿(mǎn)足要求,重點(diǎn)是要關(guān)心建立時(shí)間,此時(shí)如果D2的建立時(shí)間滿(mǎn)足要求那么時(shí)序圖應該如圖3所示。
從圖中可以看出如果:
T-Tco-Tdelay>T3
即: Tdelay T-Tco-T3
那么就滿(mǎn)足了建立時(shí)間的要求,其中T為時(shí)鐘的周期,這種情況下第二個(gè)觸發(fā)器就能在第二個(gè)時(shí)鐘的升沿就能穩定的采到D2,時(shí)序圖如圖3所示。
圖3 符合要求的時(shí)序圖
如果組合邏輯的延時(shí)過(guò)大使得
T-Tco-Tdelay
那么將不滿(mǎn)足要求,第二個(gè)觸發(fā)器就在第二個(gè)時(shí)鐘的升沿將采到的是一個(gè)不定態(tài),如圖4所示。那么電路將不能正常的工作。
圖4 組合邏輯的延時(shí)過(guò)大時(shí)序不滿(mǎn)足要求
從而可以推出
T-Tco-T2max>=T3
這也就是要求的D2的建立時(shí)間。
從上面的時(shí)序圖中也可以看出,D2的建立時(shí)間與保持時(shí)間與D1的建立與保持時(shí)間是沒(méi)有關(guān)系的,而只和D2前面的組合邏輯和D1的數據傳輸延時(shí)有關(guān),這也是一個(gè)很重要的結論。說(shuō)明了延時(shí)沒(méi)有疊加效應。
第二種情況如果時(shí)鐘存在延時(shí),這種情況下就要考慮保持時(shí)間了,同時(shí)也需要考慮建立時(shí)間。時(shí)鐘出現較大的延時(shí)多是采用了異步時(shí)鐘的設計方法,這種方法較難保證數據的同步性,所以實(shí)際的設計中很少采用。此時(shí)如果建立時(shí)間與保持時(shí)間都滿(mǎn)足要求那么輸出的時(shí)序如圖5所示。
圖5 時(shí)鐘存在延時(shí)但滿(mǎn)足時(shí)序
從圖5中可以容易的看出對建立時(shí)間放寬了Tpd,所以D2的建立時(shí)間需滿(mǎn)足要求:
Tpd+T-Tco-T2max>=T3
由于建立時(shí)間與保持時(shí)間的和是穩定的一個(gè)時(shí)鐘周期,如果時(shí)鐘有延時(shí),同時(shí)數據的延時(shí)也較小那么建立時(shí)間必然是增大的,保持時(shí)間就會(huì )隨之減小,如果減小到不滿(mǎn)足D2的保持時(shí)間要求時(shí)就不能采集到正確的數據,如圖6所示。
這時(shí)即T-(Tpd-Tco-T2min)
T-(Tpd+T-Tco-T2min)>=T4 即Tco+T2min-Tpd>=T4
從上式也可以看出如果Tpd=0也就是時(shí)鐘的延時(shí)為0那么同樣是要求Tco+T2min>T4,但是在實(shí)際的應用中由于T2的延時(shí)也就是線(xiàn)路的延時(shí)遠遠大于觸發(fā)器的保持時(shí)間即T4所以不必要關(guān)系保持時(shí)間。
圖6 時(shí)鐘存在延時(shí)且保持時(shí)間不滿(mǎn)足要求
綜上所述,如果不考慮時(shí)鐘的延時(shí)那么只需關(guān)心建立時(shí)間,如果考慮時(shí)鐘的延時(shí)那么更需關(guān)心保持時(shí)間。下面將要分析在FPGA設計中如何提高同步系統中的工作時(shí)鐘。
1.2 如何提高同步系統中的工作時(shí)鐘
從上面的分析可以看出同步系統時(shí)對D2建立時(shí)間T3的要求為:
T-Tco-T2max>=T3
所以很容易推出T>=T3+Tco+T2max,其中T3為D2的建立時(shí)間Tset,T2為組合邏輯的延時(shí)。在一個(gè)設計中T3和Tco都是由器件決定的固定值,可控的也只有T2也就時(shí)輸入端組合邏輯的延時(shí),所以通過(guò)盡量來(lái)減小T2就可以提高系統的工作時(shí)鐘。為了達到減小T2在設計中可以用下面不同的幾種方法綜合來(lái)實(shí)現。
1.2.1 通過(guò)改變走線(xiàn)的方式來(lái)減小延時(shí)
以altera的器件為例,我們在quartus里面的timing closure floorplan可以看到有 很多條條塊塊,我們可以將條條塊塊按行和按列分,每一個(gè)條塊代表1個(gè)LAB,每個(gè)LAB里 有8個(gè)或者是10個(gè)LE。它們的走線(xiàn)時(shí)延的關(guān)系如下:同一個(gè)LAB中(最快) 同列或者同行 不同行且不同列。 我們通過(guò)給綜合器加適當的約束(約束要適量,一般以加5%裕量較為合適,比如電路 工作在100Mhz,則加約束加到105Mhz就可以了,過(guò)大的約束效果反而不好,且極大增加綜合時(shí)間)可以將相關(guān)的邏輯在布線(xiàn)時(shí)盡量布的靠近一點(diǎn),從而減少走線(xiàn)的時(shí)延。
1.2.2 通過(guò)拆分組合邏輯的方法來(lái)減小延時(shí)
由于一般同步電路都不止一級鎖存(如圖8),而要使電路穩定工作,時(shí)鐘周期必須滿(mǎn)足最大延時(shí)要求,縮短最長(cháng)延時(shí)路徑,才可提高電路的工作頻率。如圖7所示:我們可以將較大的組合邏輯分解為較小的幾塊,中間插入觸發(fā)器,這樣可以提高電路的工作頻率。這也是所謂“流水線(xiàn)”(pipelining)技術(shù)的基本原理。
對于圖8的上半部分,它時(shí)鐘頻率受制于第二個(gè)較大的組合邏輯的延時(shí),通過(guò)適當的方法平均分配組合邏輯,可以避免在兩個(gè)觸發(fā)器之間出現過(guò)大的延時(shí),消除速度瓶頸。
圖7 分割組合邏輯
圖8 轉移組合邏輯
那么在設計中如何拆分組合邏輯呢,更好的方法要在實(shí)踐中不斷的積累,但是一些良好的設計思想和方法也需要掌握。我們知道,目前大部分FPGA都基于4輸入LUT的,如果一個(gè)輸出對應的判斷條件大于四輸入的話(huà)就要由多個(gè)LUT級聯(lián)才能完成,這樣就引入一級組合邏輯時(shí)延,我們要減少組合邏輯,無(wú)非就是要輸入條件盡可能的少,這樣就可以級聯(lián)的LUT更少,從而減少了組合邏輯引起的時(shí)延。
我們平時(shí)聽(tīng)說(shuō)的流水就是一種通過(guò)切割大的組合邏輯(在其中插入一級或多級D觸發(fā)器,從而使寄存器與寄存器之間的組合邏輯減少)來(lái)提高工作頻率的方法。比如一個(gè)32 位的計數器,該計數器的進(jìn)位鏈很長(cháng),必然會(huì )降低工作頻率,我們可以將其分割成4位和 8位的計數,每當4位的計數器計到15后觸發(fā)一次8位的計數器,這樣就實(shí)現了計數器的切割,也提高了工作頻率。
在狀態(tài)機中,一般也要將大的計數器移到狀態(tài)機外,因為計數器這東西一般是經(jīng)常 是大于4輸入的,如果再和其它條件一起做為狀態(tài)的跳變判據的話(huà),必然會(huì )增加LUT的級 聯(lián),從而增大組合邏輯。以一個(gè)6輸入的計數器為例,我們原希望當計數器計到111100后 狀態(tài)跳變,現在我們將計數器放到狀態(tài)機外,當計數器計到111011后產(chǎn)生個(gè)enable信號 去觸發(fā)狀態(tài)跳變,這樣就將組合邏輯減少了。狀態(tài)機一般包含三個(gè)模塊,一個(gè)輸出模塊,一個(gè)決定下個(gè)狀態(tài)是什么的模塊和一個(gè)保存當前狀態(tài)的模塊。組成三個(gè)模塊所采用的邏輯也各不相同。輸出模塊通常既包含組合邏輯又包含時(shí)序邏輯;決定下一個(gè)狀態(tài)是什么的模塊通常又組合邏輯構成;保存現在狀態(tài)的通常由時(shí)序邏輯構成。三個(gè)模塊的關(guān)系如下圖9所示。
圖9 狀態(tài)機的組成
所有通常寫(xiě)狀態(tài)機時(shí)也按照這三個(gè)模塊將狀態(tài)機分成三部分來(lái)寫(xiě),如下面就是一種良好的狀態(tài)機設計方法:
/*-----------------------------------------------------
This is FSM demo program
Design Name : arbiter
File Name : arbiter2.v
-----------------------------------------------------*/
module arbiter2 (
clock , // clock
reset , // Active high, syn reset
req_0 , // Request 0
req_1 , // Request 1
gnt_0 ,
gnt_1);
//-------------Input Ports-----------------------------
input clock ;
input reset ;
input req_0 ;
input req_1 ;
//-------------Output Ports----------------------------
output gnt_0 ;
output gnt_1 ;
//-------------Input ports Data Type-------------------
wire clock ;
wire reset ;
wire req_0 ;
wire req_1 ;
//-------------Output Ports Data Type------------------
reg gnt_0 ;
reg gnt_1 ;
//-------------Internal Constants--------------------------
parameter SIZE = 3 ;
parameter IDLE = 3‘b001 ,
GNT0 = 3’b010 ,
GNT1 = 3‘b100 ;
//-------------Internal Variables---------------------------
reg [SIZE-1:0] state ;// Seq part of the FSM
wire [SIZE-1:0] next_state ;// combo part of FSM
//----------Code startes Here------------------------
assign next_state = fsm_function(req_0, req_1);
function [SIZE-1:0] fsm_function;
input req_0;
input req_1;
case(state)
IDLE : if (req_0 == 1’b1)
fsm_function = GNT0;
else if (req_1 == 1‘b1)
fsm_function= GNT1;
else
fsm_function = IDLE;
GNT0 : if (req_0 == 1’b1)
fsm_function = GNT0;
else
fsm_function = IDLE;
GNT1 : if (req_1 == 1‘b1)
fsm_function = GNT1;
else
fsm_function =IDLE;
default : fsm_function = IDLE;
endcase
endfunction
always@(posedge clock)
begin
if (reset == 1’b1)
state =IDLE;
else
state =next_state;
end
//----------Output Logic-----------------------------
always @ (posedge clock)
begin
if (reset == 1‘b1) begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b0;
end
else begin
case(state)
IDLE : begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b0;
end
GNT0 : begin
gnt_0 = #1 1’b1;
gnt_1 = #1 1‘b0;
end
GNT1 : begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b1;
end
default : begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b0;
end
endcase
end
end // End Of Block OUTPUT_
endmodule
狀態(tài)機通常要寫(xiě)成3段式,從而避免出現過(guò)大的組合邏輯。
上面說(shuō)的都是可以通過(guò)流水的方式切割組合邏輯的情況,但是有些情況下我們是很 難去切割組合邏輯的,在這些情況下我們又該怎么做呢?
狀態(tài)機就是這么一個(gè)例子,我們不能通過(guò)往狀態(tài)譯碼組合邏輯中加入流水。如果我 們的設計中有一個(gè)幾十個(gè)狀態(tài)的狀態(tài)機,它的狀態(tài)譯碼邏輯將非常之巨大,毫無(wú)疑問(wèn), 這極有可能是設計中的關(guān)鍵路徑。那我們該怎么做呢?還是老思路,減少組合邏輯。我 們可以對狀態(tài)的輸出進(jìn)行分析,對它們進(jìn)行重新分類(lèi),并根據這個(gè)重新定義成一組組小 狀態(tài)機,通過(guò)對輸入進(jìn)行選擇(case語(yǔ)句)并去觸發(fā)相應的小狀態(tài)機,從而實(shí)現了將大的 狀態(tài)機切割成小的狀態(tài)機。在A(yíng)TA6的規范中(硬盤(pán)的標準),輸入的命令大概有20十種 ,每一個(gè)命令又對應很多種狀態(tài),如果用一個(gè)大的狀態(tài)機(狀態(tài)套狀態(tài))去做那是不可想象的,我們可以通過(guò)case語(yǔ)句去對命令進(jìn)行譯碼,并觸發(fā)相應的狀態(tài)機,這樣做下來(lái) 這一個(gè)模塊的頻率就可以跑得比較高了。
總結:提高工作頻率的本質(zhì)就是要減少寄存器到寄存器的時(shí)延,最有效的方法就是 避免出現大的組合邏輯,也就是要盡量去滿(mǎn)足四輸入的條件,減少LUT級聯(lián)的數量。我們 可以通過(guò)加約束、流水、切割狀態(tài)的方法提高工作頻率。
在FPGA中進(jìn)行時(shí)鐘設計時(shí)也要注意一下幾點(diǎn):
一個(gè)模塊盡量只用一個(gè)時(shí)鐘,這里的一個(gè)模塊是指一個(gè)module或者是一個(gè)entity。在多時(shí)鐘域的設計中涉及到跨時(shí)鐘域的設計中最好有專(zhuān)門(mén)一個(gè)模塊做時(shí)鐘域的隔 離。這樣做可以讓綜合器綜合出更優(yōu)的結果。
除非是低功耗設計,不然不要用門(mén)控時(shí)鐘--這會(huì )增加設計的不穩定性,在要用到門(mén)控時(shí)鐘的地方,也要將門(mén)控信號用時(shí)鐘的下降沿 打一拍再輸出與時(shí)鐘相與。
禁止用計數器分頻后的信號做其它模塊的時(shí)鐘,而要用改成時(shí)鐘使能的方式,否則這種時(shí)鐘滿(mǎn)天飛的方式對設計的可靠性極為不利,也大大增加了靜態(tài)時(shí)序分析的復雜性。
1.4 不同時(shí)鐘域之間的同步
當一個(gè)設計中的兩個(gè)模塊分別用的是兩個(gè)工作時(shí)鐘,那么在它們的接口處就工作在異步模式,這時(shí)為了保證數據能正確的處理那么就要對兩個(gè)模塊進(jìn)行同步。
這里的不同的時(shí)鐘域通常是以下的兩種情況:
1、 兩個(gè)時(shí)鐘的頻率不同;
2、 雖然兩個(gè)時(shí)鐘的頻率相同,但是它們是兩個(gè)獨立的時(shí)鐘,其相位沒(méi)有任何關(guān)系。
分別如下兩個(gè)圖所示:
圖10 兩個(gè)時(shí)鐘的頻率完全不同
圖11兩個(gè)時(shí)鐘的頻率相同,但相位不相關(guān)
兩個(gè)時(shí)鐘域之間傳輸的數據根據不同的位寬通常采用不同的同步的方法。
1、單bit之間的同步且發(fā)送的每個(gè)pulse至少有1個(gè)周期寬度的情況
這類(lèi)同步主要是用于一些控制信號自己的同步。通常的采用方法就是輸出數據在接收的模塊中利用兩個(gè)觸發(fā)器采用系統時(shí)鐘打兩拍,如下圖12所示。對于這種同步需要說(shuō)明以下幾點(diǎn)。
圖12 一位同步器設計
?。?)圖12中的同步電路其實(shí)叫“一位同步器”,它只能用來(lái)對一位異步信號進(jìn)行同步,而且這個(gè)信號的寬度必須大于本級時(shí)鐘的脈沖寬度,否則有可能根本采不到這個(gè)異步信號。
?。?)為什么圖一中的同步電路只能用來(lái)對一位異步信號進(jìn)行同步呢? (a)當有兩個(gè)或更多的異步信號(控制或地址)同時(shí)進(jìn)入本時(shí)域來(lái)控制本時(shí)域的電路時(shí),如果這些信號分別都用圖12中的同步電路來(lái)同步就會(huì )出現問(wèn)題,由于連線(xiàn)延遲或其他延遲使兩個(gè)或更多的異步信號(控制或地址)之間產(chǎn)生了skew,那么這個(gè)skew經(jīng)過(guò)圖12的同步器同步進(jìn)入本時(shí)域后,會(huì )產(chǎn)生很大的skew或產(chǎn)生競爭,導致本時(shí)域電路出錯。
出現的問(wèn)題如下圖13所示:
圖13 同步多個(gè)控制信號時(shí)出錯
?。╞)如果是異步數據總線(xiàn)要進(jìn)入本時(shí)域,同樣不能用圖12的電路,因為數據的變化是很隨機的,其0的寬度或1的寬度和本時(shí)域時(shí)鐘脈沖無(wú)關(guān),所以圖12的電路可能會(huì )采不到正確數據。
?。?)注意,第二個(gè)觸發(fā)器并不是避免“亞穩態(tài)的發(fā)生”,確切的說(shuō),該電路能夠防止亞穩態(tài)的傳播。也就是說(shuō),一旦第一個(gè)觸發(fā)器發(fā)生了亞穩態(tài)(可能性存在),由于有了第二個(gè)
觸發(fā)器,亞穩態(tài)不會(huì )傳播到第二個(gè)觸發(fā)器以后的電路中去。
?。?)第一級觸發(fā)器發(fā)生了亞穩態(tài),需要一個(gè)恢復時(shí)間來(lái)穩定下來(lái),或者叫退出亞穩態(tài)。當恢復時(shí)間加上第二級觸發(fā)器的建立時(shí)間(更精確的,還要減去clock skew)小于等于時(shí)鐘周期的時(shí)候(這個(gè)條件還是很容易滿(mǎn)足的,一般要求兩級觸發(fā)器盡量接近,中間沒(méi)有任何組合邏輯,時(shí)鐘的skew較?。?,第二級觸發(fā)器就可以穩定的采樣,得到穩定的確定的數據了,防止了亞穩態(tài)的傳播。
?。?)FF2是采樣了FF1的輸出,當然是FF1輸出什么,FF2就輸出什么。僅僅延遲了1個(gè)周期。注意,亞穩態(tài)之所以叫做亞穩態(tài),是指一旦FF1進(jìn)入,其輸出電平不定,可能正確也可能錯誤。所以必須說(shuō)明的是,雖然這種方法可以防止亞穩態(tài)的傳播,但是并不能保證兩級觸發(fā)器之后的數據是正確的,因此,這種電路都有一定數量的錯誤電平數據,所以,僅適用于少量對于錯誤不敏感的地方。對于敏感的電路,可以采用雙口RAM或FIFO。
2 輸入pulse有可能小于一個(gè)時(shí)鐘周期寬度情況下的同步電路
對2的情況通常采用如下圖14的反饋電路。該電路的分析如下:假設輸入的數據是高電平,那么由于第一個(gè)觸發(fā)器FF1是高電平清零,所有輸出也是高電平,采用正確。如果輸入是第電平那么被FF1被強制清零,這個(gè)時(shí)候輸出位零。這樣就保證了輸出的正確性。
圖14輸入pulse有可能小于一個(gè)時(shí)鐘周期寬度情況下的同步電路
評論