今度は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"で見るとこうなる。

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

FDRは同期リセット付きFF、FDSは同期セット付きFF。これで思い通りになったが、釈然としない。
Verilogコードが間違っているとか、または、何か他の情報を持っているという方は教えてください。一応、Xilinxのアンサーサーチをあさったのですが、情報がありませんでした。
2007/12/18 追記: sueさんに教えてもらった結果を見て、単純なカウンタをやってみました。これはちゃんと同期リセットになりました。そこでもう一度プロジェクトを作り直したら、FDRとFDSを使うようになりました。何かプロジェクトがおかしかったみたいです。
sueさん、ありがとうございました。
- 2007年12月16日 22:00 |
- FPGAのリセットについて
-
| トラックバック:0
-
| コメント:2
こんにちは
ためしに、同期リセットと非同期リセットのレジスタを作ってみました。
デバイスはSpartan3でISE9.1iSP3です
結果は正しく合成されますね(Async to Syncはチェックしてません)
ついでに、同期リセット信号を非同期リセットのレジスタで使用しても、影響はありませんでした。
- 2007/12/18(火) 14:50:02 |
- URL |
- sue #-
- [ 編集 ]