2016-10-07 15 views
1

ザイリンクスVivadoでカスタムコプロセッサIPをテストしています。 2つの32ビットベクトルに対して '*'演算子を使用して符号なし乗算を実行すると、結果が32ビットを超えると、上位32ビット、つまり上位32ビットに反映されないことがわかりましたがすべて0で、下位32ビットが結果の一部を表示します。IEEE.numeric_stdで '*'演算子を使用した場合のオーバーフローの処理

16449 * 4171239345 gives 613432305 

私はnumeric_stdライブラリを読み、それが読み取ります

-- Id: A.15 
    function "*" (L, R: UNSIGNED) return UNSIGNED; 
    -- Result subtype: UNSIGNED((L'LENGTH+R'LENGTH-1) downto 0). 
    -- Result: Performs the multiplication operation on two UNSIGNED vectors 
    -- that may possibly be of different lengths. 

は、32ビットを超える乗算するのに適していない「*」演算子ですか?

ありがとうございます!

+0

をさんは、この動作を示しMCVEを見てみましょう。 'ieee.numeric_std.unsigned。" * ""演算子が32ビットに制限される理由はありません。 –

答えて

1

表示されている乗算は、の整数にを乗じたようです。整数はvhdlでは32ビットに制限され、通常は署名されます。したがって、2番目の数値は表現するには大きすぎます(16進数:0xf8a00fb1)。特定のコードサンプルがなければ、この値でもシミュレータで正しく解釈されないと私は想定します。

Numeric_stdのunsignedの値は、任意の幅に限定されません。すべての値にunsignedタイプを使用すると、混乱を避けることができます。例えば。あなたは、これが信号に行われる必要がある場合、宣言:

signal a: unsigned(31 downto 0); 
signal b: unsigned(31 downto 0); 
signal y: unsigned(63 downto 0); 

ボディ:

a <= x"00004041"; 
b <= x"f8a00fb1"; 
y <= a*b; 
+0

@CasperW説明に感謝!! –

+0

あなたは大歓迎です。質問で乗算をどのようにしたかについてもう少し詳細を追加して、同様の問題がある場合は他の人が見つけることができます。 – Casperrw

関連する問題