零基礎(chǔ)學(xué)FPGA (二十五)必會! 從靜態(tài)時序分析到SDRAM時序收斂(下篇)
七、SDRAM工作時鐘相位偏移計算
本文引用地址:http://2s4d.com/article/279083.htm從上篇文章中我們知道,我們的數(shù)據(jù)是要經(jīng)過一定的延時才會到達目標(biāo)器件的,這個延時也就是相對于源寄存器的時鐘發(fā)射沿的時間延時,數(shù)據(jù)在源寄存器時鐘的上升沿到來時輸出,經(jīng)過FPGA的走線,PCB走線等,到達目標(biāo)寄存器的數(shù)據(jù)端口時會有一定的延時,而這個數(shù)據(jù)要想被目標(biāo)器件的目的寄存器鎖存,那么,目的寄存器的鎖存時鐘應(yīng)該盡量在數(shù)據(jù)的有效窗口內(nèi)才能確保數(shù)據(jù)被捕獲成功。所謂數(shù)據(jù)的有效窗口,就是數(shù)據(jù)在兩次變化之間的中間部分,也是數(shù)據(jù)最穩(wěn)定的部分。
所以,要想將數(shù)據(jù)正確捕獲,我們的SDRAM工作時鐘必須相對于源時鐘有一定的相位偏移,這個相位偏移是我們可以在PLL模塊中手動設(shè)置的,這個值應(yīng)該取多少?下面我們就來計算這個值。
這個相移值的計算,需要借助四個參數(shù),即讀周期最大滯后、超前時間,寫周期最大超前、滯后時間,下面依依來講
1、讀周期滯后時間
所謂讀周期滯后時間就是,SDRAM的工作時鐘相對于FPGA的工作時鐘慢了多少時間。我用一個圖來解釋
下面我來解釋一下這個圖,既然是讀周期,那么就是在SDRAM的工作時鐘下發(fā)出數(shù)據(jù),在FPGA的工作時鐘下捕獲數(shù)據(jù),由上圖可以看出,讀周期的滯后時間就是圖上的兩個參數(shù)相減對吧,在理論篇里我講過,SDRAM在發(fā)出一個數(shù)據(jù)之后,數(shù)據(jù)會保持一段時間的穩(wěn)定,這個參數(shù)就是Toh,這個參數(shù)可以查到。
數(shù)據(jù)發(fā)出后,需要被FPGA的工作時鐘捕獲,但是捕獲的時候需要考慮保持時間不能違規(guī),因此,Th這個參數(shù)就是FPGA的寄存器保持時間,這個參數(shù)我們需要從時序報告里查,等會我們再說,那么我們可以計算出
讀周期最大滯后時間 = Toh - FPGA的保持時間Th
2、讀周期超前時間
所謂超前時間,就是SDRAM的工作時鐘相對于FPGA的工作時鐘快了多少
看到這里,有些人可能就不明白了,SDRAM的時鐘比FPGA的時鐘相位快了還怎么捕獲數(shù)據(jù)咧?其實,我所說的快慢,只是說時鐘的上升沿誰在前而已,我們完全可以這么理解,就是數(shù)據(jù)是在SDRAM時鐘的前一個時鐘沿發(fā)出的,
上面的原圖是錯的,即SDRAM發(fā)出數(shù)據(jù)后,要經(jīng)過Thz的時間數(shù)據(jù)才會有效,這個時間也是可以查到的,即我們前面理論篇所講的參數(shù)那個參數(shù)TOH,注意這個TOH和上面的那個Toh是不一樣的。然后是FPGA的建立時間,我們從時序報告里查。那么,可以得到
讀周期最大超前時間 = Tclk - (TOH + FPGA的建立時間Tsu)
3、寫周期滯后時間
原圖也是錯誤的,既然是寫周期,那么就是在FPGA的工作時鐘下發(fā)數(shù)據(jù),在SDRAM的工作時鐘下捕獲數(shù)據(jù),那么源寄存器的工作時鐘上升沿到來時,數(shù)據(jù)發(fā)送,要等一段時間后,數(shù)據(jù)才會有效,這段時間應(yīng)該是FPGA寄存器的輸出延時時間,即圖上的Tcomax,這個參數(shù)我們需要到時序報告里找,Tss當(dāng)然就是SDRAM的建立時間了,所以我們可以得到
寫周期滯后時間 = Tclk - (Tcomax + SDRAM的建立時間Tsu)
4、 寫周期超前時間
這個圖可能剛開始理解起來不太好看,我用紅筆標(biāo)出來了,也就是說,這里的Tcomin參數(shù),是當(dāng)下的時鐘沿,到下一個數(shù)據(jù)有效的時間,而當(dāng)前的數(shù)據(jù),是上一個時鐘沿發(fā)出的。當(dāng)然,Toh即SDRAM鎖存數(shù)據(jù)的保持時間了,因此我們得到
寫周期最大超前時間 = Tcomin - Toh
5、參數(shù)計算
下面我們來找這些參數(shù),將上篇文章中的數(shù)據(jù)添加約束之后,執(zhí)行一次全編譯,當(dāng)然這個時候肯定是時序不收斂,不過沒關(guān)系,時序收不收斂跟我們的PFGA建立保持時間以及數(shù)據(jù)輸出時間是沒什么關(guān)系的。
我們先來看建立保持時間,由于建立保持時間是讀周期的參數(shù),因此,我們查看讀周期的路徑時序報告,也就是sdram_data路徑
我們右鍵,報告最糟糕路徑得到下圖
書上說的是,從左上方的數(shù)據(jù)到達路徑中可以得出
數(shù)據(jù)的建立時間 17.602 - 7.291 - 3.279 =7.032ns
即準(zhǔn)建立時間 - 發(fā)射沿相對時間 - 時鐘網(wǎng)絡(luò)延時的時間,其實單看這個公式是不好懂的,小墨當(dāng)時也不明白為什么建立時間是這么算的呢?后來我看了一下右面的圖,才漸漸明白過來,其實看右面的圖更容易理解一點
看了這個圖我們就會明白,當(dāng)17.602 減去那兩項之后,剩下的就是我們設(shè)置的最大輸入延時時間以及數(shù)據(jù)進入FPGA的走線延時時間,為什么這段時間是建立時間呢?我們之前不是定義數(shù)據(jù)不是應(yīng)該在建立時間內(nèi)保持穩(wěn)定嗎?但是這段時間內(nèi),數(shù)據(jù)還沒到啊。對,沒錯,好像是這樣的,數(shù)據(jù)沒到,為什么沒到呢?是因為我們的數(shù)據(jù)延時太長,以至于我們的捕獲時鐘在當(dāng)下的時鐘沿捕獲不到,因此,這就涉及到了多周期路徑約束的知識,我們可以讓捕獲周期為2 ,也就是說,等到下一鎖存沿到來的時候再把數(shù)據(jù)捕獲就好了。
我們再來看一下這兩段時間,第一段時間,也就是時鐘發(fā)射沿相對時間加上時鐘網(wǎng)絡(luò)延時的時間,其實這個時間就是SDRAM發(fā)出數(shù)據(jù),到數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上的時間
再回過頭去看一下我們分析讀周期之后時間的時候,數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上之后是不是直接被鎖存沿鎖存了?這樣說來就是沒有加上數(shù)據(jù)在PCB走線的延時,因此上圖只是一個理想過程,即沒有考慮PCB走線的延時,而我們的時序分析工具確實將其考慮在內(nèi)了,所以,我們的FPGA建立時間,除了包括數(shù)據(jù)保持穩(wěn)定的時間外,還應(yīng)加上這段走線延時的時間,這也就解釋了,為什么我們的建立時間是那么算的
這個過程是我自己的理解,不知道是不是準(zhǔn)確,覺得有問題的朋友請積極指正,謝謝
同理,我們用同樣的方法
算出保持時間為 4.122ns
下面再來看FPGA的輸出時間,這個過程就要看時序報告中的輸出路徑了,按照同樣的方法,我們找到輸出路徑的建立時間的時序報告
我們可以看到,這個很直觀,沒有像上面那個那么復(fù)雜
最大輸出延時為6.161ns,
同理,查看輸出路徑保持時間的時序報告
這個也比較直觀,用14.623 減去 10 就好了,為什么要減10呢?再來看這個圖
頭一個發(fā)射沿為0時刻的話,我們需要等一個時鐘周期后發(fā)射第二個沿,也即這里的數(shù)據(jù)到達時間14.623,是下一個數(shù)據(jù)的到達時間,減去10,不就是我們的最小輸出時間了么。
所以,我們的最小輸出時間為4.623ns
好了,所有的參數(shù)都有了,下面計算
讀周期最大滯后時間 = Toh - FPGA的保持時間Th = 2.7 - 4.122 = - 1.422ns
讀周期最大超前時間 = Tclk - (TOH + FPGA的建立時間Tsu) = 10 - (5.4 +7.032)=-2.432
寫周期最大滯后時間 = Tclk - (Tcomax + SDRAM的建立時間Tsu)
= 10 - (6.161 +1.5) = 2.339ns
寫周期最大超前時間 = Tcomin - Toh = 4.623 - 0.8 = 3.823ns
這樣,我們根據(jù)公式,取最小滯后時間為 - 1.422 最小超前時間為 -2.423
取二者平均值得 (-1.422 - 2.423 )/ 2 = - 1.9225
然后,還沒有完.... 時序分析這一塊就是這么麻煩...
我們現(xiàn)在考慮的,僅僅是考慮的是在SDRAM端口的時鐘延時,也就是說還沒有考慮SDRAM時鐘從PLL輸出,經(jīng)過FPGA內(nèi)部走線,和外部PCB的延時,我們想一下,是不是有一個這樣的關(guān)系
就是,PLL的時鐘偏移 + 時鐘從PLL輸出在FPGA內(nèi)部的延時 + 時鐘在外部PCB走線的延時 = SDRAM 端口的時鐘延時
而我們要手動添加的,就是PLL的時鐘偏移值。再者,上篇文章我們對虛擬時鐘SDRAM_CLK進行約束的時候,我們對他就行約束為最大值為3ns對吧, 時鐘從PLL輸出在FPGA內(nèi)部的延時就可以按我們所約束的最大值來計算,所以因此,我們計算
PLL的時鐘 偏移值 = -1.9225 - 3 - 0.1 = - 5.0225
換算成正值為 10 - 5.0225 = 4.9775
到此為止,我們的相位偏移才計算完畢,我們將它送給PLL
八、多周期約束
對其進行全編譯,查看時序報告,發(fā)現(xiàn)時序仍然不收斂
查看錯誤時序報告可以看到,我們沒有做多周期約束,至于為什么,上面已經(jīng)說過了,這里直接來做
我們設(shè)置延時周期數(shù)為2,即在第二個時鐘周期進行數(shù)據(jù)鎖存,因為是輸入路徑時序違規(guī),所以我們約束的多周期路徑就是從我們的虛擬時鐘,也就是SDRAM的工作時鐘,到我們FPGA的工作時鐘clk1
再執(zhí)行一次全編譯,所有的路徑達到時序收斂
當(dāng)然,除了這些,我們還需要一些時序上的優(yōu)化,以及一些微調(diào),要想達到系統(tǒng)的真正穩(wěn)定,光做這些還是不夠的,小墨也是在學(xué)習(xí)當(dāng)中,更深入的探究我只能說對于現(xiàn)在的我來說是力不從心了,有很多經(jīng)驗都是我們后續(xù)在不斷地摸索中獲得的,急也沒用,還是安心做好當(dāng)下,一步一個腳印,學(xué)無止境,我們永遠不能說自己學(xué)會了,只能說熟悉了,慢慢來吧~大家還需加油!
下面是我調(diào)好的板級測試圖,下面也會附有源代碼,不過下到你的板子上不一定跑的起來哦,大家還是自己親手算算這些參數(shù),等到板子真正跑起來的時候,你才會感受到那種成功的喜悅~
好了,SDRAM就寫到這吧,謝謝大家的支持~
fpga相關(guān)文章:fpga是什么
評論