ソースシンクロナス出力インターフェイスでは、FPGA がデスティネーション・デバイス用のクロックのソースです。センターアラインのソースシンクロナス・インターフェイスでは、クロック移行がデータ有効ウィンドウの中央で発生します。図 1 は、ソースシンクロナス出力インターフェイスのサンプルを示しています。
以下のステップを使用して、センターアラインのソースシンクロナス出力インターフェイスを制約します。
- ベースクロックおよび派生クロックを作成する
- 出力遅延の制約を追加する
- タイミング分析およびレポートから無効なパスを除外するため、フォルスパス例外を追加する
上記ステップに関する詳細や、下記の計算および制約に関する詳細は、AN 433: ソースシンクロナス・インターフェイスの制約および分析 (PDF) を参照してください。
クロック数
FPGA の入力ポートにはベースクロックが必要です。
生成クロックは、すべての位相同期回路 (PLL) 出力で必要です。ダブル・データ・レートのセンターアラインのソースシンクロナス出力は、出力クロックをデータクロックとの比較で 90 度シフトします。
派生クロックは、FPGA の出力クロックポートで必要です。派生クロックは、データバスの出力遅延値のクロック・リファレンスです。
出力遅延の制約
最大スキュー仕様を使用して、出力遅延値を計算できます。最大スキュー仕様は、データバスの各ビットが FPGA から移動するまでの許容時間のバリエーションを示しています。
出力最大遅延値は (ユニット・インターバル / 2) - 最大スキュー値です。
出力最小遅延値は 最大スキュー値 - (1.5 * ユニット・インターバル) です。
フォルスパス例外
このセンターアラインの例では、ソースおよびデスティネーションのクロック遷移の立ち上がりと立ち下がりでデータが転送されます。フォルスパス例外を使用して、クロックの立ち上がりから立ち下り、および立ち下りから立ち上がりの遷移をカットします。これは逆エッジのクロック遷移ではデータが転送されないからです。
サンプル SDC ファイル
# Create a base clock on the input port of the FPGA, with a 10 ns period
create_clock -name input_clock -period 10 [get_ports clk_in]
# Create generated clocks on the PLL outputs
# Output clk[0] drives the data register
# Output clk[1] drives the output clock port with a 90 degree shift
create_generated_clock -name data_clock -source [get_pins pll|inclk[0]] \
[get_pins pll|clk[0]]
create_generated_clock -name clock_clock -phase 90 -source [get_pins pll|inclk[0] \
[get_pins pll|clk[1]]
# Create the generated clock on the output clock port of the FPGA
create_generated_clock -name output_clock -source [get_pins pll|clk[1]] \
[get_ports clk_out]
# Add maximum and minimum output delay constraints
# assuming a skew requirement of +/- 250ps
# Use the equations for the output delay values listed above
set_output_delay -max -clock output_clock [expr { (5 / 2) - 0.250 }] \
[get_ports data_out*]
set_output_delay -max -clock output_clock -clock_fall \
[expr { (5 / 2) - 0.250 }] [get_ports data_out*] -add
set_output_delay -min -clock output_clock [expr { (0.250 - (1.5 * 5) }] \
[get_ports data_out*]
set_output_delay -min -clock output_clock -clock_fall \
[expr { (0.250 - ( 1.5 * 5 ) }] [get_ports data_out*] -add
# Add false path exceptions for cross-clock transfers
set_false_path -setup -end -rise_from [get_clocks data_clock] \
-fall_to [get_clocks output_clock]
set_false_path -setup -end -fall_from [get_clocks data_clock] \
-rise_to [get_clocks output_clock]
set_false_path -hold -end -rise_from [get_clocks data_clock] \
-fall_to [get_clocks output_clock]
set_false_path -hold -end -fall_from [get_clocks data_clock] \
-rise_to [get_clocks output_clock]