現有一塊ADC連接到FPGA上,需要在FPGA上實現高速數據的讀取,那么第一步自然就是完成可靠的硬件連線,其中需要注意的是:
1. 注意信號的完整性,盡可能的避免邊沿退化;這兩區分兩個概念:
? ? i. 高速信號,指的是信號翻轉,由高電平到低電平或者反之所耗得時間非常??;可能一個1MHz的TTL信號或者LVDS信號,只要邊沿足夠陡,那也算是高速信號!
? ? ii. 高頻信號,一般指的是周期性信號的周期時間足夠?。?/p>
? ? 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 傻瓜化后的ADC和FPGA的信號流向圖
從上圖可以獲知:
1. ADC內部看起來有一個源時鐘,這個源時鐘我們不用管怎么產生,它分成了兩路,其中一路經過倍頻+移相后觸發了ADC上的REG0(就是說其上升沿作為Launch Edge),另一路直接輸出到ADC引腳DCO;
2. 數據由REG0產生后輸出至ADC引腳D,經過一個延時后來到FPGA的相應輸入引腳D`,與此同時,DCO引腳也經由PCB來到了FPGA的輸入引腳DCO`;
3. 這兩個信號進入FPGA后,都各自分成了兩路,分別經過各自的延時來到其目標:
? ? a) DCO`引腳輸入后,進過TCLK2,來到了REG1的clk引腳
? ? b) DCO`引腳輸入后,進過TCLK3,來到了REG2的clk引腳
? ? c) D`引腳輸入后,進過Tdata2,來到了REG1的D引腳
? ? d) D`引腳輸入后,進過Tdata3,來到了REG2的D引腳
4. REG1和REG2有所區別,一個是上升沿觸發,一個是下降沿觸發(clk前加了個小圈圈),這是因為latch edge本來就是上升沿又有下降沿的;后期實際上也可以給DCO`也引入虛擬時鐘,這里不表;
5. 不管是REG1還是REG2,想要鎖存latch數據就必須滿足建立時間和保持時間,這個在下文的圖中也有所體現;
說了那么多,都不如實際的時序圖來的實際,下面放圖:
圖 5 實際時序分析
上圖由三個顏色的時序,分別是:
1. 紫色代表DAT,也就是數據到達時間,它由Tco(圖中沒有體現,可以參考手冊)、Tdata1和Tdata2三者構成,是不是和我們的DAT定義不一樣?公式是死的,只需要理解其意思就可以。和公式相比少了Tclk(源時鐘到REG0的clk的延時),是因為我們不需要考慮這個延時,我們是根據ADC數據手冊的時序圖反推回里面的結構圖,所以所有延時在反推的過程中已經都被體現或者被折合!
2. 綠色伙同棕色線,表達出兩個意思DRTsu和DRTh,分別代表數據建立所需時間和數據保持所需時間;
3. 將兩者按照定義做減法,就能夠得到建立時間裕量和保持時間裕量!
如上圖所示,棕色線所劃分的時間窗中,REG1.D已經是新的數據,而且在這個時間窗內并沒有變化,所以就同時滿足了建立時間裕量大于0和保持時間裕量大于0兩個關系,這樣的時序是穩定的!
但是這個只是圖示而已,所有的Tdata1、2、3以及Tclk1、2、3都是我們目前假設的,在實際進行約束時,那些量時需要設計者提前設定,而那些量是自動生成的那?答案是:
1. Tdata1和Tclk1是由PCB實際布線所決定的,如果能夠按照等長布線規則,就能夠讓兩者相互抵消;
2. DCO和DCOX2-shift180的時序是由器件決定的;
3. Tdata2、3,Tclk2、3是FPGA在布線時自動產生的!
所以說這里我們只需要告訴FPGA,DCO`和D`之間的時序關系就可以了,要獲得這兩者之間的時序關系,我們就必須獲得DCO和D之間的原始關系,以及他們是如何被布線延時變成DCO`和D`的;如何去描述上面所說的這種關系呢?利用SDC文件!
也就是說SDC文件就是要準確的告訴FPGA,所有輸入(輸出先不管)信號在進入FPGA時會是個什么樣子,然后根據這個信息,FPGA會自動布線,使得REG1和REG2能夠獲得正確的數據;如果萬一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,它會從FPGA的DCO引腳輸入
#另一個時鐘是虛擬時鐘,根據設置,它是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就知道了,這些屬于信號之間的關系:D和DCO之間的關系,D和DCOX2-shift180(就是DCO_Virtual)之間關系;
審核編輯:劉清
評論
查看更多