クロックドメイン間でワイドレジスタを渡すためのバスシンクロナイザー回路があります。
非同期リセットロジックを省略して、簡単な説明を提供します。
データは1クロックで生成されます。更新には多くの(少なくとも1ダース)クロックエッジがあります。
PROCESS (src_clk)
BEGIN
IF RISING_EDGE(clock) THEN
IF computation_done THEN
data <= computation;
ready_spin <= NOT ready_spin;
END IF;
END IF;
END PROCESS;
NRZIエンコードされた新しいデータの制御信号(バス上の有効なワードは制御信号の遷移に対応します)。制御信号は、シンクロナイザーとして機能するDFFチェーンを通過します。
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
ready_spin_q3 <= ready_spin_q2;
ready_spin_q2 <= ready_spin_q1;
ready_spin_q1 <= ready_spin;
END IF;
END PROCESS;
シンクロナイザ回路は短い遅延を導入し、データバスが安定するのに十分な時間を提供します。データバスは、準安定性のリスクなしに直接サンプリングされます。
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
IF ready_spin_q3 /= ready_spin_q2 THEN
rx_data <= data;
END IF;
END IF;
END PROCESS;
これはコンパイルされ、Cyclone II FPGAに合成されたときにうまく機能します。ただし、TimeQuestはシンクロナイザーを認識しないため、セットアップおよびホールドタイム違反を報告します。さらに悪いことに、Quartusマニュアルによると
最悪のたるみを示すパスの改善に焦点を当てます。フィッターは、スラックが最悪のパスで最も強く機能します。これらのパスを修正すると、Fitterはデザイン内の他のエラータイミングパスを改善できる可能性があります。
したがって、QuartusがFitterの作業をデザインの他の領域に費やすことができるように、プロジェクトに適切なタイミング制約を追加したいと思います。
私はかなり確信しているset_multicycle_path
データ・ラインが安定するデスティネーションクロックの複数のサイクルを持つことになりますから、適切なSDC(概要設計制約)コマンドですが、私はクロック・ドメイン・クロッシング・ロジックを記述するために、このコマンドを使用して、任意の完全な例を見つけることができません。
シンクロナイザのSDCタイミング制約の記述に関するガイダンスを本当に感謝します。このアプローチで問題が発生した場合は、それもお知らせください。
時計の詳細:
外部クロックジェネレーター:2チャネル、refclk = 20 MHz、refclk2 = refclk / 2(10 MHz、および関連)。
アルテラPLL:src_clk = refclk * 9/5 = 36 MHz
アルテラPLL:dest_clk = refclk2 * 10 = 100 MHz
また、100 MHzのsrc_clkと36 MHzのdest_clkを使用して、他の方向に向かうデータもあります。
TL; DR:上記のコードの正しいSDCタイミング制約は何ですか?