FC2カウンター FPGAの部屋 FPGAの非同期リセットと同期リセットの比較
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

FPGAの非同期リセットと同期リセットの比較

hypermacさんに教えていただいたXcell Journal Issue 55の”デザインパフォーマンス向上のためのHDL コーディング法”を見ると非同期リセットを使うと論理合成ルールでの推論(SRL16、BRAM)やロジックの最適化を妨げる場合があるとのことだった。
私は、SRL16やBRAMはプリミティブをインスタンシエーションしているので問題ない。しかし、ロジックの最適化は気になるところである。
とりあえず、デザインパフォーマンス向上のためのHDL コーディング法のVerilog Sample #2をSuzakuに載っているVirtex4FXでやってみることにした。Xell Journal のVerilogコードと同一だが、一応、コードを載せておく。

`default_nettype none
`timescale 1ns / 1ps

module reset_test(clk, reset, a, b, c, d, e, q);
    input clk;
    input reset;
    input a;
    input b;
    input c;
    input d;
    input e;
    output q;
    wire clk, reset, a, b, c, d, e;
    reg q;
    
    always @(posedge clk)
        if (reset)
            q <= 1'b0;
        else
            q <= a | (b&c&d&e);
endmodule


論理合成すると下のようになった。
sync_reset_1_071209.png

ここでは普通の論理合成結果になった。”デザインパフォーマンス向上のためのHDL コーディング法”の”図2 より柔軟なLUT の推論”とは違っている。これをインプリメントして、FPGA Editorで見るとこうなった。


入力aがFFのREVに入っていて、その他のロジックは1つのLUTですんでいる。よって、”図2 より柔軟なLUT の推論”と同様になった。これはMAPでやっているのだと思う。1つのSLICEのみ使用している。ちなみに、デフォルトのままだとOLOGICのFFを使ってしまうので、IOBのFFを使わないようにUCFに書いた。

INST "q" IOB = FALSE;


比較のために非同期リセットにしてやってみた。Verilogコードのうちのalways@ をこう変更した。

always @(posedge reset, posedge clk)


論理合成の結果は、同期リセットと変化がなかった。その後、インプリメントして、同様にFPGA Editorで見てみた。
async_reset_1_SLICE_071209.png

同期リセットの時には、1つのLUTとFFのみ使用したが、非同期リセットの時には2つのLUTとFFを使用している。
”デザインパフォーマンス向上のためのHDL コーディング法”で言われているように同期リセットだとロジックと遅延を低減する効果があるようだ。

hypermacさん、教えていただいて、ありがとうございます。SLICE内のFFに同期リセットオプションがあるのを知りませんでした。これだったら、もしクロックが安定しなくて、変なステートに行っても確実にリセットがかけられますね。
もうちょっと複雑な回路を同期リセットと非同期リセットでどうなるか?比べてみようと思います。
  1. 2007年12月09日 20:14 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:4

コメント

これですねー
3年ぐらい前に筆者仲間で議論になりましたが,結論的には
FPGA屋vsASIC屋の考え方の話で決着がつきましたね.
#どっちがえらいとか関係なく,FPGAにはこの方式が合っているが
#ASIC屋は余計なファンアウトを増やしたくない.

このほか,制御用レジスタでよく使われるであろう同期式レジスタ書き込みさえも,ASICでは余りやらないし.

適材適所で論理合成が勝手に推論してくれないかしら?と思っています.
  1. 2007/12/10(月) 00:35:51 |
  2. URL |
  3. まさちく #-
  4. [ 編集 ]

まさちくさん、おはようございます。お久しぶりです。
それでは、まさちくさんもFPGAでは非同期リセットではなく、同期リセットを入れていますか?
多少複雑なステートマシンでも、同期リセットで書くと必ずSLICEのFFの同期リセット端子を使ってくれるのでしょうか?
ファンアウトはどっちでも同じのような気がしますが、違うのでしょうか?
  1. 2007/12/10(月) 05:32:12 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

僕も以前同じ記事を読んで調べてみたのですが、SRのリセットを使うかどうかは場合によりけりだったと思います。
前段のLUTの入力が空いてる時はLUTの組合せロジックになっていて、意外と賢いなと思いました。
  1. 2007/12/11(火) 12:24:35 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

windyさん、こんにちは。

もうちょっと、大きな回路で調べてみたのですが、だいぶ回路規模が違ってしまいました。今朝、時間がなかったので、今夜記事を書きます。
たまたまかもしれませんが、こんなに変わるものかと驚いています。
  1. 2007/12/11(火) 12:28:18 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/676-c8dc70f9
この記事にトラックバックする(FC2ブログユーザー)