• 締切済み

Verilog-HDLのFF記述について

先程アップしたのは、図が変になってしまいました。 改めて質問します。 1つのFF(非同期リセット)をVerilog-HDLで記述すると、以下のように記述出来ますよね? always @ ( posedge CLK or negedge RESET ) begin if ( !RESET ) begin Q <= 1'b0 ; xQ <= 1'b1 ; end else begin Q <= D ; xQ <= ~D ; end end この1つのFFをalways文を2つ使って記述出来るんですか? ご回答宜しくお願いします。

みんなの回答

回答No.1

目的、趣旨が良く判りませんが、敢えて回答するなら、 always @ ( posedge CLK or negedge RESET ) begin  if ( !RESET )   Q <= 1'b0 ;  else   Q <= D ; end always @ ( posedge CLK or negedge RESET ) begin  if ( !RESET )   xQ <= 1'b1 ;  else   xQ <= ~D ; end これで2つです ^^; 1つのFFと書いておられますが、それはTTLの7474 とかに入っているDFFのイメージですよね。 プリミティブには、Q,xQは別々のFFと言えます。実際reg宣言は別々にしますよね?

billy0104
質問者

お礼

ご回答ありがとうございます。 返事遅くなって申し訳ございません。 趣旨としては、Veriog-HDLの勉強をしていた時、 他のサイトで、自分が質問した記述が 「これを2つのalways文で書くことも出来ますよね。」 のように書かれていて、ずっと悩んでいたのです。 これで、スッキリしました。ありがとうございます。

関連するQ&A

  • verilog HDL のレジスタ記述について

    こんにちは verilog初心者です。論理合成をしていて気になる点があったので質問させていただきました。 二つのクロックの立ち上がりで書き込むレジスタを記述していて、 (全て1bit、clkはクロック) always @(posedge clk1 or posedge clk2) begin q <= d; end としたところ、シミュレーションはできますが論理合成はできませんでした。 自分の持っている参考書に「複数の書き込み信号があるレジスタはない」という記述があったので一応納得しました。 ところが、 always @(posedge clk1 or posedge clk2) begin if (clk1==1) q <= d; else if (clk2==1) q <= d; end と記述すると論理合成できてしまいます。 両者の書き込み信号に対する振る舞いは同じように思うのですが、一体何が違うのでしょうか。 わかる方いましたら是非ご教示下さい。よろしくお願いします。

  • 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をアサートする方法を教えていただけないでしょうか。 よろしくお願い致します。

  • verilog HDLについての質問

    verilogで以下のようなコードだと、エラーが起こります。 何故起こるのか、対処法はどのようにすればよいか教えてください。 //-----ソースコード---------------------------- modele Test(CLK1,CLK2,PG1); input CLK1; input CLK2; output PG1; reg dmy; always @(posedge CLK) begin dmy = 1; end always @(posedge CS) begin dmy = 0; end assign PG1 = dmy; //-----エラー内容------------------------------- Only one always block may assign a given variable dmy //-----以上---------------------------------------- regは複数のalwaysで変化させることはできませんということでしょうが、なぜでしょうか。

  • Verilog HDL で 74165 相当の機能

    Verilog HDL で非同期のパラレル入力をシフトレジスタで取り出したいので、SN74165 相当の機能を次の式のように考えました。 always @(negedge clk or load or indt) begin if (load) begin sftdt <= indt; end else if (!load) begin sftdt <= {sftdt[6:0], 1'b0}; end end SILOS でシュミレートしたところ、思ったように動作しましたが、 Quatus IIでは、次のエラーが出てしまいます。 single- and double-edge expressions are not supported 良い方法は無いでしょうか。

  • Verilog HDLについて質問

    以下のプログラムを入力し、試してもうまくいきません。どこがいけないのでしょうか。 しようとおもっていることを大まかにいうと、 ・x1の立ち上がりに、money1に1を足す ・x2の立ち上がりに、money2に2を足す ・クロックの立ち上がりに、sumにmoney1とmoney2を足したものを入れて、 sumが3だったら、z1に割り当てたLEDを光らせる sumが4だったら、z2に割り当てたLEDを光らせる というものです。 試してみると結果はz1,z2両方のLEDが、x1,x2を立ち上げなくても最初から光ってしまいます。 module vendmachine(x1,x2,z1,z2,clk); input x1,x2,clk; output z1,z2; reg [2:0] money1; reg [2:0] money2; reg [2:0] sum; reg ledz1,ledz2; always@(posedge x1) begin money1=money1+3'd1; end always@(posedge x2) begin    money2=money2+3'd2; end always@(posedge clk) begin sum=money1+money2; if(sum==3'd3)begin ledz1=1'b1; end if(sum==3'd4)begin ledz1=1'b1; ledz2=1'b1; end end assign z1=ledz1; assign z2=ledz2; endmodule

  • Verilog記述方法に関して

    以下の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 以上

  • verilogでのwhile文について質問

    verilog初心者です。 while文での処理を記述していたのですが、 下記のように変更するとエラーとなってしまいます。 なんとか出来る方法はないでしょうか? module TEST(in_data, state, clock, reset, out); input [9:0] in_data; input [5:0] state; input clock; input reset; output [5:0] out; reg [5:0] out; always@(posedge clock or negedge reset) begin if(reset == 0) begin out = 0; end else begin out = in_data; while(out > 7)begin out = out >> 1; end end end // always@ (posedge clock or negedge reset) endmodule // TEST 上のように書くと、合成でき、シミュレーションでも期待する値は得ることが出来ました。 以下のようにwhile文を変更するとエラーとなってしまいます。 while(out > state)begin out = out >> 1; end よろしくお願いします。

  • 2ビットのレジスタのVerilog HDL記述

    QuatusIIで2ビットのレジスタをつくっているのですが、ブロック図をコンパイルするときにエラーがでてしまいます。 エラー内容をみるとVerilog HDL記述が間違えているみたいなのですが、どこが間違えているか教えてください。 /* REG2 */ module REG2module ( EN, CLR_B, IN1, IN2, CLK, Q ); input CLR_B, CLK; input IN1, IN2; output [1:0] Q; output EN; assign EN=FUNC_EN (IN1, IN2); function FUNC_EN; input IN1,IN2; if (IN1>0|IN2>0) FUNC_EN=1; else FUNC_EN=0; endfunction wire [1:0] D; CONECT (IN1,D[0]); CONECT (IN2,D[1]); reg [1:0] Q; always @( posedge CLK or negedge CLR_B ) if( !CLR_B ) Q <= 0; else if(EN) Q <= D; endmodule エラーにはError: Node instance "comb_8" instantiates undefined entity "CONECT" Error: Node instance "comb_9" instantiates undefined entity "CONECT" と出ています。意味を調べたのですが、CONECTが定義されていない?という事は具体的にどうすればいいでしょうか。 CONECT (IN1,D[0]); CONECT (IN2,D[1]); の部分が間違っているのはなんとなくわかるのですが、どうしたらいいかわかりません。 よろしくお願いします

  • verilogである信号の数クロック遅れの信号を生成させる記述方法をお

    verilogである信号の数クロック遅れの信号を生成させる記述方法をお伺いします。 動作記述でOKです。 通常、「sig_a」 から2クロック遅れの「sig_b」を生成させるのなら: > sig_a - 2clockおくれ -> sig_b ----------------------------------- reg [2:0] regs; assign sig_b = regs[2]; asisgn regs[0] = sig_a; always @(posedge CLK) regs[2:0] <= {regs[1:0], sig_a}; ----------------------------------- のように、パイプラインに信号を通すことで実現できるですが、 何クロック遅れるかを可変(動的に設定する)としたいのです。 動作モデル的な記述で簡単にかけないのでしょうか? ------------------------------------ [NGの例]: これだとNcycle_delayがSIM途中で更新されたとき、反映できない。。。 initial begin  sig_b <= #D 1'b0;   while(1) begin   repeat(Ncycyle_delay) @(posedge CLK);    while(1) begin     sig_b <= sig_a;     repeat(1) @(posedge CLK);    end   end end ------------------------------------ 宜しくお願い致します。

  • 「入門Verilog HDL記述」 の 一例について

    「入門Verilog HDL記述」を読みながらVerilog を勉強中なのですが、周りに聞ける人がいないので、質問させてください。 (ちなみに VHDL は習得しているつもりです。) いろいろ疑問点があるので、分けて何点か質問させていただきました。 改訂版 入門Verilog HDL記述の240ページのリスト II.5に generate ブロックと if 分についての以下のようなコードがありますが、 これは期待通りには動かないと思うのですが。。。 module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); parameter sel_type = 1; generate if(sel_type == 1) begin: sel_always reg [3:0] dout; always @* begin if(sel) dout <= d1; else dout <= d0; end end else if(sel_type == 2) begin: sel_cond wire [3:0] dout; assign dout = (sel == 1) ? d1 : d0; end endgenerate endmodule ModelSimでシミュレーションしてみましたが、generate文の中の reg [3:0] dout は generate 文の中のスコープでのみ定義されているらしく、 output [3:0] dout とは別の信号らしいです。よってoutputには何も代入されず。 試しに、xilinx の ISE でコンパイルしてみたが、やっぱり output には なにも接続されず、セレクタなんて生成されませんでした。 そもそも module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); reg [3:0] dout; みたいに書くと、2回宣言されているとなってエラーになります。 よって、参照ソースコードみたいに reg と wire を切り替えるような書き方はそもそもできないのでは? 皆さんどう思われますか? (インデントがうまくいかず、読みづらくてすいません。)

専門家に質問してみよう