• 締切済み

Verilogの言語でわからないことが

Verilogの言語で書かれたソースを見ているのですがでわからないことがところが2つあります。 Q1. `define DELAY 1 COUNTER1 <= #(`DELAY) 5'b00000; という文ですが、#(`DELAY) がどのような作用をおこすのか教えてください。 Q2. reg [4:0] COUNTER1; // Down counter1 assign SJ_TMP2 = (|COUNTER1) == 1'b0) ? 1'b1 : 1'b0; という文ですが、|COUNTER1 の| の意味がよくわかりません。

みんなの回答

noname#26283
noname#26283
回答No.1

A1.  COUNTER1 <= #(`DELAY) 5'b00000; は、  COUNTER1 <= #1 5'b00000; と書くのと同じです。  つまり、`defineで定義した DELAY を 1 に自動的に置き換えてくれます。  1箇所だけだと、`defineを使ってもあまり意味がないのですが、ソース内で何箇所も書き換えたいとき、例えば、以下のような場合、`defineの行だけ書き換えれば、各行を書き換えずに済みます。  `define DELAY 100  COUNTER1 <= #(`DELAY) 5'b00000;  COUNTER2 <= #(`DELAY) 5'b00000;  COUNTER3 <= #(`DELAY) 5'b00000; Q2.  「|」がorの演算子というのは、ご存知ですよね?  演算子をビット幅のある信号の頭につけると、全ビットでその演算をすることになります。つまり、以下と同じことです。  assign SJ_TMP2 = (COUNTER1[0] | COUNTER1[1] | COUNTER1[2]| COUNTER1[3]| COUNTER1[4]) == 1'b0) ? 1'b1 : 1'b0;  はじめて見たときは、ん?という感じですが、とってもスマートな書き方で、便利だと思います。

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

関連するQ&A

  • Verilogの文法

    Verilogの文法について、教えてください。 下のリストのように、if文をネストして2つのカウンタを作っています。 reg1が特定の値になったらreg2をカウントアップするという動作です。 ここで、リスト真ん中当たりの、reg2がカウントアップされるところで、 ネストしたif文(※1の箇所)のelseを入れると、そのif文の上(※2)が 実行されません。 Verilogの場合、elseは直前のif文に対応するはずなので、 影響してしまう理由が分かりません。 どなたか教えてください。 reg [9:0] reg1; // 水平レジスタ reg [9:0] reg2; // 垂直レジスタ always @(posedge clk25m or negedge rst_n) begin if(rst_n == 1'b0) begin // リセット reg1 <= 10'h000; reg2 <= 10'h000; end else if(clk25m == 1'b1) begin if(10'd800 < reg1) begin reg1 <= 10'h000; reg2 <= reg2 + 10'h001; // ※2 if(10'd600 < reg2) // ※1 reg2 <= 10'h000; // else // reg2 <= reg2; // コメントアウトしないと reg2 <= reg2 + 10'h001;(※2)が実行されない   end else reg1 <= reg1 + 10'h001; end else reg1 <= reg1; end

  • Verilogで動的なモジュールを作る方法

    Verilogで動的なモジュールを作る方法 たとえば、どのような周波数であっても 1秒のウェイトをする回路を作りたいと思っています。 試験的に、 `define time (1) //1S `define tCK (20) //周期20nS module wait( input iCLOCK, input inRESET, output reg oWAITEND); localparam = loop_end (1/(`time * 1000000000))/`tCK; reg [31 : 0] loop; always@(posedge iCLOCK or negedge inRESET)begin if(inRESET == 1'b0)begin loop <= 32'h00000000; end else begin if(loop < loop_end)begin loop <= loop + 32'h00000001; oWAITEND <= 1'b0; end else begin oWAITEND <= 1'b0; loop <= loop; end end end //always endmodule というものを作って、defineの値(このdefineは別ヘッダファイルからincludeしてやりました)を変えてやれば目的の周波数で動き、目的のウェイト作るモジュールををソース自体を変えずに得られると思いましたが、 シミュレーションではうまくいったものの、QuartusIIではうまく論理合成されませんでした。 もし、他に方法がありましたら教えていただけないでしょうか? よろしくおねがいします。

  • フリーのverilog-HDLシミュレータ

    Windows上で動作するフリーのverilog-HDLシミュレータを探しています。 Siliosが少し前までフリーでダウンロードできたそうなのですが、今はダウンロードが禁止されています。。 例えば、このような回路を波形を見ながら解析したいと考えています。 //○シミュレーション対象:4ビット加算回路 module adder ( a, b, q ); input [3:0] a,b; output [3:0] q; assign q = a + b; endmodule //○シュミレーション記述 `timescale 1us/1us module adder_test; reg [3:0] a,b; wire [3:0] q; parameter STEP=1000 adder adder ( a, b, q ); initial begin a = 4'h0; b = 4'h0; #STEP a = 4'h5; b = 4'ha; #STEP a = 4'h7; b = 4'ha; #SEEP $finish; end endmodule

  • Verilog_HDLでのdefineとifdef

    yahooやgoogleで念入りに調べたつもりですが、自分の求めているようなHPは見つからなかったので、こちらの掲示板に記載させて頂きます。 すみませんが、誰かVerilog_HDLに詳しい方ご教授願いますでしょうか。 (1)「define」と「parameter」の用途の違いについて。 (2)「`ifdef」文と「if」文の用途の違いについて。 (3)「ifdef」の"def"は「define」の意味でしょうか。 -「define」の意の場合、「`ifdef <define_name>」のように<>の記述はdefineで定義された変数しか使用できないのでしょうか。 (4)下記例のように"test1/2"に定義値を持たせない場合は、どのようにして"test1/2"に値をアサインすれば宜しいのでしょうか。 サンプル記述例) `define test1 //定義値なしのdefine `define test2 `ifdef test1 //test1を真・偽させたい。 ------ `elsif test2 //test2を真・偽させたい。 ------ `endif (5)「ifdef」や「task」は、合成目的ではないテストベンチ等に使用するものと思っていましたが、「ifdef」や「task」を用いて組み合わせ回路等を開発したりするのでしょうか。 以上です。 すみませんが何方か宜しくお願いします。

  • 「入門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 を切り替えるような書き方はそもそもできないのでは? 皆さんどう思われますか? (インデントがうまくいかず、読みづらくてすいません。)

  • 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による設計において

    現在Z8085のCPUを設計しており、テンポラリレジスタにラッチする部分でなかなか上手くいきませんので質問させていただきます。 always文を使用したステートマシンにより制御しようとしているのですが次のようなWarningが出ます。 Warning: Latch IR[0]$latch has unsafe behavior Warning: Latch IR[1]$latch has unsafe behavior            : Warning: Latch IR[7]$latch has unsafe behavior Warning: Latch TMP1[0]$latch has unsafe behavior Warning: Latch TMP1[1]$latch has unsafe behavior            : Warning: Latch TMP1[7]$latch has unsafe behavior Warning: Latch TMP2[0]$latch has unsafe behavior Warning: Latch TMP2[1]$latch has unsafe behavior            : Warning: Latch TMP2[7]$latch has unsafe behavior Warning: Latch NEXT_STATE[0]$latch has unsafe behavior Warning: Latch NEXT_STATE[1]$latch has unsafe behavior <ソース> module CPU_TMP( CLK, nRST, FROM_DCD, IR, TMP1, TMP2, STATE, NEXT_STATE ); input CLK;//クロック input nRST;//リセット input [7:0] FROM_DCD;//入力命令 output [7:0] IR;//命令レジスタ output [7:0] TMP1;//テンポラリレジスタ1 output [7:0] TMP2;//テンポラリレジスタ2 output [1:0] STATE;//現在のステート output [1:0] NEXT_STATE;//次のステート reg [7:0] IR; reg [7:0] TMP1; reg [7:0] TMP2; reg [1:0] STATE; reg [1:0] NEXT_STATE; //状態 parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; parameter SD = 2'b11; //命令 parameter INRA = 8'h11; parameter MVIA = 8'h22; parameter JMP = 8'h33; always @( posedge CLK ) begin     if( nRST == 0 )       STATE <= SD;     else       STATE <= NEXT_STATE; end always @( STATE ) begin    case( STATE )      SD : begin            IR <= 0;            TMP1 <= 0;            TMP2 <= 0;            NEXT_STATE <= S0;          end      S0 : begin            IR <= FROM_DCD;            case( FROM_DCD )              INRA : NEXT_STATE <= S0;              MVIA : NEXT_STATE <= S1;              JMP : NEXT_STATE <= S2;            endcase          end      S1 : begin              TMP1 <= FROM_DCD;              NEXT_STATE <= S0;          end      S2 : begin              TMP2 <= FROM_DCD;              NEXT_STATE <= S0;          end endcase end endmodule どのようにしたらこのWarningを消すことができるでしょうか。

  • verilog 符号付加減算(最上位符号拡張)について教えてください

    verilog初心者で、(2の補数形式)符号付加減乗算器を作成しています。 …が符号拡張のところで解決できずにいます f(--;) もとの数a,bの最上位ビット(符号ビット)を16ビット分(乗算器に あわせ)増やすことは理解できたのですが、それをどうverilog 記述すればいいのかわかりません。下記にある記述ではエラーと なってしましました。 0拡張や、演算結果の最上位ビットだけを符号ビットにしてみたりし たのですが、これではダメとのことで もうどうやったらいいのか わからなくなってきました。(TT); どなたか教えてください。 m(_ _)m -------------------------------------------------------------- module kadai(a,b,c,q); input [15:0] a,b; input [2:0] c; output [32:0] q; wire [32:0] q; assign q =(c == 3'b000)?{16{a[0]},a}+{16{b[0]},b}: (c == 3'b001)?{16{a[0]},a}-{16{b[0]},b}:      (c == 3'b010)?{16{a[0]},a}*{16{b[0]},b}; endmodule ---------------------------------------------------------------- {16{a[0]},a}や{16{a[0]},b}という表現がいけないようなのですが… よろしくお願い致します。

  • verilog初心者です 符号拡張について教えください

    また似たような質問で申しわけないです。(T T;) 入力16ビット、出力を32ビット(←乗算器にもつなぐ入力の為)全加算器verilog記述についての質問です ****************************************************************//fulladder_16.v `timescale 1ns/10ps module fulladder_16(a,b,q); input [15:0] a,b; output [32:0] q; wire [15:0] cin; //module fulladd.v instance fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(q[0]),.cout(cin[0])); fulladd add1(.a(a[1]),.b(b[1]),.cin(cin[0]),.q(q[1]),.cout(cin[1])); fulladd add2(.a(a[2]),.b(b[2]),.cin(cin[1]),.q(q[2]),.cout(cin[2])); : : fulladd add14(.a(a[14]),.b(b[14]),.cin(cin[13]),.q(q[14]),.cout(cin[14])); fulladd add15(.a(a[15]),.b(b[15]),.cin(cin[14]),.q(q[15]),.cout(cin[15])); /*fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(q[0]),.cout(cin[0])); fulladd add1[15:1](.a(a[15:1]),.b(b[15:1]),.cin(cin[14:0]),.q(q[15:1]),.cout(cin[15:1]));*/ assing q = {{17{q[15]}},q}; endmodule /*ここでqの17~33bit目までを、上の記述のqの最上位ビットで拡張したくてこのように記述したのですが、この記述ではうまくいきません。 q =(算出された16ビットの最上位ビット × 17)と(算出された16ビット)  で33ビットにしたいわけです。どのように記述したらいいでしょうか?教えてください!!m(_ _)m ちなみにインスタンスしたのはしたの全加算器です //fulladder `timescale 1ns/10ps module fulladd(a,b,cin,q,cout); input a,b,cin; output q,cout; assign q = a^b^cin; assign cout = (a & b)|(b & cin)|(cin & a); endmodule

このQ&Aのポイント
  • 30*50の正しい内容のラベルに続いて白の印刷されないラベルが複数枚出る。用紙の状態を確認してください。というエラーメッセージが画面に出ている。
  • プリンタのみでシール発行中で、接続はなく、関連するソフト・アプリもない状態で白のラベルが正しく印刷されない問題が発生しています。
  • ブラザー製品 【TD-2135NSA】 の使用中に白いラベルが余分に出てきてしまう問題があります。問題の解決には、用紙の状態を確認し、必要な設定を行う必要があります。
回答を見る

専門家に質問してみよう