Xilinx OFFSET偏移約束略談
Xilinx OFFSET偏移約束略談 calipers的博客http://blog.sina.com.cn/s/blog_7789345c0100y0zb.html Xilinx OFFSET偏移約束略談 -=c00s19n=- coosign#sohu.com 2011年5月29日 Xilinx ISE約束除了Period約束,最基本的應該就是OFFSET約束(偏移約束)了。 下面分條目簡單說一下OFFSET如何應用(下文主要圍繞OFFSET IN展開討論)。 (1)OFFSET約束基本概念 可以概括為三大注意點: (a)OFFSET約束是用來約束數據和時鐘之間的時延關系。 (b)它只能用于與FPGA管腳(PAD)相連的信號,不能用于內部信號。 (c)它告訴ISE布局布線工具,外部時鐘和數據輸入輸出管腳之間的時序關系。 當然,如果我只是簡單的列出上面三條,不解釋的話,仍然會給讀者帶來重大誤解。 先給出UCF文件中的約束代碼: TIMEGRP "data" OFFSET = IN 2ns BEFORE "sysclk"; 其中"data"是一組輸入信號的組名,sysclk是輸入時鐘管腳名字。 這個2ns究竟是什么含義呢? 請看下圖: 2ns的含義,就是告訴ISE,在時鐘信號和數據信號進入FPGA之前,它們之間的時延是2ns。用一句拗口的話來說就是:在時鐘信號沿來之前的2ns,數據準備好。說的事情就是上圖給出的時序圖。因此,OFFSET約束并不是叫ISE布線工具在FPGA內部給你實現一個2ns的時延。那么ISE布線工具知道了輸入時鐘、數據信號之間的時延之后,能干什么呢? (2)OFFSET約束的作用 OFFSET約束作用有3個, (a)計算信號、時鐘在FPGA內部的時延,給出準確的時序報告 (b)根據UCF中指定的時延關系,去調整輸入信號到達同步單元的時間。 (c) b是針對Offset In而言,同理針對Offset Out,會調整輸出信號到達輸出管腳的時間。 仍然以上圖為例說明,綜合實現工具將努力使得數據信號、時鐘信號到達同步單元的相對延遲+FPGA外部本來的延時,不會超過一個時鐘周期。并在布線完后會給出數據路徑和精確時延報告。 例如,經過FPGA內部到達同步單元的時序關系變為: 這樣就會出現時序錯誤了。 那么,很自然地會想到:我怎么知道信號進入FPGA之前的時延呢? (3)如何準確地知道時鐘和數據之間的時延關系? 以ADC+FPGA為例,FPGA作為ADC信號的接口,接收ADC采集的數據。這時候需要看ADC芯片手冊查找相關參數,ADC芯片手冊會給出其輸出時鐘和數據之間的相對關系。 下面以國半的ADC16DV160為例,假定它的輸出數據和輸出時鐘都連接到FPGA上,而且在PCB板上的走線等長(實際工程師在設計PCB時,肯定是這么做的)。 當采樣頻率是160MHz的時候,Tsu=1.57ns, Th=1.55ns。 看它的時序圖也能看出來,輸出的時鐘對應著數據的中間位置。 因此,對于上升沿采樣的數據而言,其OFFSET約束應該這么寫: NET "adc_clk_p" TNM_NET = adc_clk_p; TIMESPEC TS_adc_clk_p = PERIOD "adc_clk_p" 160 MHz HIGH 50%; ##OFFSET IN NET "adc_data <*>" TNM = " data"; TIMEGRP " data " OFFSET = IN 1.57ns BEFORE "adc_clk_p"; 寫上這些約束,大家要養成查看時序報告的習慣。時序報告會告訴你這些時序滿足或者不滿足。在實際中,如果ISE的時序報告告訴你能夠滿足你的時序約束,然而FPGA程序在實際運行的時候卻發現存在時序問題(例如ADC采集信號有毛刺等),這說明你在UCF中指定的時延關系并不正確! 初學者常犯的一個錯誤,時序報告告訴你OFFSET IN約束無法滿足,會去修改OFFSET IN的時延值,使得布線工具不再報時序錯誤;另一種錯誤是,以為把這個時延值寫的越小,FPGA程序的時鐘頻率能跑的越快。 因此,當我們清楚地知道OFFSET約束語句中這個時延值代表的真正含義時,就不會再做這兩種無用功了(PS:當然,既然改了時延值,就會更改FPGA布線,也有瞎貓碰到死耗子——碰巧解決了實際問題的事情發生。但我們必須知道那是不對滴)。 (4)OFFSET約束怎么之前還加上周期約束 上面的例子中,約束了adc_clk_p時鐘信號的周期。 這是必須的。如果你不告訴ISE綜合布線工具關于時鐘周期的信息,OFFSET約束會被忽略。 很自然的,布線工具需要知道時鐘信號的周期,這樣它才能努力使得數據信號、時鐘信號到達同步單元的相對延遲+FPGA外部本來的延時,不會超過一個時鐘周期。 此外,說明一下: TIMESPEC TS_adc_clk_p = PERIOD "adc_clk_p" 160 MHz HIGH 50%; High 50%,High表明了ISE在計算時延值時,是以時鐘上升沿作為時間0點,50%也是用于計算時延時用的(雙沿時用得著)。并不是說要去約束FPGA內部這個時鐘要達到50%的占空比,約束第一個進入的時鐘是上升沿,并不是這個意思。 因此,定義了時間0點,也就存在Before和After之說了,也就存在時延的正值、負值之說了。 (5)雙沿輸入的情況下怎么約束 在第3條中的例子,就是這種情況,ADC16DV160輸出的數據是DDR的,作為16bit的ADC,其上升沿輸出偶數bit數據,下降沿輸出奇數bit數據;這樣可以節省ADC輸出的位寬。 由于OFFSET IN的約束隨著ISE版本的升級,語法也不斷的發生變化。針對目前我用的ISE12,Xilinx推薦的規范寫法如下: NET "adc_clk_p" TNM_NET = adc_clk_p; TIMESPEC TS_adc_clk_p = PERIOD "adc_clk_p" 160 MHz HIGH 50%; ##OFFSET IN NET "adc_data_I_p<*>" TNM = "adc_data"; NET "adc_data_Q_p<*>" TNM = "adc_data"; NET "adc_data_I_n<*>" TNM = "adc_data"; NET "adc_data_Q_n<*>" TNM = "adc_data"; TIMEGRP "adc_data" OFFSET = IN 1.57ns VALID 1.55ns TIMEGRP "adc_data" OFFSET = IN 1.57ns VALID 1.55ns 注意:使用了RISING和FALLING的關鍵字。此外,差分時鐘輸入,我只選擇了其中P管腳信號adc_clk_p進行約束。ISE能夠把這個約束傳遞到BUFG和DCM。 關于雙沿的討論,還可以參考如下鏈接的信息: http://myfpgablog./2009/10/ddr-offset-inout-constraints-with-dcm.html http://forums./t5/Timing-Analysis/OFFSET-IN-DDR-timing-constraints-again/td-p/54507 (6)OFFSET約束時序不滿足怎么辦? 經常會碰到這種問題。 解決方法有兩種: (a)使用DCM的移相功能 (b)使用IDELAY Xilinx自帶的IP Core,諸如RocketIO/MIG等等,都會用上IODELAY。對于一般用戶,自己寫的代碼,最常用的應該是采用DCM。相位的設置可以根據布線結果給出的時序余量來確定。相位值如果采用Fixed,可能無論怎么調都不一定能滿足要求,畢竟修改了代碼,每一次布線的結果并一定只改動了DCM部分。 DCM有動態調整相位的功能,可以派上用場。 DCM動態調相用到了PSEN,PSINCDEC,PSCLK,PSDONE這幾個信號。 這些端口默認是灰色的,要選中VARIABLE_POSITIVE/CENTER等之后,才會出現。 控制很簡單,出一個PSEN單周期信號,如果PSINCDEC為低,則相位增加1個;反之,降低一個相位。 |
|
來自: raymoon_sure > 《FPGA》