リセット方式の分類と特徴
FPGA設計におけるリセット戦略は、回路の信頼性とタイミング収束に直接影響を与える重要な要素です。一般的に、リセット方式は「同期リセット」と「非同期リセット」の2つに大別されます。
- 同期リセット (Synchronous Reset): リセット信号のアサートおよびリリースがクロックのエッジに同期して行われます。タイミング解析が容易であり、メタステーブル(準安定状態)のリスクがありません。Xilinx FPGAなどのFDREプリミティブは同期リセット機能を備えており、リソースの効率的な利用が可能です。ただし、リセット動作にはクロックが必要です。
- 非同期リセット (Asynchronous Reset): クロックに依存せず、即座にリセットをかけることができます。しかし、リセット解除(リリース)のタイミングがクロックエッジと近接した場合、メタステーブルが発生し、回路が不安定になるリスクがあります。
以下に非同期リセットの一般的な記述例を示します。
always @(posedge sys_clk or negedge ext_rst_n) begin
if (!ext_rst_n) begin
reg_data <= 1'b0;
end else begin
reg_data <= data_in;
end
end
非同期リセット・同期リリース(Asynchronous Reset, Synchronous Release)
非同期リセットの即応性と、同期リセットの安定性を兼ね備えた設計手法として、「非同期リセット・同期リリース」が広く採用されています。この手法では、リセット信号のアサートは非同期で行い、リリース(解除)のみをクロックに同期させて行います。これにより、グローバルなリセット信号による組み合わせ回路の遅延増大を抑えつつ、リリース時のメタステーブルを防ぎます。
回路構成と実装例
実装例として、非同期リセット信号(ext_rst_n)を入力とし、内部で同期化されたリセット信号(core_rst_n)を生成するロジックを示します。
reg rst_meta;
reg core_rst_n;
// 非同期リセット・同期リリース回路
always @(posedge sys_clk or negedge ext_rst_n) begin
if (!ext_rst_n) begin
// 非同期アサート:即座にリセット
rst_meta <= 1'b0;
core_rst_n <= 1'b0;
end else begin
// 同期リリース:クロックに同期して解除
rst_meta <= 1'b1;
core_rst_n <= rst_meta;
end
end
// メインロジックへの適用
always @(posedge sys_clk or negedge core_rst_n) begin
if (!core_rst_n) begin
dout <= 1'b0;
end else begin
dout <= din;
end
end
タイミングとメタステーブルの挙動
この回路における波形の挙動は以下のようになります。
- T1(非同期アサート):
ext_rst_nがLowになると、クロックに関係なくrst_metaとcore_rst_nが即座にLowになります。クロックによるサンプリングを伴わないため、ここでメタステーブルは発生しません。 - T2(非同期リリース):
ext_rst_nがHigh(解除)になります。解除のタイミングがクロックエッジと近い場合、rst_metaのサンプリング値が不定になり、メタステーブルが発生する可能性があります。しかし、core_rst_nは1クロック前のrst_metaの値(Low)を保持するため、まだLowの状態を維持します。 - T3(安定化): 次のクロックエッジでは、
rst_metaは安定してHighになっている(またはメタステーブルから回復している)ため、core_rst_nにHighが伝播します。この結果、core_rst_nは必ずクロックドメインに同期したタイミングでHighになり、メインロジックに対してクリーンな同期リリースを提供します。
T2の動作は、本質的に非同期信号ext_rst_nを2段のフリップフロップで同期化する処理と同等です。これにより、システム全体を安全にリセット状態から解除できます。
電源投入時の初期状態に関する注意点
クロックが安定する前にリセット信号が解除(High)されてしまうシナリオを考えます。この場合、同期ロジックが動作していないため、core_rst_nの初期値(Xまたは0/1)に依存することになります。FPGAの初期値設定にもよりますが、意図したリセット期間が確保できないリスクがあるため、電源投入リセット(Power-On Reset, POR)回路を併用し、クロック安定後にリセットが解除されるように設計することが推奨されます。
Xilinx FPGAにおけるリセット設計ガイドライン
Xilinx社のFPGA(特に7シリーズ以降)におけるリセット設計では、リソースの削減とタイミング性能の向上のため、以下のガイドラインが推奨されています。
- リセットの最小化: データパス(データ処理フロー)においては、リセットを省略することが一般的です。新しいデータが到来すれば古いデータは上書きされるため、レジスタの初期値は重要になりません。
- 制御パスへのリセット適用: ステートマシン(FSM)や制御信号にはリセットを必ず挿入します。リセットなしでは電源投入時の状態が不定になり、システムが不整合な状態(例:アイドル状態以外)で動作を開始する恐れがあります。
- ストレージ制御信号: RAMやFIFOへのライトイネーブル信号など、制御パスに含まれる信号もリセットする必要があります。リセット中にこれらの信号が不定であると、意図せずメモリへの書き込みが発生する可能性があるため、初期化必須です。
このように、データパスと制御パスでリセット戦略を使い分けることで、効率的かつ安全なFPGA設計が可能となります。