2016-11-06 25 views
0

私は8ビット加算器を使って8ビット加算器を構成するためにVerilogコードを書いています。その8ビット加算器は、それぞれ8ビットバスの入力を2つ追加する必要があります。ここでは、単一の全加算器のためのコードは次のとおりです。8ビット加算器が正しく動作しない

module FullAdder(
input a_, 
input b_, 
input cin_, 
output sout_, 
output cout_ 
); 
wire temp1, temp2, temp3; 

assign sout_ = a_^b_^cin_; 
assign cout_ = ((a_ & b_) | (b_ & cin_) | (cin_ & a_)); 

endmodule 

そして、ここで全加算器を8回呼び出します8ビットの加算器modueのためのコードです。

module EightBitAdder(
input [7:0] a, 
input [7:0] b, 
//input cin, 
output cout, //carry; will be sent as OP, but won't be further used. 
output [7:0] sout //sum, sent as OP 
); 

wire try; 

begin 
FullAdder mg0(.a_(a[0]), .b_(b[0]), .cin_(0), .cout_(try), .sout_(sout[0])); 
FullAdder mg1(.a_(a[1]), .b_(b[1]), .cin_(try), .cout_(try), .sout_(sout[1])); 
FullAdder mg2(.a_(a[2]), .b_(b[2]), .cin_(try), .cout_(try), .sout_(sout[2])); 
FullAdder mg3(.a_(a[3]), .b_(b[3]), .cin_(try), .cout_(try), .sout_(sout[3])); 
FullAdder mg4(.a_(a[4]), .b_(b[4]), .cin_(try), .cout_(try), .sout_(sout[4])); 
FullAdder mg5(.a_(a[5]), .b_(b[5]), .cin_(try), .cout_(try), .sout_(sout[5])); 
FullAdder mg6(.a_(a[6]), .b_(b[6]), .cin_(try), .cout_(try), .sout_(sout[6])); 
FullAdder mg7(.a_(a[7]), .b_(b[7]), .cin_(try), .cout_(try), .sout_(sout[7])); 
end 
endmodule 

出力が正しく表示されないという問題があります。常に最初のビットを表示し、残りのビットをdo not care(X)で埋めます。何が問題なの?

答えて

1

同じtryワイヤは全て8個の全加算器によって駆動され、これは全加算器から01で駆動の両方が行う場合X値をもたらす可能性が非常に高いです。

のように、代わりに行ってワイヤーを作る考えてみましょう:

wire [7:0] cout; 

と同様に、異なる全加算器に異なるビットを使用します。ヒントの

FullAdder mg0(.a_(a[0]), .b_(b[0]), .cin_(0), .cout_(cout[0]), .sout_(sout[0])); 
FullAdder mg1(.a_(a[1]), .b_(b[1]), .cin_(cout[0]), .cout_(cout[1]), .sout_(sout[1])); 
... 
+0

おかげで、私はまだですなぜ同じワイヤーで試してみるのが問題なのか明確ではない。すべての加算器は順番に実行されていたので、キャリーに同じ変数(ワイヤ)を使用することは問題ではないはずです。 – archity

+1

あなたの推論はソフトウェアを設計する際には理にかなっていますが、Verilogを書くときは実際にハードウェアを設計しています。つまり、ワイヤのようなリソースは、PCBの場合と同じように、出力と1つ以上の入力との間の単一の接続専用であり、ソフトウェア内の変数などの異なる目的で共有することはできません。ですから専用の接続ごとに専用のワイヤを作成する必要があります。これは 'wire [7:0] cout'で行います。 –

関連する問題