FC2カウンター FPGAの部屋 FPGAの非同期リセットと同期リセットの比較(ダイナミック点灯回路)
FC2ブログ

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

FPGAの部屋

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

FPGAの非同期リセットと同期リセットの比較(ダイナミック点灯回路)

FPGAの非同期リセットと同期リセットの比較をSpartan3 Starter Kitのダイナミック点灯回路でやってみることにした。
最初にそのまま、インプリメントしてみた。その次に非同期リセットを同期リセットに変更してインプリメントしてみた。
どうやって直したかというと、こういうのを

    process(reset, clk) begin -- Lighting frequency is 1KHz
        if reset='1' then
            lcnt <= (others => '0');
        elsif clk'event and clk='1' then
            if lcnt = conv_std_logic_vector(clk_frequency, 16) then
                lcnt <= (others => '0');
            else
                lcnt <= lcnt + 1;
            end if;
        end if;
    end process;


こうした。

    process(clk) begin -- Lighting frequency is 1KHz
        if clk'event and clk='1' then
            if reset='1' then
                lcnt <= (others => '0');
            elsif lcnt = conv_std_logic_vector(clk_frequency, 16) then
                lcnt <= (others => '0');
            else
                lcnt <= lcnt + 1;
            end if;
        end if;
    end process;


この結果、非同期リセットのMAPの結果は以下の通り。

Design Summary
--------------
Number of errors:      0
Number of warnings:    2
Logic Utilization:
  Number of Slice Flip Flops:          22 out of   3,840    1%
  Number of 4 input LUTs:              72 out of   3,840    1%
Logic Distribution:
  Number of occupied Slices:                           46 out of   1,920    2%
    Number of Slices containing only related logic:      46 out of      46  100%
    Number of Slices containing unrelated logic:          0 out of      46    0%
      *See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs:             87 out of   3,840    2%
  Number used as logic:                 72
  Number used as a route-thru:          15
  Number of bonded IOBs:               19 out of     173   10%
    IOB Flip Flops:                     5
  Number of GCLKs:                     1 out of       8   12%

Total equivalent gate count for design:  750
Additional JTAG gate count for IOBs:  912
Peak Memory Usage:  135 MB
Total REAL time to MAP completion:  10 secs 
Total CPU time to MAP completion:   6 secs 


次に、同期リセットに修正したMAP結果は以下の通り。

Design Summary
--------------
Number of errors:      0
Number of warnings:    2
Logic Utilization:
  Number of Slice Flip Flops:          22 out of   3,840    1%
  Number of 4 input LUTs:              33 out of   3,840    1%
Logic Distribution:
  Number of occupied Slices:                           27 out of   1,920    1%
    Number of Slices containing only related logic:      27 out of      27  100%
    Number of Slices containing unrelated logic:          0 out of      27    0%
      *See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs:             48 out of   3,840    1%
  Number used as logic:                 33
  Number used as a route-thru:          15
  Number of bonded IOBs:               19 out of     173   10%
    IOB Flip Flops:                     5
  Number of GCLKs:                     1 out of       8   12%

Total equivalent gate count for design:  507
Additional JTAG gate count for IOBs:  912
Peak Memory Usage:  135 MB
Total REAL time to MAP completion:  11 secs 
Total CPU time to MAP completion:   7 secs


Number of Slice Flip Flops:は22で同じだけれども、Number of 4 input LUTs: は非同期リセットが72、同期リセットが33で、同期リセットのほうが半分以下になっている。
さらにFloorplanerでも比較してみた。右が非同期リセット、左が同期リセットだ。
dinadisp_test_fp_071211.png

やはり、明らかに同期リセットのほうが使用SLICEが少ない。
こんなに違うのは、なんかおかしい気がするが、同期リセットのほうがかなり有利ということになるのだろうか?一応、ちょっとは双方の回路ともシミュレーションしてあるが、実機に入れて確かめてはいない。
もう少し検証してみようと思う。
  1. 2007年12月11日 22:58 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:12

コメント

こんばんは
すごい効果がでていますね。でも、節約がヒットしやすい回路だった気がするのですが。
※以下、LUT意識の合成をしていないので誤解がありましたら御免なさい。
・節約できるパタンは、LUT入力が、約4n+1の時だけということだと理解しましたが。つまり、約5入力だからLUT1個節約できたが、約4入力では変わらない。また、LUT2個が1個になれば50%ですが、LUTが20個連結されたときでも最後の1個が節約できることも、ある、ということになると思います。その場合、節約率はずいぶん小さくなります。
・Virtex5はたぶん6入力LUTなので、この節約できる割合が減ってくるのでしょう。
・非同期リセットは、ある意味便利なので使っていることがあると思います。起動時の外部リセットは通常そのままでは非同期ですし。私の場合、基本処理CLKと高速IO用CLKはDLLを使っても同期していないので、同一のリセットで2系統をリセットする場合、非同期も例外的に使用します。
(以上に理解に間違い無かったことを前提に)
従って、”テクニックとして覚えておくと有効”という感じのものと考えています。良い情報と思います。

話はさかのぼりますが、
>もしやるとしたら、こうするかも? DFFを2段くらいにしておいて、
非同期リセットで懸念されているのは、メタステーブルでしょうか。であるならその話も哲学的には深いのかも知れませんが、私はリセット後アイドル2CLK以上あれば問題ないものと理解しています。
  1. 2007/12/11(火) 23:32:47 |
  2. URL |
  3. NSX #-
  4. [ 編集 ]

NSXさん、こんにちは。
私も節約できるパターンだったんだと思います。でも、FPGA Editorで見たところSLICEのFFのREV入力に入っているSLICEはありませんでした。ということは、節約できるパターンを使っていないということですよね?たまたまXSTの最適化のつぼにはまったのでしょうか?ちがう回路、ステートマシンが入っているものなどで確かめてみようと思います。
うちのボードも動作クロックが複数あるので悩みどころですが、そのクロックで同期化してやれば良いと思っています。
リセットのメタステーブルで、怖いのはリセットを解除するときに、リセットが全体の回路で伝播する際に1クロック時間以上ずれないか?ということです。ずれないならばよいと思いますが、全体でリセットが解除されるクロックが違ってしまうという状態はぜひともさけたいと思っています。保険のためにDFFを2段くらいにしておくのが良いんじゃないかなと思っています。
  1. 2007/12/12(水) 05:03:08 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

>SLICEのFFのREV入力に入っているSLICEはありませんでした
すみません、私は、FPGA Editor自体使用しない平凡な合成しかしないので、知識がありません。
(使うときはmarseeさんのブログを見て教わりながらやってます)
xcell記事からFDRSEの同期SETの分が1個節約できるので、約4n+1の時だけということだと理解したのですが。だからベストパタンで50%に近づきます。しかしこの回路は、16bitカウンタで一様にランダム性もある気がします。合成比較では、total LUTで、48/87=55%。これでは効果ありすぎと思います。記事からは読み取れない何か他にカラクリがあるのかな。効果ありすぎなのでおそらく他の回路でも程度はあっても一様に効果あると思います。
  1. 2007/12/12(水) 12:17:00 |
  2. URL |
  3. NSX #-
  4. [ 編集 ]

NSXさん、こんにちは。
なんかおかしいですよね。どこか間違えているか?勘違いしているか?
違うのでもやってみようと思うんですが、セミナに行くので、終わってからやります。
  1. 2007/12/12(水) 20:07:57 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

ずいぶんと前から、Xilinxは最適化の為に同期リセットを推奨しています。

合成/シミュレーション デザイン ガイド
http://toolbox.xilinx.com/docsan/xilinx9j/books/docs/sim/sim.pdf

P53から
「同期システムで非同期リセットを使用することによってタイミング解析が困難になることはよく知られていますが、最適化に影響することはあまり知られていません。」

Xilinxで速い回路を書く必要があるときは同期リセットを積極的に使う必要があります。
またLUTをシフトレジスタとして使うためにあえてリセットを入れない、等の小技を駆使する必要があります。
最適化の技をいくつか知っておくと、いざというときに役に立つかもしれませんね。
  1. 2007/12/13(木) 10:27:14 |
  2. URL |
  3. なつたん #-
  4. [ 編集 ]

なつたんさん、こんばんは。
いま、セミナから帰って食事したところです。横浜まで家から3時間かかるので、きついです。今日は目を使いすぎて頭が痛いです。
教えていただいて、ありがとうございました。同期リセットにして早くなるなんで、思いもしませんでした。もう少し検証してみようと思います。
  1. 2007/12/13(木) 21:50:16 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

FDのCLRやSETを論理入力として使うようになるため、もともと少ないLUTの入力を、より意味のある信号として使えるようになるためだったと思います。
以前TechXClusiveか何かで、同期リセットのほうがよいと書かれていたのを覚えています。それ以来私は同期リセット派です。
  1. 2007/12/16(日) 23:36:50 |
  2. URL |
  3. なひたふ #-
  4. [ 編集 ]

なひたふさん、コメントありがとうございます。

同期リセットのほうが有利みたいですね。なひたふさんは、同期リセットの場合には、やはり外部の非同期リセット信号をFFで同期化して入れていらっしゃいますか? 
その場合には、外部の非同期リセット信号を同期化するFFのリセットは使用しないですよね? 非同期リセットにつなぐとおかしくなってしまいそうですね? これでシミュレーションは大丈夫かな? 一度確かめてみようと思います。
  1. 2007/12/17(月) 05:41:10 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

私の場合は、外部の非同期リセット入力はめったに使いません。というかリセット入力自体をめったに使いません。
FPGA内にタイマーを仕込んでおいて、そのタイマーの出力を利用して、必要最小限の部分だけリセットすることが多いです。
  1. 2007/12/17(月) 09:59:32 |
  2. URL |
  3. なひたふ #-
  4. [ 編集 ]

なひたふさん、お答えいただいて、ありがとうございます。
電源ONの時には、水晶発信器のクロックが安定しないので、FPGAの内部回路の動作は正常動作するかどうかわからないので、必ず水晶発信器のクロック安定時間よりも長いリセット信号を入れてリセットする。
というように考えていたのですが、そこまでしなくても大丈夫そうですね。
  1. 2007/12/17(月) 10:29:01 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

みなさま、お疲れ様です。
marseeさん、なんだか変な問題定義をしてしまいみなさまにお時間取らせてしまい恐縮しています。

なひたふさんが仰るように私も必要最小限の同期リセット派なのですが、前の投稿でもお話ししたように多段タップのフィードバックするフィルターロジックをピンポイントでリセットしてもModelsimのシミュレーションはタップ間に存在するドンドケアが回ってしまい・・・

リセットは非同期がいい?というご質問をさせていただいた次第でした。(笑)まぁ、個別回路のリセット問題云々は別にしてもリセットは動作スピードとリソースに大きく影響するようなので重要な要素であることは間違いないですね。
  1. 2007/12/17(月) 14:14:20 |
  2. URL |
  3. hypermac #-
  4. [ 編集 ]

hypermacさん、こんにちは。

同期リセットについて、教えていただいてありがとうございます。
いろいろやってみていますが、いろんな疑問が出てきます。
  1. 2007/12/17(月) 17:39:09 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


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

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