本文將結合具體實例闡述OFFSET IN的使用方法。注意:這是我第一次寫OFFSET IN約束,本文僅供參考。閱讀本文前須要瞭解時序收斂的基本概念,OFFSET IN和Period的相關知識,可先閱讀時序收斂:基本概念,OFFSET約束(OFFSET IN 和OFFSET OUT)這兩篇內容。html
系列目錄 spa
創建時間和保持時間(setup time 和 hold time)htm
OFFSET約束(OFFSET IN 和OFFSET OUT)blog
Clock Skew , Clock uncertainly 和 Periodip
某器件(Device)有信號RXD0-RXD15,RKLSB,RKMSB須要輸入到FPGA內,同時有與數據同步的RXCLK,數據爲SDR輸入。以下圖所示,這是一個典型的源同步輸入方式,須要給出OFFSET IN約束。it
OFFSET IN的相關參數能夠到與器件對應的Datasheet內尋找,該器件的輸入知足如下關係。RXD0-RXD15,RKLSB,RKMSB在RXCLK上升沿到達前3ns有效,同時在上升沿以後保持3ns。(這一狀況對應TXCLK=80MHz,TXCLK = RXCLK)
綜合這兩點考慮,RXD0-RXD15,RKLSB,RKMSB的OFFSET IN Before 是 3ns(80MHz),同時數據的有效時間爲tsu+th = 6ns(80MHz)。
能夠之間在UCF文件中寫時序約束,也能夠經過軟件指定生成。這裏介紹後一種方法,採用ISE開發環境,首先打開工程,點擊Create Timing Constraints。
因爲RXD0-RXD15,RKLSB,RKMSB知足的OFFSET IN是一致的,這裏先定義TIMEGRP。點擊左側Grop Constraints by Instance,出現以下界面。因爲RXD0-RXD15,RKLSB,RKMSB都是輸入pad,選擇Input Pads,創建Time name爲tlk1_rxd,選擇對應的RXD0-RXD15,RKLSB,RKMSB完成便可。(注:該工程中有兩個器件,這裏對應tlk1_dclkin爲RXCLK,tlk1_rklsb爲RKLSB,tlk1_rkmsb爲RKMSB,tlk1_rxd[15:0]爲RXD0-RXD15.)
以後選擇OFFSET IN,定義OFFSET IN約束。打開界面,選擇源同步,SDR方式,Clock edge爲Center aligned(這個能夠經過右側的時序圖肯定)。點擊下一步。(注,tlk1_dclkin在FPGA內部做爲時鐘,須要先寫時序約束,這裏假設頻率爲100MHz,佔空比1:1。)
以後肯定相關參數,Input clock pad爲tlk1_dclkin(時鐘約束已經寫好),輸入pad爲tlk1_rxd。第1節分析結果可得在135MHz下offset in爲2.5ns,數據有效時間爲5ns。這裏採用這一數值,填入對應方框中,確認保存便可。
生成約束後,能夠打開UCF文件,觀察生成結果以下所示。首先是tlk1_dclkin的週期約束,同時定義了佔空比爲1:1。以後肯定了TIMEGRP,最後指定了OFFSET IN約束。
NET "tlk1_dclkin" TNM_NET = tlk1_dclkin;
TIMESPEC TS_tlk1_dclkin = PERIOD "tlk1_dclkin" 10 ns HIGH 50%;
TIMEGRP "tlk1_rxd" = PADS("tlk1_rxd<15>") PADS("tlk1_rxd<0>") PADS("tlk1_rxd<1>") PADS("tlk1_rxd<2>") PADS("tlk1_rxd<3>") PADS("tlk1_rxd<4>") PADS("tlk1_rxd<5>") PADS("tlk1_rxd<6>") PADS("tlk1_rxd<7>") PADS("tlk1_rxd<8>") PADS("tlk1_rxd<9>") PADS("tlk1_rxd<10>") PADS("tlk1_rxd<11>") PADS("tlk1_rxd<12>") PADS("tlk1_rxd<13>") PADS("tlk1_rxd<14>") PADS("tlk1_tklsb") PADS("tlk1_tkmsb");
TIMEGRP "tlk1_rxd" OFFSET = IN 2.5 ns VALID 5 ns BEFORE "tlk1_dclkin" RISING;