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

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

FPGAの部屋

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

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

今度はVerilogのDDR-SDRAMコントローラでやってみようと思って、非同期リセットの変えたつもりでやってみたら、使用LUTが変わらない。これはおかしいと思って、FPGA Editorで見てみたら、非同期リセットが使われていた。どうしてだろうか?
ソースコードはこれ。(だけじゃないけど。。。全部同期リセットにしたつもり)(使用ツールはISE9.2iSP3、使用デバイスはスパルタン3E、xc3s500e-4fg320)

    always @(posedge clk) begin
        if (reset) begin
            pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
            pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
        end else begin
            if (int_cnt != 0) // int_cntが0までカウント
                pre_cnt <= pre_cnt + 1;
            else begin
                pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
                pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
            end
        end
    end


Verilogに詳しい方どうでしょうか? これで同期リセット記述になっていますよね?
ちなみにこれでもだめだった。

    always @(posedge clk) begin
        if (reset) begin
            pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
            pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
        else if (int_cnt != 0) // int_cntが0までカウント
            pre_cnt <= pre_cnt + 1;
        else begin
            pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
            pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
        end
    end


これを論理合成して、"View RTL Schematic"で見るとこうなる。
sync_reset_FF_1_071216.png

FDCは非同期リセット付きFFで、FDPは非同期セット付きFFだ。つまりどちらも非同期セット、リセットしている。どうしたら同期セット、リセットになるのだろうか?
ちなみにXSTのプロパティのXilinx Specific Options の Use Synchronous Set と Use Synchronous Reset オプションは両方ともYes になっている。
しょうがないので、XSTのプロパティの HDL Options の Asynchronous To Synchronous オプションをチェックしたら、同期セット、リセットとなった。
これを論理合成して、"View RTL Schematic"で見るとこうなる。
sync_reset_FF_2_071216.png

FDRは同期リセット付きFF、FDSは同期セット付きFF。これで思い通りになったが、釈然としない。
Verilogコードが間違っているとか、または、何か他の情報を持っているという方は教えてください。一応、Xilinxのアンサーサーチをあさったのですが、情報がありませんでした。

2007/12/18 追記: sueさんに教えてもらった結果を見て、単純なカウンタをやってみました。これはちゃんと同期リセットになりました。そこでもう一度プロジェクトを作り直したら、FDRとFDSを使うようになりました。何かプロジェクトがおかしかったみたいです。
sueさん、ありがとうございました。
  1. 2007年12月16日 22:00 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:2

コメント

こんにちは
ためしに、同期リセットと非同期リセットのレジスタを作ってみました。
デバイスはSpartan3でISE9.1iSP3です

結果は正しく合成されますね(Async to Syncはチェックしてません)
ついでに、同期リセット信号を非同期リセットのレジスタで使用しても、影響はありませんでした。
  1. 2007/12/18(火) 14:50:02 |
  2. URL |
  3. sue #-
  4. [ 編集 ]

sueさん、ありがとうございます。

追記したとおりです。
  1. 2007/12/18(火) 20:43:19 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


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

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