• 締切済み

verilogでの記述、always@の使い方

verilogでの記述の仕方について質問です。 画像のようなタイミングチャートを考えています。 clkとplsは入力、dataが出力です。 構成は、  pls↑の次のclk↑で、dataをアサートする。 というのを考えています。 pls↑やclk↑は、posedgeを使えばよいと思うのですが、 私の考え通りに記述すると always @(posedge pls)begin @(posedge clk)begin data <= 1; end end こんな感じになるのか?となってしまいます。 @()begin end の中に@()beginを記述することが出来るのか というところから疑問です。 出来たとしても、これが私が意図したとおりに動作するのかがよくわかりません。 ネットで、 always @() @() と記述すると順序回路ができるとあったのですが、いまいち動作が分かりません。 どなたか、動作を教えていただけないでしょうか。 また、pls↑の次のclk↑で、dataをアサートする方法を教えていただけないでしょうか。 よろしくお願い致します。

みんなの回答

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

これは論理合成対象の回路なのでしょうか? だとしたら、 always @ のposedgeやnegedgeで参照する信号はクロックや非同期リセット信号のみでないと 上手く合成できないと思いますよ。 (合成できたとしても、よほど特殊な事情がなければ、クロック以外をFlipFlop(FF)のクロック端子になんて入れない方がいい。) 質問されている内容については、 plsを1サイクル遅延させた信号(pls_dとします)を作って、  pls & ~pls_d でplsの0→1変化を検出して、 それをトリガーにdata-FFに入力する値を(ifとか使って)変えればよいでしょう。 (もしplsが信号名の通り1サイクルのみ0になる信号なら、 わざわざ0→1変化の検出なんかしなくても、条件はpls==1'b0で良いです。) > @()begin end の中に@()beginを記述することが出来るのか > というところから疑問です。 @はイベントが発生するまで待機するということですので 入れ子にすること自体は可能ですが、 シミュレーション用記述以外でそのような書き方をしてはいけません。(合成できない。)

kokoro_iki
質問者

お礼

回答ありがとうございます。参考になりました。 確かに、pls & ~pls_dを使えば検出できますね。 色々試してみたいと思います。

すると、全ての回答が全文表示されます。
  • eon_ion
  • ベストアンサー率30% (7/23)
回答No.1

always @() @() で何ができあがるのかは私もよく分かりませんが、ご希望の回路は以下で実現出来ないでしょうか? reg<= 1'b0; //regはdata入力の条件判定で使用 always@(posedge pls)begin reg <= 1'b1; end always@(posedge clk)begin if(reg==1'b1)begin data <= 1'b1; reg <= 1'b0; end end 上を日本語で書くと、 最初のplsの立ち上がりでregに1がセットされる。 clkの立ち上がり時にregに1がセットされていれば、dataに1をセットし、regを0に戻す。 となります。 regを使ってご希望の回路を実現出来ているのではないかと思うのですが、如何でしょうか?

kokoro_iki
質問者

お礼

回答ありがとうございます。参考になりました。 確かに、実現できているように思います。 色々と試してみたいと思います。

すると、全ての回答が全文表示されます。

関連するQ&A