第一章 FPGA時序約束分享03_input delay約束
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作者:潘文明
? ?本文章探討一下FPGA的時序input delay約束,本文章內(nèi)容,來源于配置的明德?lián)P時序約束專題課視頻。
?《FPGA時序約束分享01_約束四大步驟》概括性地介紹 了時序約束的四個步驟,對時序約束進(jìn)行了分類,并得到了一個分類表。
?《FPGA時序約束分享02_時鐘約束》詳細(xì)介紹了關(guān)于時鐘的約束,根據(jù)時鐘來源可以分成輸入時鐘約束、PLL等衍生時鐘約束和自己分頻的時鐘約束等三種類型。這三種類型的約束方法均有所不同,讀者需要掌握區(qū)分方法。
? 本文,筆者將詳細(xì)介紹輸入延時(input delay)的概念、場景分類、約束參數(shù)獲取方法以及約束方法。
? 在高速輸入設(shè)備與FPGA通信場合,設(shè)置輸入延時(input delay)約束非常重要。
? 例如明德?lián)P研發(fā)的高速ADC模塊:mdyFmcAd9653,該模塊集成了2個125M采樣率、分辨率為16位的AD9653,采集數(shù)據(jù)時通過LVDS傳輸至FPGA上。該LVDS的時鐘頻率為125M,數(shù)據(jù)位寬為16位,F(xiàn)PGA接收時,需要進(jìn)行輸入延時(input delay)約束,將LVDS時鐘和數(shù)據(jù)的相位關(guān)系告知FPGA,從而讓FPGA能夠正確接收,如果約束不正確,則會出現(xiàn)接收錯誤的情況。
? 還有一個常用場景,就是網(wǎng)絡(luò)芯片的RGMII接口。RGMII接口用于網(wǎng)絡(luò)芯片和FPGA之間的網(wǎng)絡(luò)數(shù)據(jù)傳輸,網(wǎng)絡(luò)芯片往FPGA發(fā)數(shù)據(jù),即FPGA接收數(shù)據(jù)時,就需要設(shè)置輸入延時(input delay)約束。RGMII接口務(wù)必要做時序約束,否則會出現(xiàn)偶發(fā)性的數(shù)據(jù)接收錯誤的情況,筆者在做“弱小信號采集系統(tǒng)項目”時,就在這里吃過虧。
? 開始正文,首先討論并明確輸入延時(input delay)的概念。
?
第1節(jié) 輸入延時概念
上圖是一個典型的輸入延時的模型,該模型由一個上游器件source device以及一個FPGA組成。上游器件將數(shù)據(jù)傳送給FPGA,F(xiàn)PGA接收數(shù)據(jù)。從FPGA角度來看,輸入接口由時鐘接口和數(shù)據(jù)接口組成,上圖右邊FPGA的輸入管腳,上面即是數(shù)據(jù)接口,下面是時鐘接口。
Din是由時鐘clk產(chǎn)生的,理想情況下,Din的變化時刻一定是時鐘的上升沿,即變化點和時鐘上升沿對齊,如上圖所示。
但在傳輸過程中,由于時鐘和數(shù)據(jù)會存在延時差異,從而到達(dá)FPGA管腳是處于不同的時刻,數(shù)據(jù)和時鐘之間會存在相位差,如下圖所示。
上圖描述了連續(xù)3個時鐘下,數(shù)據(jù)接口din和時鐘clk的相位差,第1個時鐘相差了1ns,第2個時鐘差了1.8ns,第3個時鐘相差了1.3ns。相位差的變化有可能是延時原因,也有可能是上游器件的原因,總之,這些相位差數(shù)據(jù)是變化的,但它的變化應(yīng)該在一個確定的范圍,即肯定是存在一個最小值,同時存在一個最大值,相位差在這兩個范圍內(nèi)變動。
將其變化范圍匯總起來,制作成如下的一張圖。
上圖中的灰色區(qū)域,就是相位差的變化范圍。
現(xiàn)在可以給出輸入延時(input delay)的定義:數(shù)據(jù)相對于時鐘的延時,即數(shù)據(jù)時間-時鐘上升沿時間。
a.注意是數(shù)據(jù)時間-時鐘上升沿時間,這意味著輸入延時可正可負(fù)。當(dāng)延時在時鐘右邊時,輸入延時是正的,當(dāng)延時變化點在時鐘上升沿左邊時,輸入延時是負(fù)的。
b.輸入延時通常是一個變化范圍,其有兩個參數(shù),最小延時min和最大延時max。最小延時即上圖中灰色區(qū)域最左邊點,最大延時是灰色區(qū)域最右邊點。
c.輸入的實際延時一定在最小和最大之間。約束時,需要設(shè)置好最小min和最大max的值。
d.上圖中的clk和din是指FPGA管腳的,非上游器件管腳的。
e.牢記輸入延時的概念定義,后面場景無論如何變化,萬變不離其宗,都是按這個定義約束的。
第2節(jié) 約束語句
設(shè)置輸入延時的約束語句,其語法非常簡單,如下
set_input_delay -clock
?是想要設(shè)定input約束的端口名,可以是一個或數(shù)個port。
?-clock之后的clock_name,是時鐘域的名字。
?注意,這個clock_name是設(shè)置約束約束時定義的時鐘域的名字,而非“時鐘”名。
?可以是一個真實存在的時鐘
?也可以是預(yù)先定義好的虛擬時鐘
?delay分兩種
?-max ,輸入的最大延時,用于建立時間setup的分析,具體原因看后面部分。
?-min ,輸入的最小延時,用于保持時間hold的分析,具體原因看后面部分。
下面是具體的兩個例子
set_input_delay -clock [get_clocks clk0] -min 0.5 [get_ports Din[*]]
set_input_delay -clock [get_clocks clk0] -max 1.5[get_ports Din]*]]
上面約束了信號Din相對于時鐘域clk0,有最小延時0.5和最大延時1.5ns。
第3節(jié) 輸入延時的目的
請繼續(xù)看上面的輸入延時的模式,注意看FPGA的內(nèi)部結(jié)構(gòu)。上游器件將數(shù)據(jù)發(fā)到FPGA的輸入管腳,F(xiàn)PGA對其進(jìn)行采樣,采樣一定會使用到D觸發(fā)器,所以輸入的時鐘和數(shù)據(jù),最終均會連到FPGA內(nèi)部的D觸發(fā)器上。
由前面幾篇文章的討論可知,D觸發(fā)器是有建立時間和保持時間要求的。這個建立時間和保持時間,是這個D觸發(fā)器的物理特性,是一定會有的,但這個數(shù)值是多少,工程師不知道,而綜合工具如VIVADO、QUARTUS等會知道。
當(dāng)Din和clk的延時不滿足D觸發(fā)器的建立時間和保持時間時,綜合工具自動調(diào)整內(nèi)部延時,例如增加一些BUF,或者增加線長等方式,使得信號最終到達(dá)D觸發(fā)器時,能夠滿足建立時間和保持時間的要求。
所以綜合工具需要知道輸入的延時是多少,進(jìn)而調(diào)整內(nèi)部延時,最終滿足D觸發(fā)器的建立時間和保持時間要求,這就是設(shè)置輸入延時的目的。
有幾點需要注意的。
a.設(shè)置輸入延時,只是客觀描述外部信號,即數(shù)據(jù)和時鐘和相位關(guān)系。只要知道綜合工具這種相位關(guān)系,剩下的調(diào)整是綜合工具自動完成的。
b.雖然綜合工具可以調(diào)整內(nèi)部延時,從而達(dá)到內(nèi)部D觸發(fā)器正確采樣的目的,但這個延時是有一定范圍的,存在無論怎么調(diào)都無法滿足的情況。
第4節(jié) 獲取參數(shù)的兩種方法
由本文的約束語句一節(jié),可以知道為了設(shè)置輸入延時約束,需要知道兩個參數(shù):最大延時值max和最小延時值min。
那我們一般如何獲取這兩個參數(shù)呢?有兩種方法,一種是查閱數(shù)據(jù)手冊,另一種是通過示波器測量。
?
4.1 查閱數(shù)據(jù)手冊
數(shù)據(jù)和時鐘的相位偏差,通常來自于上流器件的寄存器延時和走線延時。
一個正規(guī)的器件,其數(shù)據(jù)手冊會清楚地標(biāo)明輸出數(shù)據(jù)和時鐘的延時范圍,通常是寄存器延時TCKO等,大家可以查找一下。
至于走線延時,通常可以通過線長度,計算得到延時值。
所以第一種方法,就是查閱數(shù)據(jù)手冊,獲取時序參數(shù),具體如何使用,可以看后面內(nèi)容。
?
4.2 示波器測量
第二種方法是示波器測量的方法。
方便的話,使用示波器接到FPGA的輸入的時鐘和數(shù)據(jù)管腳,調(diào)整示波器處于眼圖模式,就可以得到眼圖,其樣式大致如下。
上圖是按照時鐘基準(zhǔn)來獲取到的眼圖,從上圖就可以得到數(shù)據(jù)相對于時鐘的延時信號,從而得到max和min值。
知道了上面兩種方法后,還要結(jié)合應(yīng)用場景,才能正確地設(shè)置時序參數(shù)。
第5節(jié) 應(yīng)用場景概念
?
5.1 系統(tǒng)同步和源同步
數(shù)據(jù)接口的同步方式,分成系統(tǒng)同步和源同步。
系統(tǒng)同步是指板上有一個時鐘源,該時鐘源將時鐘送給各個器件,并且保證送給各個器件 的相位是相同的。如上圖中,時鐘system_clock送給了source device和FPGA,并且兩者時鐘TsrcClk和TdstClk相位是一樣的,上游器件只發(fā)數(shù)據(jù)給FPGA即可。
系統(tǒng)同步要求時鐘信號在系統(tǒng)級上同源,板級走線的延時也要對齊,要求很高,也比較難做。
?
源同步如上圖,F(xiàn)PGA的時鐘來自于上游器件 ,即上游器件將數(shù)據(jù)送給FPGA的同時,送一個隨路時鐘給FPGA,F(xiàn)PGA利用這個隨路時鐘來采樣數(shù)據(jù)。源同步方式,沒有時鐘相位同步的要求,所以相比系統(tǒng)同步簡單很多,應(yīng)用也更加廣泛。
SDR是指數(shù)據(jù)只在時鐘上升沿有效,當(dāng)前時鐘上升沿產(chǎn)生數(shù)據(jù),在下一個時鐘上升沿對這個數(shù)據(jù)進(jìn)行采樣的方式,上圖就是SDR的示例。
DDR是指數(shù)據(jù)在時鐘上升沿和下降沿都有效的一種傳輸方式。時鐘上升沿產(chǎn)生的數(shù)據(jù),在下一個時鐘下降沿被采樣;時鐘下降沿產(chǎn)生的數(shù)據(jù),在下一個時鐘上升沿被采樣。
由引可見,同樣時鐘頻率下,DDR的速率是SDR的兩倍,速率更高,要求自然也更高。
系統(tǒng)同步由于要求時鐘信號在系統(tǒng)級上同源,板級走線的延時也要對齊,無法達(dá)到更高速的設(shè)計要求,所以大部分情況也僅僅應(yīng)用SDR方式,本文針對系統(tǒng) 同步,只討論SDR的方式。
源同步接口最大的優(yōu)點就是大大提升了總線的速度,可以是SDR方式,也可以是DDR方式,本文針對源同步,將討論
SDR和DDR兩種方式。
?
5.3 中心對齊和邊沿對齊
在DDR的傳輸方式中,我們又可以分成中心對齊和邊沿對齊兩種方式。
上面是FPGA收到的一個理想的傳輸波形圖。Din1的變化點與時鐘clk的邊沿點對齊,這種傳輸方式就是邊沿對齊。Din2的變化點則是在clk的低電平或者高電平中間,這種傳輸方式就是中心對齊。
上圖是一個理想的波形,是假設(shè)Din1和Din2 零延時的情況,但實質(zhì)上這是不可能的。在實際中,必會有延時,而且必定會有抖動,這個抖動圍繞著數(shù)據(jù)變化點可能向左偏,也可能向右偏。由此,邊沿對齊的實質(zhì)波形如下圖(在時鐘邊沿左右抖動,中間穩(wěn)定)。
同理,中心對齊的實質(zhì)波形將如下圖所示(時鐘邊沿處穩(wěn)定,中間抖動)。
第6節(jié) 各種場景下的約束方法
經(jīng)過前面的鋪墊和討論,現(xiàn)在正式討論各個應(yīng)用場景下,輸入延時的約束方法。
?
6.1 系統(tǒng)同步
系統(tǒng)同步的特點是時鐘到各個器件的延時是一樣的,這意味著設(shè)置輸入延時時,不需要考慮時鐘的延時,可以認(rèn)為時鐘延時是0,我們只需要考慮數(shù)據(jù)延時。
數(shù)據(jù)延時為兩種,一種是上游器件在時鐘控制下將數(shù)據(jù)輸出到上游器件管腳的延時;另一種是數(shù)據(jù)從上游器件管腳,到FPGA管腳的延時。
?查閱數(shù)據(jù)手冊
假設(shè)通過查閱數(shù)據(jù)手冊,得到TCKO最小是1ns,最大是2ns;通過計算布線長度,得到線延時最小是0.3ns,最大是0.4ns。由此可計算得到,輸入最小延時:最小的TCKO+最小的線延時,即1.3ns;輸入最大延時:最大的TCKO+最大的線延時,即2.4ns。所以可以有如下約束語句。
set_input_delay -clock sysclk -min 1.3 ?[get_ports Din]
set_input_delay -clock sysclk -max 2.4 [get_ports Din]
?示波器測量
如果您找不到數(shù)據(jù)手冊,或者電路板做得不標(biāo)準(zhǔn),也可以使用示波器測量方法得到參數(shù)。假設(shè)眼圖如下:
上圖中,中間的A處是時鐘上升沿時刻,B處是眼圖閉合的左側(cè),C處是眼圖閉合的右側(cè)。從示波器中,可以得到B到A的距離,以及C到A的距離。而這兩個距離,則正對應(yīng)輸入延時的最小值和最大值。如下圖,圖中的灰色區(qū)域,就是上圖中的B到C的區(qū)域。
?
如前面所述,系統(tǒng)同步要求較高,大部分都是SDR情形,所以不在此討論DDR的情節(jié)。
6.2 源同步SDR
源同步SDR的約束方法,與系統(tǒng)同步非常相似。
源同步是上游器件同時傳輸了時鐘和數(shù)據(jù),如果布線做得標(biāo)準(zhǔn)的話,即線等長的話,可以認(rèn)為數(shù)據(jù)延時和時鐘延時是一致的,也就是說我們可以不考慮線延時的情況。
所以通過數(shù)據(jù)手冊,查詢 到TCKO延時,就可以設(shè)置最大最小值了。
通過示波器測量,也可以獲取到參數(shù),下圖就是眼圖。
上圖中,A是時鐘上升沿處,B是眼圖的左側(cè),定義為DV(befre),C處是眼圖的右側(cè),定義為DV(altera),這兩值都可以測量到。
上圖是對應(yīng)的波形圖。
如何通過DV(befre)和DV(altera),獲取到最小延時和最大延時呢?
認(rèn)真觀察,可以知道,最小延時就是DV(after);而最大延時則要計算一下,時鐘周期-DV(before)。
下面就是一個配置的例子。
6.3 源同步-DDR
討論完成源同步的SDR,接下來討論源同步的DDR情形。源同步的DDR是時鐘上升沿和下降沿都會采數(shù)據(jù)的情況,可以進(jìn)一步劃分成中心對齊和邊沿對齊情形。
6.3.1 DDR中心對齊
上圖是DDR中心對齊的波形圖,其中有4個參數(shù)可以通過示波器得到,分別是上升沿前dv_bre、上升沿后dv_are、下降沿前dv_bfe和下降沿后dv_afe。
注意,上圖中,F(xiàn)all_Data是由時鐘上升沿產(chǎn)生,在時鐘下降沿采樣的;Rise_Data是由時鐘下降沿產(chǎn)生,時鐘上升沿采樣的。
根據(jù)輸入延時的定義,上升沿的輸入最小延時是上圖中的B到A的時間;輸入最大延時是上圖中的C到A的時間。因此,可知上升沿輸入最小延時等于:dv_are;上升沿輸大最小延時等于:半個時鐘周期-dv_bfe。
下降沿的情況看上圖。根據(jù)定義,下降沿的輸入最小延時是B到A的時間;下降沿輸入最大延時是C到A的時間。注意,根據(jù)周期性,上圖中的C和D是相同的點。
可此可知,下降沿的輸入最小延時是dv_afe;下降沿輸入最大延時是:半個時鐘周期-dv_bre。
現(xiàn)在舉例說明,假設(shè)
?時鐘的頻率為:100M,即周期為10ns;
?數(shù)據(jù)data的dv_bre:0.4ns
?數(shù)據(jù)data的dv_are:0.6ns
?數(shù)據(jù)data的dv_bfe:0.7ns
?數(shù)據(jù)data的dv_afe:0.2ns
則有,上升沿的輸入最大延時:半個時鐘周期-dv_bfe=4.3ns;上升沿的輸入最小延時:dv_are=0.6ns;下降沿的輸入最大延時:半個時鐘周期-dv_bre=4.6ns;下降沿的輸入最小延時:dv_afe=0.2ns;
可以列出出如的約束語句:
set_input_delay -clock clk -max 4.3 [get_ports data]
set_input_delay -clock clk -min 0.6 [get_ports data]?
set_input_delay -clock clk -max 4.6 [get_ports data] -clock_fall -add_delay
set_input_delay -clock clk -min 0.2 [get_ports data] -clock_fall -add_delay
上面的語法中,使用-clock_fall表示下降沿;使用-add_delay表示與前面的約束一起生效。
6.3.2 DDR邊沿對齊
上圖是DDR中心對齊的波形圖,其中有4個參數(shù)可以通過示波器得到,分別是上升沿前skew_bre、上升沿后skew_are、下降沿前skew_bfe和下降沿后skew_afe。
注意,上圖中,F(xiàn)all_Data是由時鐘上升沿產(chǎn)生,在時鐘下降沿采樣的;Rise_Data是由時鐘下降沿產(chǎn)生,時鐘上升沿采樣的。
根據(jù)輸入延時的定義,上升沿的輸入最小延時是上圖中的B到A的時間;輸入最大延時是上圖中的C到A的時間。有讀者會疑問,為什么不是D和E呢?注意一下輸入延時的定義,是“產(chǎn)生的數(shù)據(jù)”到“產(chǎn)生該數(shù)據(jù)的時鐘沿”的距離。Fall_data是由A產(chǎn)生的,B到C區(qū)域,都是Fall_Data的變化區(qū)域,所以應(yīng)該看的是B和C到A的距離 。這個時候,B在A的左邊,說明該值是負(fù)數(shù)。
理解了上面的定義,可知上升沿輸入最小延時等于:-skew_bre;上升沿輸入最大延時等于:skew_are。
下降沿的情況看上圖。根據(jù)定義,下降沿的輸入最小延時是到D到F的時間;下降沿輸入最大延時是E到F的時間。
可此可知,下降沿的輸入最小延時是:-skew_bfe;下降沿輸入最大延時是:skew_afe。
現(xiàn)在舉例說明,假設(shè)
?時鐘的頻率為:100M,即周期為10ns;
?數(shù)據(jù)data的skew_bre:0.6ns
?數(shù)據(jù)data的skew_are:0.4ns
?數(shù)據(jù)data的skew_bfe:0.3ns
?數(shù)據(jù)data的skew_afe:0.7ns
則有,上升沿的輸入最大延時:skew_are=0.4ns;上升沿的輸入最小延時:-skew_bre=-0.6ns;下降沿的輸入最大延時:skew_afe=0.7ns;下降沿的輸入最小延時:-skew_bfe=-0.3ns;
可以列出出如的約束語句:
set_input_delay -clock clk -max 0.4 [get_ports data]
set_input_delay -clock clk -min -0.6 [get_ports data]?
set_input_delay -clock clk -max 0.7 [get_ports data] -clock_fall -add_delay
set_input_delay -clock clk -min -0.3 [get_ports data] -clock_fall -add_delay
上面的語法中,使用-clock_fall表示下降沿;使用-add_delay表示與前面的約束一起生效。
6.4 有數(shù)據(jù)無時鐘
? ? ? 有一種特殊的輸入信號,該信號是沒有對應(yīng)的時鐘,是一種異步信號。例如最常見的UART串口信號,上位機(jī)發(fā)給FPGA只有一根線,雙方按照約定的波特率進(jìn)行通信。
FPGA使用內(nèi)部的時鐘去采這個異步信號,由于時鐘和信號是異步的,因此無論怎么調(diào)整,都不能保證一定能夠滿足D觸發(fā)器的建立時間和保持時間要求,這個時候要做異步信號同步化處理后,才能采集,否則會出現(xiàn)亞穩(wěn)態(tài)現(xiàn)象,嚴(yán)重的會導(dǎo)致芯片崩潰。關(guān)于這部分內(nèi)容,可以看時序約束的其他章節(jié)。
本文要探討的是,對于這種異步信號,需不需要做輸入延時的約束呢?
答案是需要的。對其進(jìn)行時鐘約束,其主要目的不是為了調(diào)整延時,而是為了告訴綜合工具,這個信號是處于不同時鐘域的,避免被系統(tǒng)認(rèn)為屬于某一時鐘域,從而不產(chǎn)生警告,進(jìn)而導(dǎo)致工程師遺漏了此問題的解決。
由于異步信號沒有時鐘,因此我們需要構(gòu)造一個虛擬時鐘,如以下語句,就是產(chǎn)生了一個50M的虛擬時鐘clk_50_virtual,注意該語句并沒有關(guān)聯(lián)任何端口,所以是虛擬的;還要注意的是,定義為50M是隨便的,您可以定義為其他任何頻率。
create_clock -period 20 -name clk_50_virtual
當(dāng)構(gòu)造了虛擬時鐘了,就可以設(shè)置異步信號的輸入延時了,例如下面語句。注意5.2也是任意的。
set_input_delay -max 5.2 -clock clk_50_virtual [get_ports i_data]
第7節(jié) 總結(jié)與建議 ??
最后,對本文進(jìn)行簡單的總結(jié) 。
a.本文先介紹 了輸入延時的概念,然后分成不同的應(yīng)用場景,根據(jù)這些應(yīng)用場景不同,分別使用不同的約束方法。
b.輸入延時約束關(guān)鍵的是獲取約束參數(shù),可分成查閱數(shù)據(jù)手冊和示波器測量方法。
c.輸入延時約束,只是客觀反映外部信號的情況,千萬不要理解成“要求系統(tǒng),讓輸入延時多少ns”。即不是要求系統(tǒng)做什么,而是告訴系統(tǒng)輸入信號的情況,而系統(tǒng)決定怎么做。
第8節(jié) 相關(guān)產(chǎn)品 ??
本文提到的mdyFmcAd9653,是由明德?lián)P科教研發(fā)的多通道,高分辨率和高采樣率數(shù)模轉(zhuǎn)換器的ADC系列子板,搭載兩片ADC芯片,支持ADI、上海貝嶺、北京時代民芯科技、中電24所等生產(chǎn)的芯片,完全PIN對PIN兼容;共支持8通道同步輸入;共支持16位采樣分辨率;支持最高125MSPS的采樣率,適用于醫(yī)療電子、雷達(dá)、衛(wèi)星導(dǎo)航等多種應(yīng)用場合。
?
第9節(jié) 相關(guān)文章 ??
1.《FPGA時序約束分享01_約束四大步驟》
2.《FPGA時序約束分享02_時鐘約束》
3.《mdyFmcAd9653產(chǎn)品說明書》
?
評論
查看更多