新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > 零基礎(chǔ)學(xué)FPGA (二十五)必會(huì)! 從靜態(tài)時(shí)序分析到SDRAM時(shí)序收斂(下篇)

零基礎(chǔ)學(xué)FPGA (二十五)必會(huì)! 從靜態(tài)時(shí)序分析到SDRAM時(shí)序收斂(下篇)

—— 零基礎(chǔ)學(xué)FPGA (二十四)必會(huì)! 從靜態(tài)時(shí)序分析到SDRAM時(shí)序收斂(下篇)
作者: 時(shí)間:2015-08-21 來(lái)源:網(wǎng)絡(luò) 收藏

 七、工作時(shí)鐘相位偏移計(jì)算

本文引用地址:http://m.butianyuan.cn/article/279083.htm

  從上篇文章中我們知道,我們的數(shù)據(jù)是要經(jīng)過(guò)一定的延時(shí)才會(huì)到達(dá)目標(biāo)器件的,這個(gè)延時(shí)也就是相對(duì)于源寄存器的時(shí)鐘發(fā)射沿的時(shí)間延時(shí),數(shù)據(jù)在源寄存器時(shí)鐘的上升沿到來(lái)時(shí)輸出,經(jīng)過(guò)FPGA的走線,PCB走線等,到達(dá)目標(biāo)寄存器的數(shù)據(jù)端口時(shí)會(huì)有一定的延時(shí),而這個(gè)數(shù)據(jù)要想被目標(biāo)器件的目的寄存器鎖存,那么,目的寄存器的鎖存時(shí)鐘應(yīng)該盡量在數(shù)據(jù)的有效窗口內(nèi)才能確保數(shù)據(jù)被捕獲成功。所謂數(shù)據(jù)的有效窗口,就是數(shù)據(jù)在兩次變化之間的中間部分,也是數(shù)據(jù)最穩(wěn)定的部分。

  所以,要想將數(shù)據(jù)正確捕獲,我們的工作時(shí)鐘必須相對(duì)于源時(shí)鐘有一定的相位偏移,這個(gè)相位偏移是我們可以在PLL模塊中手動(dòng)設(shè)置的,這個(gè)值應(yīng)該取多少?下面我們就來(lái)計(jì)算這個(gè)值。

  這個(gè)相移值的計(jì)算,需要借助四個(gè)參數(shù),即讀周期最大滯后、超前時(shí)間,寫周期最大超前、滯后時(shí)間,下面依依來(lái)講

  1、讀周期滯后時(shí)間

  所謂讀周期滯后時(shí)間就是,的工作時(shí)鐘相對(duì)于FPGA的工作時(shí)鐘慢了多少時(shí)間。我用一個(gè)圖來(lái)解釋


360桌面截圖20150330165516.jpg


  下面我來(lái)解釋一下這個(gè)圖,既然是讀周期,那么就是在SDRAM的工作時(shí)鐘下發(fā)出數(shù)據(jù),在FPGA的工作時(shí)鐘下捕獲數(shù)據(jù),由上圖可以看出,讀周期的滯后時(shí)間就是圖上的兩個(gè)參數(shù)相減對(duì)吧,在理論篇里我講過(guò),SDRAM在發(fā)出一個(gè)數(shù)據(jù)之后,數(shù)據(jù)會(huì)保持一段時(shí)間的穩(wěn)定,這個(gè)參數(shù)就是Toh,這個(gè)參數(shù)可以查到。

  數(shù)據(jù)發(fā)出后,需要被FPGA的工作時(shí)鐘捕獲,但是捕獲的時(shí)候需要考慮保持時(shí)間不能違規(guī),因此,Th這個(gè)參數(shù)就是FPGA的寄存器保持時(shí)間,這個(gè)參數(shù)我們需要從時(shí)序報(bào)告里查,等會(huì)我們?cè)僬f(shuō),那么我們可以計(jì)算出

  讀周期最大滯后時(shí)間 = Toh - FPGA的保持時(shí)間Th

  2、讀周期超前時(shí)間

  所謂超前時(shí)間,就是SDRAM的工作時(shí)鐘相對(duì)于FPGA的工作時(shí)鐘快了多少


360桌面截圖20150330170536.jpg


  看到這里,有些人可能就不明白了,SDRAM的時(shí)鐘比FPGA的時(shí)鐘相位快了還怎么捕獲數(shù)據(jù)咧?其實(shí),我所說(shuō)的快慢,只是說(shuō)時(shí)鐘的上升沿誰(shuí)在前而已,我們完全可以這么理解,就是數(shù)據(jù)是在SDRAM時(shí)鐘的前一個(gè)時(shí)鐘沿發(fā)出的,

  上面的原圖是錯(cuò)的,即SDRAM發(fā)出數(shù)據(jù)后,要經(jīng)過(guò)Thz的時(shí)間數(shù)據(jù)才會(huì)有效,這個(gè)時(shí)間也是可以查到的,即我們前面理論篇所講的參數(shù)那個(gè)參數(shù)TOH,注意這個(gè)TOH和上面的那個(gè)Toh是不一樣的。然后是FPGA的建立時(shí)間,我們從時(shí)序報(bào)告里查。那么,可以得到

  讀周期最大超前時(shí)間 = Tclk - (TOH + FPGA的建立時(shí)間Tsu)

  3、寫周期滯后時(shí)間


360桌面截圖20150330172401.jpg


  原圖也是錯(cuò)誤的,既然是寫周期,那么就是在FPGA的工作時(shí)鐘下發(fā)數(shù)據(jù),在SDRAM的工作時(shí)鐘下捕獲數(shù)據(jù),那么源寄存器的工作時(shí)鐘上升沿到來(lái)時(shí),數(shù)據(jù)發(fā)送,要等一段時(shí)間后,數(shù)據(jù)才會(huì)有效,這段時(shí)間應(yīng)該是FPGA寄存器的輸出延時(shí)時(shí)間,即圖上的Tcomax,這個(gè)參數(shù)我們需要到時(shí)序報(bào)告里找,Tss當(dāng)然就是SDRAM的建立時(shí)間了,所以我們可以得到

  寫周期滯后時(shí)間 = Tclk - (Tcomax + SDRAM的建立時(shí)間Tsu)

  4、 寫周期超前時(shí)間


360桌面截圖20150330174043.jpg


  這個(gè)圖可能剛開始理解起來(lái)不太好看,我用紅筆標(biāo)出來(lái)了,也就是說(shuō),這里的Tcomin參數(shù),是當(dāng)下的時(shí)鐘沿,到下一個(gè)數(shù)據(jù)有效的時(shí)間,而當(dāng)前的數(shù)據(jù),是上一個(gè)時(shí)鐘沿發(fā)出的。當(dāng)然,Toh即SDRAM鎖存數(shù)據(jù)的保持時(shí)間了,因此我們得到

  寫周期最大超前時(shí)間 = Tcomin - Toh

  5、參數(shù)計(jì)算

  下面我們來(lái)找這些參數(shù),將上篇文章中的數(shù)據(jù)添加約束之后,執(zhí)行一次全編譯,當(dāng)然這個(gè)時(shí)候肯定是時(shí)序不收斂,不過(guò)沒關(guān)系,時(shí)序收不收斂跟我們的PFGA建立保持時(shí)間以及數(shù)據(jù)輸出時(shí)間是沒什么關(guān)系的。

  我們先來(lái)看建立保持時(shí)間,由于建立保持時(shí)間是讀周期的參數(shù),因此,我們查看讀周期的路徑時(shí)序報(bào)告,也就是sdram_data路徑


360桌面截圖20150330183710.jpg


  我們右鍵,報(bào)告最糟糕路徑得到下圖


360桌面截圖20150330184102.jpg


  書上說(shuō)的是,從左上方的數(shù)據(jù)到達(dá)路徑中可以得出

  數(shù)據(jù)的建立時(shí)間 17.602 - 7.291 - 3.279 =7.032ns

  即準(zhǔn)建立時(shí)間 - 發(fā)射沿相對(duì)時(shí)間 - 時(shí)鐘網(wǎng)絡(luò)延時(shí)的時(shí)間,其實(shí)單看這個(gè)公式是不好懂的,小墨當(dāng)時(shí)也不明白為什么建立時(shí)間是這么算的呢?后來(lái)我看了一下右面的圖,才漸漸明白過(guò)來(lái),其實(shí)看右面的圖更容易理解一點(diǎn)


360桌面截圖20150330190322.jpg


  看了這個(gè)圖我們就會(huì)明白,當(dāng)17.602 減去那兩項(xiàng)之后,剩下的就是我們?cè)O(shè)置的最大輸入延時(shí)時(shí)間以及數(shù)據(jù)進(jìn)入FPGA的走線延時(shí)時(shí)間,為什么這段時(shí)間是建立時(shí)間呢?我們之前不是定義數(shù)據(jù)不是應(yīng)該在建立時(shí)間內(nèi)保持穩(wěn)定嗎?但是這段時(shí)間內(nèi),數(shù)據(jù)還沒到啊。對(duì),沒錯(cuò),好像是這樣的,數(shù)據(jù)沒到,為什么沒到呢?是因?yàn)槲覀兊臄?shù)據(jù)延時(shí)太長(zhǎng),以至于我們的捕獲時(shí)鐘在當(dāng)下的時(shí)鐘沿捕獲不到,因此,這就涉及到了多周期路徑約束的知識(shí),我們可以讓捕獲周期為2 ,也就是說(shuō),等到下一鎖存沿到來(lái)的時(shí)候再把數(shù)據(jù)捕獲就好了。

  我們?cè)賮?lái)看一下這兩段時(shí)間,第一段時(shí)間,也就是時(shí)鐘發(fā)射沿相對(duì)時(shí)間加上時(shí)鐘網(wǎng)絡(luò)延時(shí)的時(shí)間,其實(shí)這個(gè)時(shí)間就是SDRAM發(fā)出數(shù)據(jù),到數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上的時(shí)間


360桌面截圖20150330170536.jpg


  再回過(guò)頭去看一下我們分析讀周期之后時(shí)間的時(shí)候,數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上之后是不是直接被鎖存沿鎖存了?這樣說(shuō)來(lái)就是沒有加上數(shù)據(jù)在PCB走線的延時(shí),因此上圖只是一個(gè)理想過(guò)程,即沒有考慮PCB走線的延時(shí),而我們的時(shí)序分析工具確實(shí)將其考慮在內(nèi)了,所以,我們的FPGA建立時(shí)間,除了包括數(shù)據(jù)保持穩(wěn)定的時(shí)間外,還應(yīng)加上這段走線延時(shí)的時(shí)間,這也就解釋了,為什么我們的建立時(shí)間是那么算的

  這個(gè)過(guò)程是我自己的理解,不知道是不是準(zhǔn)確,覺得有問(wèn)題的朋友請(qǐng)積極指正,謝謝

  同理,我們用同樣的方法

  算出保持時(shí)間為 4.122ns

  下面再來(lái)看FPGA的輸出時(shí)間,這個(gè)過(guò)程就要看時(shí)序報(bào)告中的輸出路徑了,按照同樣的方法,我們找到輸出路徑的建立時(shí)間的時(shí)序報(bào)告


360桌面截圖20150330194752.jpg


  我們可以看到,這個(gè)很直觀,沒有像上面那個(gè)那么復(fù)雜

  最大輸出延時(shí)為6.161ns,

  同理,查看輸出路徑保持時(shí)間的時(shí)序報(bào)告


360桌面截圖20150330195412.jpg


  這個(gè)也比較直觀,用14.623 減去 10 就好了,為什么要減10呢?再來(lái)看這個(gè)圖


360桌面截圖20150330174043.jpg


  頭一個(gè)發(fā)射沿為0時(shí)刻的話,我們需要等一個(gè)時(shí)鐘周期后發(fā)射第二個(gè)沿,也即這里的數(shù)據(jù)到達(dá)時(shí)間14.623,是下一個(gè)數(shù)據(jù)的到達(dá)時(shí)間,減去10,不就是我們的最小輸出時(shí)間了么。

  所以,我們的最小輸出時(shí)間為4.623ns

  好了,所有的參數(shù)都有了,下面計(jì)算

  讀周期最大滯后時(shí)間 = Toh - FPGA的保持時(shí)間Th = 2.7 - 4.122 = - 1.422ns

  讀周期最大超前時(shí)間 = Tclk - (TOH + FPGA的建立時(shí)間Tsu) = 10 - (5.4 +7.032)=-2.432

  寫周期最大滯后時(shí)間 = Tclk - (Tcomax + SDRAM的建立時(shí)間Tsu)

  = 10 - (6.161 +1.5) = 2.339ns

  寫周期最大超前時(shí)間 = Tcomin - Toh = 4.623 - 0.8 = 3.823ns

  這樣,我們根據(jù)公式,取最小滯后時(shí)間為 - 1.422 最小超前時(shí)間為 -2.423

  取二者平均值得 (-1.422 - 2.423 )/ 2 = - 1.9225

  然后,還沒有完.... 時(shí)序分析這一塊就是這么麻煩...

  我們現(xiàn)在考慮的,僅僅是考慮的是在SDRAM端口的時(shí)鐘延時(shí),也就是說(shuō)還沒有考慮SDRAM時(shí)鐘從PLL輸出,經(jīng)過(guò)FPGA內(nèi)部走線,和外部PCB的延時(shí),我們想一下,是不是有一個(gè)這樣的關(guān)系

  就是,PLL的時(shí)鐘偏移 + 時(shí)鐘從PLL輸出在FPGA內(nèi)部的延時(shí) + 時(shí)鐘在外部PCB走線的延時(shí) = SDRAM 端口的時(shí)鐘延時(shí)

  而我們要手動(dòng)添加的,就是PLL的時(shí)鐘偏移值。再者,上篇文章我們對(duì)虛擬時(shí)鐘SDRAM_CLK進(jìn)行約束的時(shí)候,我們對(duì)他就行約束為最大值為3ns對(duì)吧, 時(shí)鐘從PLL輸出在FPGA內(nèi)部的延時(shí)就可以按我們所約束的最大值來(lái)計(jì)算,所以因此,我們計(jì)算

  PLL的時(shí)鐘 偏移值 = -1.9225 - 3 - 0.1 = - 5.0225

  換算成正值為 10 - 5.0225 = 4.9775

  到此為止,我們的相位偏移才計(jì)算完畢,我們將它送給PLL


360桌面截圖20150330203333.jpg


  八、多周期約束

  對(duì)其進(jìn)行全編譯,查看時(shí)序報(bào)告,發(fā)現(xiàn)時(shí)序仍然不收斂


360桌面截圖20150330203629.jpg


  查看錯(cuò)誤時(shí)序報(bào)告可以看到,我們沒有做多周期約束,至于為什么,上面已經(jīng)說(shuō)過(guò)了,這里直接來(lái)做

  我們?cè)O(shè)置延時(shí)周期數(shù)為2,即在第二個(gè)時(shí)鐘周期進(jìn)行數(shù)據(jù)鎖存,因?yàn)槭禽斎肼窂綍r(shí)序違規(guī),所以我們約束的多周期路徑就是從我們的虛擬時(shí)鐘,也就是SDRAM的工作時(shí)鐘,到我們FPGA的工作時(shí)鐘clk1


360桌面截圖20150330204343.jpg


  再執(zhí)行一次全編譯,所有的路徑達(dá)到時(shí)序收斂


360桌面截圖20150330204612.jpg


  當(dāng)然,除了這些,我們還需要一些時(shí)序上的優(yōu)化,以及一些微調(diào),要想達(dá)到系統(tǒng)的真正穩(wěn)定,光做這些還是不夠的,小墨也是在學(xué)習(xí)當(dāng)中,更深入的探究我只能說(shuō)對(duì)于現(xiàn)在的我來(lái)說(shuō)是力不從心了,有很多經(jīng)驗(yàn)都是我們后續(xù)在不斷地摸索中獲得的,急也沒用,還是安心做好當(dāng)下,一步一個(gè)腳印,學(xué)無(wú)止境,我們永遠(yuǎn)不能說(shuō)自己學(xué)會(huì)了,只能說(shuō)熟悉了,慢慢來(lái)吧~大家還需加油!

  下面是我調(diào)好的板級(jí)測(cè)試圖,下面也會(huì)附有源代碼,不過(guò)下到你的板子上不一定跑的起來(lái)哦,大家還是自己親手算算這些參數(shù),等到板子真正跑起來(lái)的時(shí)候,你才會(huì)感受到那種成功的喜悅~


360桌面截圖20150330210207.jpg


  好了,SDRAM就寫到這吧,謝謝大家的支持~

fpga相關(guān)文章:fpga是什么




關(guān)鍵詞: FPGA SDRAM

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉