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

ID 683082
日付 4/13/2020
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

2.4.1.1. 同期デザインを使用する

同期リセットにより、回路が完全に同期されます。 インテル® Quartus® Prime Timing Analyzerを使用すると、回路のタイミングを簡単に調整できます。

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

リセット信号がレジスターに到達する方法は2つあります。データ入力でゲートインするか、LABワイドの制御信号( synclr )を使用します。最初の方法を使用する場合、リセット信号に対応するために回路にゲート遅延を追加するリスクがあります。これにより、データ到着時間が長くなり、セットアップスラックに悪影響を及ぼします。 2番目の方法は、LAB内の各レジスターへの専用ルーティングに依存していますが、これは同じレジスターへの非同期リセットよりも低速です。

図 78. 同期リセット
図 79. LABワイド・コントロール信号

同期リセットのタイミング分析を検討するときは、外部同期リセットと内部同期リセットの2種類の同期リセットを検討してください。外部同期リセットは、FPGAの外部のクロックドメインに同期され、あまり一般的ではありません。パワーオン非同期リセットは、システムクロックの外部でデュアルランク同期され、FPGAに取り込まれます。 FPGA内で、レジスターへのデータ入力でこのリセットをゲートし、同期リセットを実装します。

図 80. 外部同期リセット

次の例は、回路図に相当するVerilog HDLを示しています。同期リセットを使用する場合、リセット信号は感度リストに入れられません。

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

Verilog HDL Code for Externally Synchronized Reset

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-minためset_input_delay制約と通常の入力信号としてreset_n信号を制約する必要があります。

SDC Constraints for Externally Synchronized Reset

# 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}]

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

図 81. 内部同期リセット

次の例は、回路図に相当するVerilog HDLを示しています。同期リセットの感度リストには、クロックエッジのみが含まれます。

Verilog HDL Code for Internally Synchronized Reset

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 Constraints for Internally Synchronized Reset

# 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周期幅未満の非同期入力リセットを拒否して、非同期入力リセットをデバウンスすることができます。

図 82. Pulse Extenderを使用した内部同期リセット

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

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