インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

2.3.1.1. 同期リセットの使用

同期リセットにより、回路が完全に同期していることを保証します。回路のタイミングは、 インテル® Quartus® Primeのタイミング・アナライザーで簡単に測定することができます。

互いに同期しているクロックがリセット信号を起動してラッチするため、データ到着時間とデータ所要時間を容易に特定し、適切なスラック解析を行うことができます。同期リセットは、サイクルベースのシミュレーターでの使用が簡単です。

2つの方法により、リセット信号をレジスターに届けることができます。1つはデータ入力とゲートで入力する方法、2つ目はLAB全体のコントロール信号 (synclr) を使用する方法です。最初の方法を使用する場合は、回路にゲート遅延が追加されるリスクを伴いリセット信号に対応します。よって、データ到着時間が長くなり、セットアップ・スラックに悪影響がおよびます。2番目の方法では、各レジスターに対するLAB内の専用配線に依存します。ただし、これは同じレジスターへの非同期リセットに比べて低速です。

図 16. 同期リセット
図 17. LAB全体のコントロール信号

同期リセットのタイミング解析を検査する際は、2種類の同期リセット (外部同期リセットと内部同期リセット) を考慮します。外部同期リセットは、FPGA外部のクロックドメインに同期しており、あまり一般的には使用されません。電源投入時の非同期リセットは、外部でシステムクロックにデュアルランク同期され、FPGAにもたらされます。FPGA内では、このリセットとレジスターへのデータ入力をゲーティングし、同期リセットを実装します。

図 18. 外部同期リセット

次の例は、上の回路図に相当するVerilog HDLを示しています。同期リセットを使用している場合、リセット信号はセンシティビティー・リストに入りません。

次の例では、内部同期リセットに対して必要な変更を示しています。

外部同期リセットに対応するVerilog HDLコード

module sync_reset_ext (
         input   clock,
         input   reset_n,
         input   data_a,
         input   data_b,
         output  out_a,
         output  out_b
         );
reg      reg1, reg2
assign   out_a  = reg1;
assign   out_b  = reg2;
always @ (posedge clock)
begin
     if (!reset_n)
     begin
         reg1     <= 1’b0;
         reg2     <= 1’b0;
    end
    else
    begin
         reg1     <= data_a;
         reg2     <= data_b;
    end
end
endmodule     //  sync_reset_ext

次の例は、外部同期リセットの制約を示しています。外部リセットは同期リセットであるため、-max および -minset_input_delay 制約で reset_n 信号を通常の入力信号として制約するだけです。

外部同期リセットに向けたSDC制約

# Input clock - 100 MHz
create_clock [get_ports {clock}] \
        -name {clock} \
        -period 10.0 \
        -waveform {0.0 5.0}
# Input constraints on low-active reset
# and data
set_input_delay 7.0 \
        -max \
        -clock [get_clocks {clock}] \
        [get_ports {reset_n data_a data_b}]
set_input_delay 1.0 \
        -min \
        -clock [get_clocks {clock}] \
        [get_ports {reset_n data_a data_b}]

多くの場合、デバイスに入るリセットは非同期で、レジスターに送信される前に内部で同期する必要があります。

図 19. 内部同期リセット

次の例は、上の回路図に相当するVerilog HDLを示しています。同期リセットのセンシティビティー・リストには、クロックエッジのみが含まれます。

内部同期リセットに対応するVerilog HDLコード

module sync_reset (
		input clock,
		input reset_n,
		input data_a,
		input data_b,
		output out_a,
		output out_b
		);
reg 	reg1, reg2
reg 	reg3, reg4

assign 	out_a = reg1;
assign 	out_b = reg2;
assign 	rst_n = reg4;

always @ (posedge clock)
begin
	if (!rst_n)
	begin
		reg1 <= 1’bo;
		reg2 <= 1’b0;
	end
	else
	begin
		reg1 <= data_a;
		reg2 <= data_b;
	end
end

always @ (posedge clock)
begin
	reg3 <= reset_n;
	reg4 <= reg3;
end
endmodule // sync_reset

SDC制約は外部同期リセットに対する制約と類似していますが、入力リセットは非同期であるため制約できません。set_false_path ステートメントで入力パスを切断し、このようなパスが制約のないパスとみなされないようにします。

内部同期リセットに向けたSDC制約

# Input clock - 100 MHz
create_clock [get_ports {clock}] \
        -name {clock} \
        -period 10.0 \
        -waveform {0.0 5.0}
# Input constraints on data
set_input_delay 7.0 \
        -max \
        -clock [get_clocks {clock}] \
        [get_ports {data_a data_b}]
set_input_delay 1.0 \
        -min \
        -clock [get_clocks {clock}] \
        [get_ports {data_a data_b}]
# Cut the asynchronous reset input
set_false_path \
        -from [get_ports {reset_n}] \
        -to [all_registers]

同期リセットの問題は、シンクロナイザーのフリップフロップへの非同期入力における短いパルス (1周期未満) に対する動作です。これは欠点になる場合があり、非同期リセットが最初のフリップフロップでキャプチャーされることを保証するには、少なくとも1周期幅のパルス幅が必要です。ただし、この回路ではノイズ耐性が高まるという点で、利点と考えることもできます。非同期入力での意図しないパルスは最初のフリップフロップでキャプチャーされる可能性が低くなるため、このパルスで同期リセットはトリガーされません。場合によっては、ノイズ耐性をさらに高めるために、幅が n 周期未満の非同期入力リセットを拒否することで、非同期入力リセットをデバウンスすることができます。

図 20. パルス・エクステンダーを使用する内部同期リセット

ジャンクションのドットはステージの数を示します。より多くのフリップフロップを使用すると、より多くのクロックサイクルにわたるより広いパルスを得ることができます。

デザインには多くの場合、複数のクロック信号があります。このような場合は、個別のリセット同期回路をデザインの各クロックドメインに使用します。PLL出力クロックにシンクロナイザーを作成している場合、これらのクロックドメインは、PLLがロックされてPLL出力クロックが安定するまでリセットされません。PLLにリセットを使用する場合、このリセットはPLLの入力クロックと同期している必要はありません。非同期リセットを使用することができます。内部同期リセットを使用している場合にPLLへのリセットを使用すると、PLL出力クロックドメインへの同期リセットのアサートはさらに遅延します。