グローバル リセット信号の IP コア クロック領域への同期
HDL DUT IP コアと、HDL IP コアの AXI4 スレーブ インターフェイス ラッパーのアドレス デコーダー ロジックは、グローバル リセット信号によって駆動されます。AXI4 スレーブ インターフェイスをもたない HDL IP コアを生成する場合、HDL Coder™ は AXI4 スレーブ インターフェイス ラッパーを生成しません。グローバル リセット信号は IP コア リセット信号と同じになり、DUT の HDL IP コアを駆動します。AXI4 スレーブ インターフェイスをもたない IP コアを生成する方法の詳細については、ボードに依存しない HDL IP コアの Simulink モデルからの生成を参照してください。
HDL IP コアで AXI4 スレーブ インターフェイスを生成する際、グローバル リセット信号は、IP コア外部リセット、AXI インターコネクトのリセット信号、および IPCore_Reset
AXI レジスタへの書き込み時にアサートされるソフト リセットの 3 つのリセット信号によって駆動されます。詳細については、カスタム IP コア レポートを参照してください。この場合のグローバル リセット信号は DUT の HDL IP コアと AXI4 スレーブ ラッパーのアドレス デコーダー ロジックを駆動します。
IPCore_Clk
および AXILite_ACLK
は、同じクロック ソースに接続されていなければなりません。IPCore_RESETN
および AXILite_ARESETN
は、同じリセット ソースに接続されていなければなりません。
これらのリセット信号は、同期でも非同期でもかまいません。非同期リセット信号を使用すると問題が生じる可能性があり、リセットがクロックのラッチ ウィンドウ内でデアサートすると、フリップフロップでの潜在的なメタスタビリティの問題につながります。リセット信号を結合する際に準安定値が生成される可能性を回避するため、HDL Coder は、Reset Sync
ブロックによって示されているように、リセット同期ロジックを自動的に挿入します。リセット同期ロジックはグローバル リセット信号を IP コア クロック領域に同期します。このロジックは HDL ワークフロー アドバイザーを開いて IP Core Generation
ワークフローの [RTL コードと IP コアの生成] タスクを実行する際に挿入されます。
リセット同期ロジックには IPCore_CLK
信号と同期した 2 つの連続したフリップフロップが含まれています。このフリップフロップにより、IPCore_CLK
信号が高位の場合の 2 クロック サイクル後にリセット信号のデアサーションが必ず発生するようになります。この同期デアサーションにより、準安定値の可能性があるグローバル リセット信号の生成が回避されます。
このロジックは、モデルで [リセット タイプ] を [同期]
または [非同期]
のどちらに指定するかによって、異なる動作をします。[リセット タイプ] が [非同期]
の場合、同期ロジックはリセット信号を非同期でアサートし、リセット信号を同期的にデアサートします。たとえば、このコードは、非同期リセットの IP コアを生成するときに、生成されたリセット同期ロジックの Verilog® コードを示します。
... ... reg_reset_pipe_process : PROCESS (clk, reset_in) BEGIN IF reset_in = '1' THEN reset_pipe <= '1'; ELSIF clk'EVENT AND clk = '1' THEN IF enb = '1' THEN reset_pipe <= const_0; END IF; END IF; END PROCESS reg_reset_pipe_process; reg_reset_delay_process : PROCESS (clk, reset_in) BEGIN IF reset_in = '1' THEN reset_out <= '1'; ELSIF clk'EVENT AND clk = '1' THEN IF enb = '1' THEN reset_out <= reset_pipe; END IF; END IF; END PROCESS reg_reset_delay_process; END rtl;
[リセット タイプ] が [同期]
の場合、同期ロジックはリセット信号を同期的にアサートおよびデアサートします。たとえば、このコードは、同期リセットの IP コアを生成するときに、生成されたリセット同期ロジックの Verilog コードを示します。
... ... reg_reset_pipe_process : PROCESS (clk) BEGIN IF clk'EVENT AND clk = '1' THEN IF reset_in = '1' THEN reset_pipe <= '1'; ELSIF enb = '1' THEN reset_pipe <= const_0; END IF; END IF; END PROCESS reg_reset_pipe_process; reg_reset_delay_process : PROCESS (clk) BEGIN IF clk'EVENT AND clk = '1' THEN IF reset_in = '1' THEN reset_out <= '1'; ELSIF enb = '1' THEN reset_out <= reset_pipe; END IF; END IF; END PROCESS reg_reset_delay_process; END rtl;