I/O約束
I/O約束是必須要用的約束,又包括管腳約束和延遲約束。
管腳約束
管腳約束就是指管腳分配,我們要指定管腳的PACKAGE_PIN和IOSTANDARD兩個屬性的值,前者指定了管腳的位置,后者指定了管腳對應的電平標準。
set_property -dict {PACKAGE_PIN AJ16 IOSTANDARD LVCMOS18} [get_ports "led[0]" ]
在Vivado規定,必須要指定管腳電平,不然在最后一步生成比特流時會出錯。
除了管腳位置和電平,還有一個大家容易忽略但很容易引起錯誤的就是端接,當我們使用差分電平時比如LVDS,在在V6中我們使用IBUFDS來處理輸入的差分信號時,可以指定端接為TRUE。
IBUFDS #( .DIFF_TERM("TRUE"), // Differential Termination .IOSTANDARD("DEFAULT") // Specify the input I/O standard ) IBUFDS_inst ( .O(O), // Buffer output .I(I), // Diff_p buffer input (connect directly to top-level port) .IB(IB) // Diff_n buffer input (connect directly to top-level port) );
但在Ultrascale中的IBUFDS,卻把端接這個選項去掉了
IBUFDS #(
.DQS_BIAS("FALSE") // (FALSE, TRUE) ) IBUFDS_inst ( .O(O), // 1-bit output: Buffer output .I(I), // 1-bit input: Diff_p buffer input (connect directly to top-level port) .IB(IB) // 1-bit input: Diff_n buffer input (connect directly to top-level port) );
我們必須要在xdc或I/O Pors界面中,手動指定,否則可能會出錯。
筆者之前就采過一個坑,差分端口輸入,當連續輸入的數據為11101111這種時,中間那個0拉不下來,還是1,同樣也會發生在000010000,這樣就導致數據傳輸錯誤,后來才發現是端接忘記加。因為端接會影響信號的實際電平,導致FPGA判斷錯誤。
當綜合完成后,我們可以點擊DRC,進行設計規則檢查,這一步可以報出一些關鍵問題,比如時鐘端口未分配在時鐘引腳上等。
延遲約束
延遲約束用的是set_input_delay和set_output_delay,分別用于input端和output端,其時鐘源可以是時鐘輸入管腳,也可以是虛擬時鐘。但需要注意的是,這個兩個約束并不是起延遲的作用,具體原因下面分析。
set_input_delay
這個約束跟ISE中的OFFSET=IN功能相同,但設置方式不同。下圖所示即為input delay的約束說明圖。
從圖中很容易理解,
T_inputdelay = Tco + TD
當滿足圖中的時序時,最大延遲為2ns,最小延遲為1ns。
因此,需要加的時序約束為:
create_clock -name sysclk -period 10 [get_ports clkin] set_input_delay 2 -max -clock sysclk [get_ports Datain] set_input_delay 1 -min -clock sysclk [get_ports Datain] set_output_delay
set_output_delay的用法跟set_input_delay十分相似,這里就不再展開講了。我們上面講set_input_delay的描述中,大家可以看到,這個約束是告訴vivado我們的輸入信號和輸入時鐘之間的延遲關系,跟下面要講的時鐘周期約束是一個原理,讓vivado在這個前提下去Place and Route。并不是調節輸入信號的延遲,因為身邊有不少的FPGA工程師在沒用過這個約束指令之前,都以為這是調節延遲的約束。
如果要調整輸入信號的延遲,只能使用IDELAY,在V6中,IDELAY模塊有32個tap值,每個tap可延遲78ps,這樣總共差不多是2.5ns。
編輯:hfy
-
FPGA
+關注
關注
1630文章
21796瀏覽量
606007 -
DRC
+關注
關注
2文章
150瀏覽量
36349 -
Vivado
+關注
關注
19文章
815瀏覽量
66889
發布評論請先 登錄
相關推薦
評論