2012-08-02 19 views

答えて

6

短い答え:オーバーフローの取り扱いはありません

、オーバーフローキャリーは、単純に失われます。したがって、結果は単純に演算の整数結果モジュロ2^MAXです。

長い答え:

numeric_stdパッケージは標準パッケージであるが、それはないですが、コアVHDL規格(87,93,200X)です。参考 :numeric_std.vhd

端における+オペレータが(C = '0'有する)ADD_UNSIGNED (L, R : unsigned; C : std_logic)関数を呼び出します。整数/自然数のオペランドは、まずunsignedに変換されます。

関数の定義は次のとおりです。あなたが「オーバーフロー」を見ることができるように

function ADD_UNSIGNED (L, R : unsigned; C : std_logic) return unsigned is 
    constant L_left : integer := L'length-1; 
    alias XL  : unsigned(L_left downto 0) is L; 
    alias XR  : unsigned(L_left downto 0) is R; 
    variable RESULT : unsigned(L_left downto 0); 
    variable CBIT : std_logic := C; 
begin 
    for i in 0 to L_left loop 
     RESULT(i) := CBIT xor XL(i) xor XR(i); 
     CBIT  := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i)); 
    end loop; 
    return RESULT; 
end ADD_UNSIGNED; 

が発生した場合i = L_leftためCBIT='1'(キャリービット)。結果ビットRESULT(i)は正常に計算され、最後のキャリーボット値は無視されます。

+0

正確には私が欲しかった参照の種類です。(キャリービットについての私の前のコメントを無視してください、私は機能を誤読しました!) – detly

+0

@detly:あなたは歓迎です – wap26

+0

この回答は、長さはMAX + 1です。MAXという名前を使用すると問題が発生します。サブタイプの指示(索引範囲)が31 downto 0で長さが32(somename'length)である符号なしとして宣言されているsomenameの場合、右インデックスが0の最大値は2 ** 32 -1です。 – user1155120

1

は、私がここにCでまたはVerilogのように/アンダーフローをオーバーフローするunsignedを望むとの問題を私が思い付いたものです持っていた(resultdeltaunsignedです):オーバーフロー'0' & resultについては

result <= unsigned(std_logic_vector(resize(('1' & result) - delta, result'length))); -- proper underflow 
result <= unsigned(std_logic_vector(resize(('0' & result) + delta, result'length))); -- proper overflow 

加算の値を正確に収めることができるように1ビット大きいunsignedを作る。正しいオーバーフロー値をもたらすresizeコマンドによってMSBが除去されます。アンダーフローと同じです。

1

MAXの値が7の場合、1〜2 ** 7-1(127)を加算すると2 ** 7(128)になります。凝集(others => '1')符号なし配列型であり、最大バイナリを表すsomenameの各要素に「1」を表す

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity foo is 
end entity; 

architecture faa of foo is 
    constant MAX: natural := 7; 
    signal somename: unsigned (MAX downto 0) := (others => '1'); 
begin 
UNLABELED: 
    process 
    begin 
     report "somename'length = " & integer'image(somename'length); 
     report "somename maximum value = " &integer'image(to_integer(somename)); 
     wait; 
    end process; 
end architecture; 

最大符号なしの値は、符号なし配列型の長さによって決定されます値は可能です。

これにより与える:

foo.vhdl:15:9:@は0ms(レポート注):somename'length = 8
foo.vhdl:16:9:@は0ms(レポート注):somename最大値= 255

長さは8であり、符号なし配列タイプで表される数値の範囲は0〜2 ** 8 - 1(255)であり、可能な最大値は2より大きい** 7(128)、オーバーフローはありません。

これは新しい質問VHDL modulo 2^32 additionに気付かれました。あなたの受け入れられた答えのコンテキストでは、あなたは左端の値の代わりに長さを意味すると仮定します。

ゼロからの減少は、2 ** 8-1(255)(MAX = 7)という値になります。あなたの数学の宗教に応じてアンダーフローまたはオーバーフロー。

リンク先の新しい質問でこれを指摘するためのJonathan Droletへのハットチップ。

関連する問題