1. 程式人生 > >【 Vivado 】時鐘型別

【 Vivado 】時鐘型別

 Vivado進行時序分析,對時鐘的約束是必不可少的,設計中的時鐘可分為一下幾種:

  • Primary Clocks 主時鐘;
  • Generated Clocks 衍生時鐘;
  • Virtual Clocks 虛擬時鐘。

Primary Clocks

主時鐘一般是FPGA外部晶片如晶振提供的時鐘,通過FPGA引腳輸入。Vivado進行時序分析時,以主時鐘的源端點作為延時計算起始點(0ns)。主時鐘的約束命令如下:

create_clock-name <clock_name> -period <period> -waveform {<rise_time> <fall_time>} [get_ports <input_port>]

下面通過幾個例項說明一下約束命令:

create_clock-name clk_main -period 10 -waveform {0 5} [get_ports GCLK]

週期10ns,0ns上升沿,5ns下降沿。

create_clock-name clk_main -period 10 -waveform {0 2.5} [get_ports GCLK]

週期10ns0ns上升沿,2.5ns下降沿;與a例週期相同,但是佔空比不同,a例中50%b例中

25%

create_clock-name clk_main -period 20 -waveform {0 10} [get_ports GCLK]

週期20ns0ns上升沿,10ns下降沿;與a例佔空比相同,都是50%,但是週期不同,a例中10nsb例中20ns

Generated Clocks

衍生時鐘是由設計內部產生,一般由時鐘模組(MMCM or PLL)或者邏輯產生,並且對應有一個源時鐘,源時鐘可以是系統的主時鐘或者另外一個衍生時鐘。約束衍生時鐘時,除了定義週期,佔空比,還需要指明與源時鐘的關係。通過create_generated_clock
命令約束衍生時鐘,命令如下:

create_generated_clock -name<generated clock name> -source <master clock source pin or port> -divide_by <div_factor> <pin_or_port>


(圖1)

如圖1中,主時鐘GCLK通過PLL產生兩個衍生時鐘CLKOUT1和CLKOUT2,其中GCLK—100MHz,CLKOUT1—100MHz,CLKOUT2—10MHz,對於MMCMx, PLLx, BUFR primitives這幾種時鐘模組,Vivado會自動對主時鐘和衍生時鐘進行約束。

在Tcl Console中輸入report_clocks可以得到時鐘報告,以下是未對設計進行任何時鐘約束的情況:

report_clocks

INFO: [Timing 38-35] Done setting XDC timing constraints.

INFO: [Timing 38-2] Deriving generated clocks

***************************************************************************

* Report  : Clocks

* Design  : top

* Part    : Device=7z020, Package=clg484, Speed=-1

* Version : Vivado v2013.1 Build 248050 by xbuild on Wed Mar 27 17:27:24 MDT 2013

* Date    : Tue Dec 17 12:17:09 2013

***************************************************************************

Attributes

  P: Propagated

  G: Generated

  V: Virtual

  I: Inverted

Clock               Period     Waveform        Attributes     Sources

clk_in1             10.00000   {0.00000 5.00000}   P           {GCLK}

clkfbout_clk_gen     10.00000   {0.00000 5.00000}  

P,G         {clk_gen_u/inst/plle2_adv_inst/CLKFBOUT}

clk_out1_clk_gen     20.00000  {0.00000 10.00000} 

 P,G         {clk_gen_u/inst/plle2_adv_inst/CLKOUT0}

clk_out2_clk_gen    100.00001  {0.00000 50.00000}   

P,G         {clk_gen_u/inst/        plle2_adv_inst/CLKOUT1}

====================================================

Generated Clocks

====================================================

Generated Clock   : clkfbout_clk_gen

Master Source     : clk_gen_u/inst/plle2_adv_inst/CLKIN1

Master Clock      : clk_in1

Multiply By       : 1

Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKFBOUT}

 Generated Clock   : clk_out1_clk_gen

Master Source     : clk_gen_u/inst/plle2_adv_inst/CLKIN1

Master Clock      : clk_in1

Edges             : {1 2 3}

Edge Shifts       : {0.000 5.000 10.000}

Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT0}

Generated Clock   : clk_out2_clk_gen

Master Source     : clk_gen_u/inst/plle2_adv_inst/CLKIN1

Master Clock      : clk_in1

Edges             : {1 2 3}

Edge Shifts       : {0.000 45.000 90.000}

Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT1}


(圖2)

如圖2中,衍生時鐘CLKOUT1通過邏輯產生一個2分頻的衍生時鐘CLK_DIV2,CLKOUT1的約束已自動生成,對CLK_DIV2約束指令如下:

create_generated_clock -name CLK_DIV2 -source [get_pins clk_gen_u/clk_out1] -divide_by 2 [get_pins clk_25m_reg/Q]

 生成的時鐘報告如下:

====================================================

Generated Clocks

====================================================

Generated Clock   : CLK_DIV2

Master Source     : clk_gen_u/clk_out1

Master Clock      : clk_out1_clk_gen

Divide By         : 2

Generated Sources : {clk_25m_reg/Q}

 

Generated Clock   : clkfbout_clk_gen

Master Source     : clk_gen_u/inst/plle2_adv_inst/CLKIN1

Master Clock      : clk_in1

Multiply By       : 1

Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKFBOUT}

Generated Clock   : clk_out1_clk_gen

Master Source     : clk_gen_u/inst/plle2_adv_inst/CLKIN1

Master Clock      : clk_in1

Edges             : {1 2 3}

Edge Shifts       : {0.000 5.000 10.000}

Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT0}

Generated Clock   : clk_out2_clk_gen

Master Source     : clk_gen_u/inst/plle2_adv_inst/CLKIN1

Master Clock      : clk_in1

Edges             : {1 2 3}

Edge Shifts       : {0.000 45.000 90.000}

Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT1}


​​​​​​​Virtual Clocks

虛擬時鐘是在FPGA設計不存在的時鐘,但是為什麼要引入呢?先看一下圖3中結構,FPGA與板上的其它晶片間有資料互動,屬於FPGA內部時序單元到輸出埠的路徑。晶片上的時鐘並不是由FPGA提供,Vivado在進行這部分時序分析時並不知道晶片的時鐘,因此需要定義一個虛擬時鐘,然後約束輸出埠的output delay

約束虛擬時鐘的命令也是create_clock,但是其不需要指定-source,如下指令:

create_clock -period 100.000 -name SCLK -waveform {0.000 50.000}

 時鐘報告如下,定義的虛擬時鐘SCLK屬性為Virtual,無source

report_clocks

INFO: [Timing 38-35] Done setting XDC timing constraints.

INFO: [Timing 38-2] Deriving generated clocks

*****************************************************************

* Report  : Clocks

* Design  : top

* Part    : Device=7z020, Package=clg484, Speed=-1

* Version : Vivado v2013.1 Build 248050 by xbuild on Wed Mar 27 17:27:24 MDT 2013

* Date    : Tue Dec 17 14:08:19 2013

***************************************************************************Attributes

  P: Propagated

  G: Generated

  V: Virtual

  I: Inverted

Clock             Period     Waveform         Attributes  Sources

clk_in1           10.00000   {0.00000 5.00000}     P           {GCLK}

CLK_DIV2         40.00000   {0.00000 20.00000}    P,G         {clk_25m_reg/Q}

SCLK             100.00000  {0.00000 50.00000}    V           {}

clkfbout_clk_gen   10.00000   {0.00000 5.00000}     P,G         {clk_gen_u/inst/

plle2_adv_inst/CLKFBOUT}

clk_out1_clk_gen   20.00000   {0.00000 10.00000}    P,G         {clk_gen_u/inst/

plle2_adv_inst/CLKOUT0}

clk_out2_clk_gen  100.00001  {0.00000 50.00000} 

P,G         {clk_gen_u/inst/plle2_adv_inst/CLKOUT1}