FPGA時序約束2

上一篇已經簡單的介紹了時序,本文將會以一個ADC實例簡單粗暴的進行分析;


現有一塊ADC連接到FPGA上,需要在FPGA上實現高速數據的讀取,那麼第一步自然就是完成可靠的硬件連線,其中需要注意的是:

1. 注意信號的完整性,儘可能的避免邊沿退化;這兩區分兩個概念:

    i. 高速信號,指的是信號翻轉,由高電平到低電平或者反之所耗得時間非常小;可能一個1MHzTTL信號或者LVDS信號,只要邊沿足夠陡,那也算是高速信號!

    ii. 高頻信號,一般指的是週期性信號的週期時間足夠小;

    iii. 也就是說高速信號不一定是高頻的;數字信號一般都是高速信號,所以必須要保證其邊沿的完整性,如果邊沿發生退化或者變形,那麼將相當於加入了額外的時序上的偏差;

2. 保持時鐘信號和數據信號路徑等長,不管是單端還是差分信號,需要用繞線等形式迫使兩類線幾乎等長;這個在之前的時序分析中非常重要,如果真的不能夠做到等長,甚至差的還挺多的,也必須提前獲得該差值,並將則合成時間差,在後面的時序分析中將會有用;

保證以上兩點後,就可以着手時序的分析了,那麼首先我們會得到目標器件ADC的時序,如下圖所示:

 

 1 ADC的時序圖

從上圖中我們首先得到幾個信息:

1. 這是個同步時序,由兩類信號組成,時鐘信號DCO和數據信號FCO以及D(忽略它們是差分信號,下面的分析會把它畫成單端信號,簡化好畫一點)

2. 這是個DDR信號,DDR指的是數據是同步於時鍾信號的上升、下降邊沿,所以該類同步信號需要引入虛擬時鐘概念,後面繼續介紹;

3. 信號是不是邊沿對齊,而是偏移了90度!也就是說DCO邊沿翻轉後,數據信號沒有第一時間翻轉,而是延後了四分之一個週期,這是高速信號慣用的伎倆,後面會發現,這個延時讓時序更好分析;

FCO信號和D信號的實際意義扔一邊,在設計者看來,他們都僅僅是數據而已,將上面的時序圖簡化成下圖:

 

 2 簡化後的時序圖

可以看到,實際上所有的數據信號都是同步於DCO的邊沿,但是並不是對齊的,而是相差了90度,同時還是個DDR系統(上下邊沿都是Launch Edge

一般來說DDR系統會引入一個虛擬時鐘的概念,就是說DCO是實際存在的時鐘,設計和虛構出一個2倍頻的DCOX2時鐘,並將其相移180度以後,我們重新得到了下圖:

 

 3 引入虛擬時鐘後的數據時序圖

引入虛擬時鐘後,我們重新規劃Launch Edge,將其規劃到DCOX2-Shift180的上升沿,其所對應的的Latch Edge仍然還是在DCO上。

到目前爲止,我們已經很清楚的規劃了ADC的時鐘和數據輸出的關係,至於如何用SDC語言描述,見下文;接下來就要考慮到這些信號實際上是各自經過PCB走線後來到FPGA的引腳,從FPGA引腳由進入到FPGA內部,然後又經過各自的FPGA內部走線延時以後來到了他們目標的寄存器,如下圖所示:

 

 4 傻瓜化後的ADCFPGA的信號流向圖

從上圖可以獲知:

1. ADC內部看起來有一個源時鐘,這個源時鐘我們不用管怎麼產生,它分成了兩路,其中一路經過倍頻+移相後觸發了ADC上的REG0(就是說其上升沿作爲Launch Edge),另一路直接輸出到ADC引腳DCO

2. 數據由REG0產生後輸出至ADC引腳D,經過一個延時後來到FPGA的相應輸入引腳D`,與此同時,DCO引腳也經由PCB來到了FPGA的輸入引腳DCO`

3. 這兩個信號進入FPGA後,都各自分成了兩路,分別經過各自的延時來到其目標:

    a) DCO`引腳輸入後,進過TCLK2,來到了REG1clk引腳

    b) DCO`引腳輸入後,進過TCLK3,來到了REG2clk引腳

    c) D`引腳輸入後,進過Tdata2,來到了REG1D引腳

    d) D`引腳輸入後,進過Tdata3,來到了REG2D引腳

4. REG1REG2有所區別,一個是上升沿觸發,一個是下降沿觸發(clk前加了個小圈圈),這是因爲latch edge本來就是上升沿又有下降沿的;後期實際上也可以給DCO`也引入虛擬時鐘,這裏不表;

5. 不管是REG1還是REG2,想要鎖存latch數據就必須滿足建立時間和保持時間,這個在下文的圖中也有所體現;

說了那麼多,都不如實際的時序圖來的實際,下面放圖:

 

 5 實際時序分析

上圖由三個顏色的時序,分別是:

1. 紫色代表DAT,也就是數據到達時間,它由Tco(圖中沒有體現,可以參考手冊)、Tdata1Tdata2三者構成,是不是和我們的DAT定義不一樣?公式是死的,只需要理解其意思就可以。和公式相比少了Tclk(源時鐘到REG0clk的延時),是因爲我們不需要考慮這個延時,我們是根據ADC數據手冊的時序圖反推回裏面的結構圖,所以所有延時在反推的過程中已經都被體現或者被摺合!

2. 綠色夥同棕色線,表達出兩個意思DRTsuDRTh,分別代表數據建立所需時間和數據保持所需時間;

3. 將兩者按照定義做減法,就能夠得到建立時間裕量和保持時間裕量!

如上圖所示,棕色線所劃分的時間窗中,REG1.D已經是新的數據,而且在這個時間窗內並沒有變化,所以就同時滿足了建立時間裕量大於0和保持時間裕量大於0兩個關係,這樣的時序是穩定的!

但是這個只是圖示而已,所有的Tdata123以及Tclk123都是我們目前假設的,在實際進行約束時,那些量時需要設計者提前設定,而那些量是自動生成的那?答案是:

1. Tdata1Tclk1是由PCB實際佈線所決定的,如果能夠按照等長佈線規則,就能夠讓兩者相互抵消;

2. DCODCOX2-shift180的時序是由器件決定的;

3. Tdata23Tclk23FPGA在佈線時自動產生的!

所以說這裏我們只需要告訴FPGADCO`D`之間的時序關係就可以了,要獲得這兩者之間的時序關係,我們就必須獲得DCOD之間的原始關係,以及他們是如何被佈線延時變成DCO`D`的;如何去描述上面所說的這種關係呢?利用SDC文件!

也就是說SDC文件就是要準確的告訴FPGA,所有輸入(輸出先不管)信號在進入FPGA時會是個什麼樣子,然後根據這個信息,FPGA會自動佈線,使得REG1REG2能夠獲得正確的數據;如果萬一SDC文件所描述的時序關係非常的惡劣,將會導致不管FPGA怎麼優化佈線和佈局,都不能夠實現正確時時序時,就會輸出報錯,這個在以後的文章TimeQuest TA中會有詳細的分析;那麼接下來就開始寫SDC文件吧;


#設置各種延時常數

#這裏假設ADC片上的延時都爲0

    set ADC_CLKs_max 0

    set ADC_CLKs_min 0

    Set ADC_CLKd_max 0

    set ADC_CLKd_min 0

同時根據ADC手冊去設置Launch edge到有效數據之間的延時,這裏假設他爲X

    set ADC_tCO_max X

    set ADC_tCO_min X

#這裏設置時鐘信號和數據信號在PCB板上的延時差,即使是等長佈線,我們也要可以給

#定兩個值,這樣可以給FPGA佈線更多的壓力,使得後期佈線會往一個最理想的方向進行,

#分別是

    set ADC_BD_min XX

    set ADC_BD_max XX

 

 

#設置兩個時鐘,第一個時鐘爲DCO,它會從FPGADCO引腳輸入

#另一個時鐘是虛擬時鐘,根據設置,它是DCO的兩倍頻,而且有180度的相移

#這兩個時鐘之間是同步的,一個是很是存在的,另一個是虛擬的!

    create_clock -name DCO-period 5-waveform {1.25   3.75} [get_ports {DCO}]

    create_clock -name DCO_virtual-period 2.5 -waveform {0    1.25}

 

 

#最後將所有的數據引腳同步到DCO_virtual的上升沿,根據上面的延時常數設置輸入延時和

#輸出延時,這條語句非常關鍵,它告訴FPGA所有的輸入信號,在進入FPGA之前,相對於

#時鐘存在怎麼樣的關係!

    set_input_delay -clock DCO_virtual -max [expr $ADC_CLKs_max + $ADC_tCO_max + $ADC_BD_max - $ADC_CLKd_min] [get_ports {D*}]

    set_input_delay -clock DCO_virtual -min [expr $ADC_CLKs_min + $ADC_tCO_min + $ADC_BD_min - $ADC_CLKd_max] [get_ports {}D*}]

 

SDC文件解釋

1. 藍色底部分代表定義一些延時參數,這些延時參數都是根據實際的PCB佈線或者是ADC的書籍參數來設定的

2. 綠色底部分設定同步時鐘,如果有必要的話還要設置虛擬時鐘;

3. 紫色底部分將所有的輸入信號同步到時鐘,在這裏這個時鐘是虛擬時鐘,因爲我們假設虛擬時鐘的上升沿是launch edge,這裏其實可以也可以同步到DCO上,但就要設置下降沿同步,會顯得比較麻煩;但是一樣都是可以實現的!

通過上面的語句,FPGA就知道了,這些屬於信號之間的關係:DDCO之間的關係,DDCOX2-shift180(就是DCO_Virtual)之間關係;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章