零基礎(chǔ)學(xué)FPGA (二十四)必會! 從靜態(tài)時序分析到SDRAM時序收斂(上篇)
下面我們進(jìn)入正題,今天我們講時序
本文引用地址:http://www.ex-cimer.com/article/278905.htm一、從靜態(tài)時序分析說起
我理解的靜態(tài)時序分析,就是我們在不加激勵的情況下,通過對電路進(jìn)行時序的延遲計算,預(yù)計電路的工作流程,對電路提出我們需要的一些約束條件,比如我們需要從A寄存器到B寄存器的延遲不能大于10ns,如果我們不添加時序約束,綜合工具可能會有好幾條路徑,按照它自己的要求來布局布線,那么從A寄存器到B寄存器的時間就有可能是20ns或者15ns之類的路徑,而我們需要的是不能大于10ns,因此,我們需要添加時序約束,再根據(jù)特定的時序模型,使我們的系統(tǒng)達(dá)到設(shè)計要求。
這里的時間延遲可能包括我們的PCB板的走線延遲,也包括FPGA內(nèi)部的走線延遲,時鐘延遲等等,這里我們添加的時序約束,就相當(dāng)于我們在沒有下板之前,通過計算,來模擬仿真下板后的延遲情況,并通過時序報告查看有哪些違規(guī)路徑,以及建立保持時間不平衡的情況,通過時序優(yōu)化使其達(dá)到一個穩(wěn)定狀態(tài)的過程。
小墨在做SDRAM時序約束的時候深有體會,即使我們老老實實的按照時序計算公式將延時計算出來添加到工程中去,時序報告也顯示時序收斂并且也幾乎達(dá)到了建立保持時間的平衡狀態(tài),前后仿真也沒什么問題,以為一切就緒了,但是下板后就是跑不起來,最后我還是改動了一下約束參數(shù),有時候甚至改動幅度與計算幅度相比較大,當(dāng)然還是在保證時序收斂的情況下,下板之后竟然跑起來了,可能是我第一次接觸時序這個高大上的概念,經(jīng)驗不足吧,有的時候真是碰運(yùn)氣....當(dāng)然等會我將源碼共享的時候,大家還需要自己進(jìn)行時序約束,因為我們的FPGA芯片型號,PCB布局,SDRAM型號都不太一樣,那么跑起來是件很困難的事情,所以大家還需要自己親自學(xué)一下這部分的知識,自己去摸索。
我們直接來看這個圖,
?
要看懂這個圖,當(dāng)然還需要有一個模型
?
時序圖上的第一個時鐘,即我們的源時鐘,或者說是我們的晶振時鐘,從晶振到達(dá)源寄存器,這段路程肯定是有延遲的,我們把這段延遲叫做Tc2s,也即我們的clk1.
時序圖上的第二個時鐘,是我們的源時鐘到達(dá)目的寄存器的時鐘,即我們的鎖存寄存器的時鐘,它到目的寄存器的延遲,我們稱為Tc2d,也即我們的clk2
clk1 到達(dá)源寄存器的時候,將輸入的數(shù)據(jù)鎖存器到源寄存器,目的寄存器沒有鎖存值,等到第二個時鐘周期,clk2 到達(dá)目的寄存器的時候,將源寄存器的輸出數(shù)據(jù)鎖存,數(shù)據(jù)必須在clk2 到達(dá)之前保持穩(wěn)定,從數(shù)據(jù)到達(dá)目的寄存器到clk2到達(dá)這段時間,稱為建立時間,當(dāng)然,數(shù)據(jù)被鎖存之后,還需要保持穩(wěn)定一段時間,這段時間稱為保持時間。
從數(shù)據(jù)被源寄存器鎖存開始,到數(shù)據(jù)出現(xiàn)在目的寄存器的這段時間,我們稱為數(shù)據(jù)的傳輸時間Tco
我們做這樣一個考慮,如果Tco很長,也就是說,數(shù)據(jù)從被源寄存器捕獲,到出現(xiàn)在目的寄存器的延時時間較長,甚至長到clk2到達(dá)目的寄存器的時候還沒有到達(dá),那么,我們就說這段路徑,建立時間違規(guī),數(shù)據(jù)不能被正確捕獲,這時候,我們就可以給其添加約束,讓數(shù)據(jù)在多少納秒之內(nèi)到達(dá),保證數(shù)據(jù)被捕獲,然后綜合工具就會根據(jù)我們的要求,尋找最佳路徑,從而保證建立時間足夠長。
同理,假設(shè)Tco很短,短到clk2到來的時候,本來應(yīng)該被捕獲的數(shù)據(jù),還沒有保持一定的穩(wěn)定時間,就被下一個要捕獲的數(shù)據(jù)給覆蓋了,或者說我們捕獲到的是下一個要捕獲的數(shù)據(jù),從而造成保持時間違規(guī)
所以,Tco的時間既不能太長,也不能太短,必須在一個合理的范圍內(nèi),盡量讓目的寄存器的捕獲時鐘在數(shù)據(jù)的有效窗口內(nèi),所以,建立保持時間必須滿足下列公式,公式的由來完全來自于時序圖
?
其中,Tc2d - Tc2s叫做時鐘偏斜,這兩個公式,是我們下面分析SDRAM時序的兩個重要公式
再來看一下這兩個公式,既然我們要做時序分析,得要知道我們要分析的是哪一部分吧,Tclk我們無法改變,就是系統(tǒng)時鐘嘛,時鐘偏斜我們也改變不了,因為對于一個特定的FPGA器件,時鐘偏斜相對固定,所以我們可以改變的就是Tco,怎么改變呢,就是添加我們的時序約束,讓綜合工具按照我們的要求尋找符合我們約束的路徑,從而滿足建立保持時間的要求。
二、輸入輸出模型以及I/O約束
1、先來看輸出模型
?
當(dāng)然這個輸出模型并不是很符合我們的FPGA 和SDRAM的輸出模型,是我從網(wǎng)上找來的一張圖片,不過沒關(guān)系,做一下修改就好了。
我們的源時鐘需要進(jìn)入FPGA的PLL中,然后輸出給我們的FPGA做內(nèi)部時鐘,在輸出到外部做SDRAM的工作時鐘,所以上圖中,晶振到外部器件的時鐘路徑,應(yīng)該是PLL的輸出到SDRAM的輸出路徑
還有,我們之前做的靜態(tài)時序分析,是基于在FPGA內(nèi)部的,所以數(shù)據(jù)的延遲時間只有Tco一個參數(shù),然而,我們的這個輸出模型,是源寄存器在FPGA內(nèi)部,而目的寄存器在我們的SDRAM內(nèi)部,所以,我們的數(shù)據(jù)輸出路徑的延遲,還需要加上一部分,即我們的外部PCB走線延遲
這樣,我們的輸入延遲 = 數(shù)據(jù)在FPGA內(nèi)部傳輸延遲 Tco + 外部PCB走線延遲
帶入我們的靜態(tài)時序分析的建立時間公式得
Tco < Tclk - Tsu - 外部PCB延遲 + 時鐘偏斜
由于是輸出模型,所以,Tco即我們的約束部分,Tsu即SDRAM的建立時間,又因為,altera官方提供的資料,不用時鐘偏斜這一概念,用的是時鐘網(wǎng)絡(luò)延時,
即時鐘網(wǎng)絡(luò)延時 = - 時鐘偏斜,即 Tc2s - Tc2d
所以,我們得出輸出模型的一個最終公式
Tco < Tclk - Tsu - 外部PCB延遲 - 最大時鐘網(wǎng)絡(luò)延時
其中 Tsu + 外部PCB延遲 + 最大時鐘網(wǎng)絡(luò)延時 稱為最大輸出延時
也即 Tco < Tclk - 最大輸出延時
我們到時候給時序分析工具添加的,就是這個最大輸出延時,有人會問,為什么我們添加的不是 Tclk - 最大輸出延時,這個問題我之前也想過,我理解的就是,最大輸出延時是真實存在的,當(dāng)我們下板之后,這些延時會直接影響系統(tǒng)的,而Tclk確實固定的,因此,我們只需要算出最大輸出延時,其實Tco就已經(jīng)確定了,綜合工具會根據(jù)這個確定值尋找路徑
同理,我們根據(jù)靜態(tài)時序分析的公式算出最小輸出延時
即Tco + 外部PCB走線延遲 + 時鐘偏斜 > Th
即 Tco > Th - 外部PCB走線延時 + 最大時鐘網(wǎng)絡(luò)延時
其中,最小輸出延時 = Th - 外部PCB走線延時 + 最大時鐘網(wǎng)絡(luò)延時
即 Tco > 最小輸出延時
2、再來看輸入模型
?
輸入模型無非就是跟輸出模型相反罷了,原來FPGA作為輸出,現(xiàn)在作為輸入,還是要考慮我們之前靜態(tài)時序分析的時候推出的那兩個公式
即 Tclk + 時鐘偏斜 > Tco + 外部PCB走線延時 + Tsu
那么Tco + 外部PCB走線延時 + 時鐘網(wǎng)絡(luò)延時 < Tclk - Tsu,
小于號左邊就是我們的最大輸入延時 ,這里的Tco就不再是FPGA內(nèi)部的了,而是數(shù)據(jù)經(jīng)過SDRAM的延時了。Tclk就是FPGA的內(nèi)部時鐘了,Tsu當(dāng)然也是FPGA的建立時間。到了這個地方我就有點不懂了,既然是輸入延時,為什么不把FPGA的建立時間考慮在內(nèi)呢?要知道我們在推輸出延時的時候也是把SDRAM的建立時間考慮在內(nèi)了啊,為什么這里就不把FPGA的建立時間考慮在內(nèi)呢?
我是這么理解的,會不會是因為我們只需要算數(shù)據(jù)到FPGA引腳的延時就可以了,剩下的路徑,包括數(shù)據(jù)從FPGA引腳到數(shù)據(jù)被鎖存這段時間,也就是已經(jīng)包括了FPGA的建立時間在內(nèi)了的緣故,這段時間是綜合工具根據(jù)我們的輸入延時來分配路線的。
這個問題,希望看到的大神給個意見吧
當(dāng)然了,最小輸入延時也是根據(jù)那個公式求得
即Tco + 外部PCB走線延時 +時鐘網(wǎng)絡(luò)延時 > Th
即最小輸入延時 > Th
3、下面我們做一個總結(jié)
最大輸出延時 = 外部器件的Tsu + 外部PCB最大延遲 + 最大時鐘網(wǎng)絡(luò)延時
最小輸出延時 = 外部器件的Th - 外部最小PCB走線延時 + 最大時鐘網(wǎng)絡(luò)延時
最大輸入延時 = 外部器件最大Tco + 外部PCB最大走線延時 + 最大時鐘網(wǎng)絡(luò)延時
最小輸入延時 = 外部器件最小Tco + 外部PCB最小走線延時 + 最小時鐘網(wǎng)絡(luò)延時
下面再來解釋一下最大最小問題,看到這大家肯有點看不懂了,剛才還覺得可以,加了一些最大最小就看不懂了,其實我們要做的輸出,不僅僅是有一個引腳輸出,拿我們的SDRAM來說,有12根地址線,還有16根數(shù)據(jù)線還有其他的控制信號線要輸出,那么,我們應(yīng)該選其中最長的,或者最短的來考慮,只要最長的或者最短的滿足要求了,其他的自然也就滿足要求了,即我們用最壞的打算來考慮我們的約束路徑。
還有最大最小時鐘網(wǎng)絡(luò)延時,由于這里我們只有一跟時鐘線,就無所謂最大最小了,這么說就是為了規(guī)范
最大最小外部器件的Tco,數(shù)據(jù)經(jīng)過SDRAM的時候,并不是時間都是一樣的,總有些快慢問題,這里我們也取極限,就是數(shù)據(jù)經(jīng)過SDRAM的最大時間和最小時間,這個時間在datasheet里面是有參數(shù)的
細(xì)心的朋友可能會發(fā)現(xiàn) 最小輸出延時計算的時候,為什么是減去 最小PCB走線延時呢,為什么不是最大?為什么不是加上最大時鐘網(wǎng)絡(luò)延時呢?為什么不是最小?其實,時序分析工具分析的時候是按照一定的公式計算數(shù)據(jù)到達(dá)時間和數(shù)據(jù)需要時間的,這個公式見下圖
?
在計算保持時間余量,數(shù)據(jù)需要時間的時候,公式是減去 output minimum delay of pin
為什么是減去呢,按理說應(yīng)該是加上我們的輸出最小延時才對,小墨當(dāng)時也不理解,所以就當(dāng)是記住吧,也就是說
這里的 output minimum delay of pin = - 輸出最小延時
這樣理解的話,那么輸出最小延時越大,那么output minimum delay of pin 就越小了,也就是為什么是減去最小PCB延時的原因吧
后面我們到時序分析工具里面看時序報告圖的時候就會發(fā)現(xiàn),如果我們約束的最小輸出延時是負(fù)數(shù)的話,里面顯示的卻是正數(shù),所以,我們就暫時記住好了,因為真的是不好理解。
三、參數(shù)計算
根據(jù)我們剛才推斷出來的那幾個公式,我們就可以進(jìn)行參數(shù)計算了,先來看看我們需要什么參數(shù)
輸出模型的時候,我們需要的是SDRAM的建立時間,保持時間,外部PCB走線延時,輸入模型的時候,我們需要的是外部器件的最大最小Tco
SDRAM的建立保持時間可以從datasheet里面找到
?
根據(jù)器件型號,我們選擇建立時間為 1.5 ns ,保持時間為 0.8ns,外部PCB走線延時這個不怎么好算,只能估計吧,因為板子不是我畫的,長度也不知道,根據(jù)經(jīng)驗,我們知道,信號在PCB上的延時大概為0.18ns /1000mil,那我就估計為最大0.3ns,最小0.1好了
然后是時鐘網(wǎng)絡(luò)延時,也就是源時鐘到達(dá)源寄存器 - 到達(dá)目的寄存器的值,由于我們的時鐘是總PLL發(fā)出的,時鐘從FPGA管腳輸出后再送給SDRAM,因此這個值一定是負(fù)值,而且也是時鐘在PCB上的走線延時,這個值我們估算為-0.1ns好了,因為真的沒法算我覺得。
然后是數(shù)據(jù)經(jīng)過外部器件的最大最小延時,這個值我們在SDRAM的理論篇里面說了,就是Tac參數(shù)和Toh參數(shù),不懂得朋友可以到前面去補(bǔ)補(bǔ)課,這個值我們在datasheet里面也找得到
?
所以我們?nèi)∽畲骉co 為5.4ns 最小Tco為2.7ns
經(jīng)過計算得我們的約束參數(shù)
最大輸出延時 =外部器件的Tsu+外部PCB最大延遲+最大時鐘網(wǎng)絡(luò)延時
=1.5+0.3-0.1=1.7ns
最小輸出延時 = 外部器件的Th - 外部最小PCB走線延時 + 最大時鐘網(wǎng)絡(luò)延時
= -(0.8 - 0.1 - 0.1 ) = - 0.6ns
最大輸入延時 = 外部器件最大Tco + 外部PCB最大走線延時 + 最大時鐘網(wǎng)絡(luò)延時
= 5.4 + 0.3 - 0.1=5.6ns
最小輸入延時 = 外部器件最小Tco + 外部PCB最小走線延時 + 最小時鐘網(wǎng)絡(luò)延時
= 2.7 + 0.1 -0.1 = 2.7ns
四、全局時鐘約束
由于我們的時鐘是由晶振源傳到PLL,然后再由PLL輸出給SDRAM和FPGA內(nèi)部寄存器的,因此我們需要對輸入的時鐘進(jìn)行約束,約束其為50M的時鐘,并對應(yīng)好我們的端口時鐘clk,即約束我們的輸入時鐘為50M,并給這個時鐘取一個在時序分析時鐘的名字,即sys_clk,關(guān)于timequest的使用,大家還需自行學(xué)習(xí),這里僅僅只是說約束方法
?
而對于PLL輸出時鐘的約束,我們僅需在.sdc文件相應(yīng)的的位置,手動輸入約束即可,僅需要一條語句 ,這條命令輸進(jìn)去以后,時序分析工具會自動的為我們約束好PLL的輸出時鐘
?
我們可以通過查看時序報告,可以看到,我們的時鐘都跑到了我們約束的條件,如果我們不加這條語句的的話,那么PLL的輸出時鐘是達(dá)不到這個要求的,那樣的話,我們的時鐘都不穩(wěn)定,更別提系統(tǒng)穩(wěn)定性了
?
五、關(guān)于虛擬時鐘
上圖中,細(xì)心的朋友可能會看到,第一行有一個SDRAM_CLK,這個時鐘是怎么來的呢?這個時鐘,其實就是我們給外部的芯片模擬了一個時鐘,因為外部器件的時鐘是我們PLL生成,送到外部管腳去的,并不是我們FPGA的內(nèi)部時鐘,既然不是內(nèi)部時鐘,那么我們就無法對其進(jìn)行約束,我們只能定義這么一個虛擬的時鐘,來盡可能模擬SDRAM的工作時鐘。 例如,輸入的時候,源寄存器在SDRAM中,目的寄存器在FPGA中,數(shù)據(jù)的傳輸是在SDRAM工作時鐘下進(jìn)行的,但是時序分析工具不知道這個時鐘,所以我們定義一個虛擬時鐘,連接好它的路徑,即從哪輸出,輸?shù)侥?,這里的話就是從PLL的clk2輸出,到SDRAM的時鐘輸入引腳了。因為這里是時序約束模型為源同步時序模型,即時鐘都是由FPGA產(chǎn)生,在不是源同步時序模型的情況下,就不需要指明虛擬時鐘的源和目的,只需要指明周期即可。
?
既然是模擬,那我們也應(yīng)該考慮到這個時鐘從PLL輸出,到FPGA引腳的這段時間的延時,我們對其進(jìn)行最大,最小延時約束
?
同理,我們約束最小值為0ns,這里就不做演示了,方法是一樣的
六、I/O時序約束
由于篇幅所限,這里就不能一點點的做了,只舉個例子吧,做最大輸入延時的約束,我們點擊 constraints ———> set input delay
時鐘名字我們選的就是我們生成的虛擬時鐘,為什么呢?因為我們做的是IO約束,即FPGA和SDRAM互相交換數(shù)據(jù),既然交換數(shù)據(jù)肯定是建立在時鐘的基礎(chǔ)上的,這個時鐘,就是虛擬時鐘。這個地方比較難懂了,我理解的也不是太好。畢竟我們是要看得是時序報告,時序報告就是建立在虛擬時鐘的基礎(chǔ)上的一個模擬過程。先理解到這里吧,也不知道該怎么解釋了,還請看到的大神給指點一二吧~
下面我們做最大輸入延時的約束,設(shè)置我們最大的輸入延時為5.4ns
?
設(shè)置輸入路徑,因為只有SDRAM_data路徑是雙向的,做輸入的時候僅考慮這個路徑即可
?
然后我們再做一個輸出最大延時的約束,輸出最大延時為1.7ns ,輸出路徑包括除了時鐘和時鐘有效信號sdram_cke信號外的所有的SDRAM引腳,當(dāng)然也包括sdram_data信號,為什么不包括cke信號呢?因為cke信號自始至終沒有多少次的變化,也就是說對時序要求不嚴(yán)格,對于這種信號,類似還有片選信號,數(shù)碼管片選,位選等,我們只需對其進(jìn)行false路徑約束即可,即對時序沒有嚴(yán)格要求的路徑
?
?
剩下的路徑我就不再做了,都是一樣的,將所有路徑約束好之后,我們需要開始調(diào)sdram工作時鐘的相位偏移了
由于篇幅所限,剩下的內(nèi)容我放到下篇中講,謝謝大家~
fpga相關(guān)文章:fpga是什么
晶振相關(guān)文章:晶振原理
評論