設定輸入/輸出延遲(input/output delay)。首先看輸入延遲。
下面圖示的系統是我們在做數字電路設計時經常會遇到的。External Device可能是其他的內建電路晶片,也有可能是其他的FPGA,為了與我們所要讨論的FPGA分開,稱之為External Device。External Device中的寄存器D1的輸出送給FPGA中的寄存器D2。D1和D2屬于同一個時鐘域(CLK)。為了簡化讨論,我們假設CLK source到兩個寄存器之間的延時是相等的,也就是說延時CLK1等于延時CLK2。這個時候,D1的CLK端到D2的D端形成了一個完整的timing path。
但是,在我們對FPGA做時序分析的時候,軟體隻知道FPGA内部的時序資訊,對External Device的情況并不清楚。是以我們必須要添加額外的限制來反映FPGA外部的時序資訊。一般情況下,我們用input delay來表示輸入信号相對于CLK的延遲。即上圖我們用紅線表示出來的部分。為了便于讨論,我們把FPGA内部藍色走線的部分稱為chip delay。如果我們能給出input delay的大小,那麼軟體就可以計算出chip delay的大小,進而保證該條timing path符合設計要求。
一般情況下,External Device的spec會給出input delay的大小。我們在做FPGA時序分析的時候,隻需要用指令将input delay加入到限制中就可以了。
下面是input delay的文法,詳細的介紹可參照Quartus II的幫助系統。
Syntax | set_input_delay [-h | -help] [-long_help] [-add_delay] -clock<name> [-clock_fall] [-fall] [-max] [-min] [-reference_pin<name>] [-rise] [-source_latency_included] <delay> <targets> |
由于在DAC7512控制器裡,并沒有需要設定input delay的信号,是以下面給出幾個一般的input delay的例子,它們與DAC7512控制器的設計沒有關系。
set_input_delay -clock clk 1.5 [all_inputs]
set_input_delay -clock clk -clock_fall 1.5 [get_ports myin*]
在上面的讨論中,我們假定CLK到D1和D2的延時是相等的,但在某些情況下,CLK的延時可能會有差别,那麼在定義input delay的時候,就需要考慮CLK延時的內插補點。具體的計算方式請大家考慮一下,也可以參照TimeQuest文檔中的相關部分,這裡不再做叙述。
然後看輸出延遲。
下圖是一個output dleay的例子,和上面講的input delay相似。在做數字電路設計時也經常會遇到這樣的情況。同樣的,External Device可能是其他的內建電路晶片,也有可能是其他的FPGA,為了與我們所要讨論的FPGA分開,稱之為External Device。圖中FPGA的寄存器D1的輸出送給External Device的寄存器D2。D1和D2屬于同一個時鐘域(CLK)。為了簡化讨論,我們假設CLK source到兩個寄存器之間的延時是相等的,也就是說延時CLK1等于延時CLK2。這個時候,D1的CLK端到D2的D端形成了一個完整的timing path。
同樣的,在對FPGA做時序分析的時候,軟體隻知道FPGA内部的時序資訊,對External Device的情況并不清楚。是以我們必須要添加額外的限制來反映FPGA外部的時序資訊。一般情況下,我們用output delay來表示輸出信号在FPGA外部走線相對于CLK的延遲。即上圖我們用藍線表示出來的部分。為了便于讨論,我們把FPGA内部紅色走線的部分稱為chip delay。如果我們能給出output delay的大小,那麼軟體就可以計算出chip delay,進而保證該條timing path符合設計要求。
一般情況下,External Device的spec會給出所需要的output delay的大小。我們在做FPGA時序分析的時候,隻需要用指令将output delay加入到限制中就可以了。
下面是output delay的文法,詳細的介紹可參照Quartus II的幫助系統。
Syntax | set_output_delay [-h | -help] [-long_help] [-add_delay] -clock<name> [-clock_fall] [-fall] [-max] [-min] [-reference_pin<name>] [-rise] [-source_latency_included] <delay> <targets> |
也給出兩個一般性的例子:
set_output_delay -clock clk 0.5 [all_outputs]
set_output_delay -clock clk -clock_fall 0.5 [get_ports myout*]
現在我們讨論DAC7512控制器輸出信号的output delay,以DA_DIN信号為例。DAC7512控制器的DA_DIN和DA_SCLK與DAC7512的DIN和SCLK按照下面的方式連接配接。
可以看到D1和D2的時鐘是CLK50M。CLK50M到D1和D2的延時分别是Delay1和Delay6。根據FPGA的特性,可以認為Delay1和Delay6是相等的。Delay4和Delay5是兩根信号線在PCB上的延時,可以認為二者是相等的。FPGA設計要滿足的是D1到DA_SCLK port的延時(Delay2)和D2到DA_DIN port的延時(Delay3)能滿足DAC7512 datasheet上對DIN input delay的要求(對于FPGA來講,就是DA_DIN的output delay)。
DAC7512的datasheet給出了DAC7512的管腳上DIN和SCLK的時序要求。如下面兩張圖所示。可以看到以PORT_DA_SCLK為基準,DA_DIN的output delay最大值為(20-4.5),最小值為5。
對我們來講,Delay2是一個比較難确定的值,但實際上我們可以通過定義以DA_SCLK為源的PORT_DA_SCLK時鐘來讓軟體給我們計算出來Delay2的值。通過下面的指令,建立PORT_DA_SCLK時鐘。
create_generated_clock -name PORT_DA_SCLK -divide_by 1 -source [get_registers {DAC7512:DAC7512|DA_SCLK}] [get_ports DA_SCLK]
這樣我們就可以用set_output_delay指令定義DA_DIN的output delay。
set_output_delay -clock PORT_DA_SCLK -clock_fall -max 14.5 [get_ports DA_DIN]
set_output_delay -clock PORT_DA_SCLK -clock_fall -min 5 [get_ports DA_DIN]