|
VGA驅動接口時序設計之6建立和保持時間約束 本文節選自特權同學的圖書《FPGA設計實戰演練(邏輯篇)》 配套例程下載鏈接:http://pan.baidu.com/s/1pJ5bCtt 接著,我們可以對VGA的信號做如下的約束。(特權同學,版權所有) set_output_delay -clock { LCD_CLK } -max 0.62 [get_ports{vga_b[0] vga_b[1] vga_b[2] vga_b[3] vga_b[4] vga_g[0] vga_g[1] vga_g[2]vga_g[3] vga_g[4] vga_g[5] vga_r[0] vga_r[1] vga_r[2] vga_r[3] vga_r[4]adv7123_blank_n}] set_output_delay -clock { LCD_CLK } -min -1.28 [get_ports{vga_b[0] vga_b[1] vga_b[2] vga_b[3] vga_b[4] adv7123_blank_n vga_g[0] vga_g[1]vga_g[2] vga_g[3] vga_g[4] vga_g[5] vga_r[0] vga_r[1] vga_r[2] vga_r[3]vga_r[4]}] 如此這般約束之后,我們可以重新編譯一下系統,然后看看約束結果,我們拿到一條setup時間的分析報告。如圖8.36所示,數據路徑的分析沒有啥問題,我們約束的0.62ns的max set_output delay值出現在了data required path中,說明我們的約束生效了。(特權同學,版權所有)
圖8.36 某路徑的setup約束分析報告 再來看hold時間的分析報告,如圖8.37所示,也是隨便找一條路徑。-1.28ns的min set_output_delay也已經生效了。(特權同學,版權所有)
圖8.37某路徑的hold約束分析報告 即便如此,細心的讀者一定沒有忘記,前面的分析中我們忽略了時鐘偏斜的延時值。沒錯,下面我們就要將它也考慮到路徑延時中去。因為我們的lcd_clk直接就連接到了驅動FPGA內部模塊的時序產生時鐘信號,所以它的偏斜其實就是PLL輸出的這個時鐘信號到引腳的延時值。因為這個路徑其實也應該算在了reg2pin的時序路徑中,如果不做約束系統不會對其進行分析的。所以,為了獲得這條路徑的延時信息,我們勢必需要對這條路徑做一下約束。我們可以先試試將這條路徑用set maximum delay和set minimux delay約束在0~5ns之間。set maximum delay和set minimux delay約束語法其實主要是用于我們前面所提到的第四類路徑的約束,它非常直接的去約束信號的傳輸起點到目的點的路徑延時值。我們的lcd_clk路徑約束如下(注意我們所說的lcd_clk/LCD_CLK在FPGA代碼中定義為vga_clk)。(特權同學,版權所有) set_max_delay -to [get_ports {vga_clk}] 5.000 set_min_delay -to [get_ports {vga_clk}] 0.000 約束完成后,我們重新編譯下系統,再來看看約束的結果。Setup時間余量最小的路徑所對應的時序報告如圖8.38所示。(特權同學,版權所有)
圖8.38 setup路徑余量最小的報告 Hold時間余量最小的路徑所對應的時序報告如圖8.39所示。(特權同學,版權所有)
圖8.39 hold路徑余量最小的報告 從這份報告中,我們獲得的信息是,從PLL的clk[1]輸出到lcd_clk引腳的延時為2.116ns~2.598ns,那么給這個延時留一些余量,可以繼續將他們的約束范圍限制在2ns~2.7ns之間,即: set_max_delay -to [get_ports {vga_clk}] 2.700 set_min_delay -to [get_ports {vga_clk}] 2.000 加上前面我們已經計算的lcd_clk在PCB上的走線延時,可以得到lcd_clk的偏斜時間約為2.44ns~3.14ns。留足余量,我們可以取lcd_clk的時鐘偏斜為2.4ns~3.2ns。其實在比較嚴謹的系統中,通常用于給外部芯片的時鐘信號要走FPGA的PLL輸出專用引腳,并且也最好這個時鐘信號是PLL直接輸出供給的,滿足這兩個條件的時鐘輸出路徑偏斜通常會被優化在一個非常小的范圍里,而不會像我們這個設計一樣出現理論計算這么寬的時鐘偏斜范圍(大家領會精神就行,這個時鐘速率還不算太高,不用苛刻的約束去做也就能夠滿足我們的系統要求)。我們這個設計實際上也是PLL直接供給的,但驅動時鐘并沒有做相位差調整。如果整個lcd_clk連接到了FPGA的專用時鐘輸出引腳上,那么時鐘偏斜會小很多,這也是之所以推薦走PLL專用輸出時鐘引腳的原因。(特權同學,版權所有) 接下來,我們需要將lcd_clk的時鐘偏斜值代入output max delay和output min delay的計算公式。原公式中,cd_alt參數實際上都出現在了時序分析的launch edge的時鐘網絡延時中,如圖8.40所示,所以我們無需再代入,直接取值為0ns即可。(特權同學,版權所有) output max delay = 1ns + 0.2ns + (0ns– 3.2ns) = -2ns output min delay = 0ns – 1.5ns + (0ns– 2.4ns) = - 3.9ns
圖8.40 cd_alt參數示意 重新約束后腳本如下: set_output_delay -clock { LCD_CLK } -max -2 [get_ports {vga_b[0]vga_b[1] vga_b[2] vga_b[3] vga_b[4] vga_g[0] vga_g[1] vga_g[2] vga_g[3]vga_g[4] vga_g[5] vga_r[0] vga_r[1] vga_r[2] vga_r[3] vga_r[4]adv7123_blank_n}] set_output_delay -clock { LCD_CLK } -min -3.9 [get_ports{vga_b[0] vga_b[1] vga_b[2] vga_b[3] vga_b[4] adv7123_blank_n vga_g[0] vga_g[1]vga_g[2] vga_g[3] vga_g[4] vga_g[5] vga_r[0] vga_r[1] vga_r[2] vga_r[3]vga_r[4]}] |