14歳の自分に衝撃の事実を告げてください

以下のVerilog記述についてどの様な記述が一般的か教えてほしい
のですが?
QuartusIIにて合成を行っているのですが、
「Can't resolve multiple constant drive for net ****」の
エラーメッセージが発生します。
記述は以下の様なもので、別々のクロックでalways内から同じ変数
に代入しています。これが問題の様ですが、これを回避するための
一般的な処理方法はどの様にすればよいのでしょうか?
Verilog初心者で、この様な処理自体がナンセンスなのかもしれません
が、どなたか分かる方御願い致します。

【抜粋のため分かり難いですが記述内容は以下の様なもの】
always@(posedge clkB)
begin
:
ClrV<= 1'b1;
:
end

always@(posedge clkA)
begin
:
if(ClrV)
ClrV<= 1'b0;
:
end

以上

A 回答 (1件)

通常HDL言語ではこのような利用方法はできないのではないでしょうか。


ハードウエア記述言語ですから、質問の回路をイメージすると
clkBで記述された回路がIC1、
clkAで記述された回路がIC2、
と考えると、IC1のなかでIC2の中の回路を直接変更し
するような回路になりますよね。(逆もまた真なりですが)

そもそもどういう状況でこういう記述がしたいか、なのですが
たぶん、考え方を変える必要があるのだとおもいます。
おそらくはワンショットパルスのような感じなのでしょうか。
それにしても複数シグナルのエッジで処理する必要はなさそうですよね。
仮にそうだとすればリセット付き回路にでもすればすみそうですね。
clkAで
ClrV<= 1'b0;
としている信号を別の信号名に変えて、clkBのほうにこの信号をリセット
入力としていれてしまえばよさそうです。

とにかく、HDLはハード記述言語ですから、マイコン用言語はちがう
思想をもちこまないとうまくいかないものもおおいとおもいます。
簡単な回路であれば、上述の方法ですませられるでしょうし、すこし
込み入ってくる可能性があるのであればステートマシンを構成して
しまったほうがわかりやすいかもしれません。
    • good
    • 0
この回答へのお礼

誠に有難う御座いました。
記述方法として、ご指摘の内容も検討したのですが、我流で、一般的なのかどうか分からず考え込んでいました。

また、「マイコン用言語はちがう思想・・・」という言葉には
鋭いものを感じました。
確かにVerilog言語は今回が初めてで、Windowsアプリを主に行っておりましたので、その感覚で記述していました。
おかげ様で、少しイメージできたと思います。

お礼日時:2008/02/14 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報