2013-11-26 20 views
5

これはかなり簡単な質問ですが、私はまだこの仕事をすることはできませんでした。 。VHDL - 9ビットベクトルに2つの8ビットベクトルを追加する

私がしようとしているのは、2つの8ビットベクトルを加算し、その結果を9ビットベクトルに格納することだけです。

signal operand1, operand2 : STD_LOGIC_VECTOR(7 downto 0); 

signal sum : STD_LOGIC_VECTOR(8 downto 0); 

sum <= operand1 + operand2; 

私は警告を取得しかし:

Width mismatch. <sum> has a width of 9 bits but assigned expression is 8-bit wide. 

は、VHDLは、余分なビットは、ほかのオーバーフローのために必要であることを知っているルーチンに建てられたのいくつかの並べ替えを持っているべきではないでしょうか。

私は、これらのパッケージには含まれています:おそらくSTD_LOGIC_VECTORは常に署名され

use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

を?もしそうなら、私はそれらを明示的に符号なしとして定義する必要がありますか?

答えて

11

をあなたの目標は、あなたの信号に算術演算を行うジョブのより良い最適なタイプでそれらを宣言するのが習慣に取得している場合:unsignedintegerがに適していますあなたの場合。

sum <= ('0' & operand1) + ('0' & operand2); 
+4

また、SIGNED型でも動作します。例えば、sum <= RESIZE(operand1、operand1'LENGTH + 1)+ RESIZE(operand2、operand2'LENGTH + 1)のようにnumeric_stdライブラリからRESIZEを使用できます。 – sbell

+0

ジェネリックの場合は@sbell +1溶液! – rick

-6

これを試してください:より長いベクトルに書き込む前に結果を論理的に '0'ベクトルと結合してください。私にとってはうまくいった。

sum <= '0' & (operand1 + operand2); 

希望に役立ちます:)

+0

私は 'sum <=" 0 "&operand1 +" 0 "&operand2'を試しましたが、これはトリックでした!ありがとう。値が9ビットにオーバーフローしたが、少なくともコードが不平を言っていない場合、VHDLのやり方についてはまだ混乱しています – krb686

+2

このコードに問題があります:合計が255を超えると、オーバーフローして間違った結果を返します。オーバーフローを防ぐには、結果に行うのではなく、各オペランドに先行する '0'を連結する必要があります。汎用ソリューションの場合は、sum301 = 0、&operand1 +( '0'&operand2); ' – rick

1

上記の提案は正しいです:符号なしまたは署名を使用するかわりに、結果にそれを行うの、主要な各オペランドに「0」を連結しなければならないのオーバーフローを防ぐために

注意演算回路を実装するときはと入力してください(コードにnumeric_stdパッケージを含めてください)。

あなたのケースでは(オペランドの最大と比較して)、余分なビットを有するので、以下を行うことができる。

1)システムが符号なしの場合:

sum <= ('0' & operand1) + ('0' & operand2); 

2)システムが署名されている場合()符号拡張を必要とする:

sum <= (operand1(N-1) & operand1) + (operand2(N-1) & operand2); 
+0

整数を使用することもできます(ベクトル型を使用する必要はありません)。 –

+0

興味深い...これはPedroniですか?http://books.google.co.uk/books/about/Circuit_Design_with_VHDL.html?id=b5NEgENaEn4C –

3

Use the standard ieee.numeric_std library.

は、その後、あなたの数字unsignedsignedタイプのいずれかを作り、そして便利なサイズ変更機能を利用します:何回もそれだけで、何の変換は必要ありません整数を使用する方がはるかに簡単だということを念頭に置いて

answer <= resize(operand1, answer'length) + resize(operand2, answer'length); 

そしてクマをし、算術演算では、サイズ変更のフープをジャンプする必要はありません!

関連する問題