2016-04-16 25 views
0

sel=0とモジュール減算器を実装する場合、sel=1の場合はモジュール加算器を実装します。条件付きで別のモジュール内のモジュールを呼び出すためにgenerateを使うことができることを知りました。case文を使用して条件付きでモジュールを呼び出す

3.   module checker(o,a,b,sel); 
4.   output reg o; 
5.   input a,b,sel; 
6.   [email protected](*) 
7.   begin 
8.   generate 
9.   case (sel)        
10.  1'b0 : adder a1(.sum(o),.a(a),.b(b)); 
11.  1'b1 : subtractor s1(.diff(o),.a(a),b(b)); 
12.  endcase 
13.  endgenerate 
14.  end 
15.  endmodule 

     //errors shown are: 

    D:/FILES/verilog files/Neha/checker.v" Line 8: Syntax error near "generate". 
    D:/FILES/verilog files/Neha/checker.v" Line 11: Port connections cannot be mixed ordered and named. 
    D:/FILES/verilog files/Neha/checker.v" Line 13: Syntax error near "endgenerate". 
    D:/FILES/verilog files/Neha/checker.v" Line 10: Instantiation is not allowed in sequential area except checker instantiation. 
    D:/FILES/verilog files/Neha/checker.v" Line 11: Instantiation is not allowed in sequential area except checker instantiation 

ありがとうございます!

答えて

2

ここでは、ソフトウェアを作成するのではなく、ハードウェアを設計しています。 Verilog moduleは、ハードウェアの一括です。 Verilog moduleを「電話」することはできません.PCI上のチップを「呼び出す」以上のことはできません。

お客様のadderおよびsubtractorモジュールは、ハードウェアの塊です。あなたはそれらを「呼び出す」ことはできません。 - おそらく、マルチプレクサ - 2つの出力を選択してo出力駆動するため何が必要一部のハードウェアである:ところで

module checker(o,a,b,sel); 
    output /* is this really 1 bit wide? */ o; 
    input /* are these really 1 bit wide? */ a,b; 
    input sel; 

    wire /* are these really 1 bit wide? */ sum, diff;; 

    adder  a1(.sum(sum), .a(a), .b(b)); 
    subtractor s1(.diff(diff), .a(a), .b(b)); 

    assign o = sel ? diff : sum; 

endmodule 

を - 確かにあなたの入力と出力は、以上の1ビット幅ですか?

+0

これは単なる例で、32ビット幅の入力と出力が必要です。 (すなわち、sel == 0、F.P加算が実行され、かつ、sel == 1 F.P乗算が実行される場合のように条件付きで)浮動小数点加算または乗算をcase文に基づいて行う必要がある! – Neha

+0

私は頼んでいることを理解しています! – Neha

+0

@Nehaこれは 'sel'_static_か_dynamic_ですか?静的だった場合は、実行しようとしたときに 'generate'文を使用することができます。しかし、それは 'checker'への入力であるため、' sel'は動的であるように見えます。この場合、@rahulcodesinverilogは言ったように、 'generate'文を使うことはできません。代わりに、両方のモジュールを_have_ _instantiate_(呼び出していない)にし、マルチプレクサを使用して出力を切り替えます(これまでのように)。なぜ 'case'文を使う必要があるのか​​よく分かりませんが、' case'文を使う必要がある場合は、 'assign'を' always'ブロックに置き換えてください。 –

1

このようにすることはできません。シミュレーション前にgenerateブロックが消去されているので、generatecaseにはパラメータまたはマクロが必要です。

selを両方のモジュールの入力として指定し、それに応じて操作を実行できます。 selによって

module add_sub(input a,b,sel,output wire [1:0] s); 

assign s = (sel) ? (a + b) : (a - b); 

endmodule 

、操作を実行する必要があります。ここでは

は、あなたのモジュールは次のように見ることができる方法です。

トップモジュールは、単にadd_subモジュールをインスタンス化します。

module checker(o,a,b,sel); 

add_sub a1(.a(a), .b(b), .sel(sel), .s(o)); 

endmodule 
+0

これは、条件付きでモジュールを呼び出す方法を学ぶための例です。実際に私は浮動小数点演算と浮動小数点加算と条件付きで行うことができる32ビットの入力と出力を必要とする浮動小数点演算に取り組んでいます! – Neha

0

パワーアップ中にハードウェアをオンザフライで生成することはできません。したがって、ロジックはそこになければなりません。

ゲートで保存したい場合は、1つの加算器と1つの減算器の代わりに1つの加算器を使用できます。 selectに基づいてbまたは-b(2の補数)値を渡します。このようにして、減算ロジックを節約できます。 下記の例を参考にして正しくコードしてください。

assign b_final = sel ? b : -b; 
assign s = a+ b_final; 
関連する問題