数値が2**MAX - 1
であるunsigned(MAX downto 0)
がある場合、VHDL(87 | 93 | 200X)規格では1ずつインクリメントしたときの動作を定義していますか? (または、同様に、私は0から1で、それをデクリメントするとき?)VHDL numeric_stdのオーバーフローが符号付き/符号なしで定義されています
答えて
短い答え:オーバーフローの取り扱いはありません
、オーバーフローキャリーは、単純に失われます。したがって、結果は単純に演算の整数結果モジュロ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)
は正常に計算され、最後のキャリーボット値は無視されます。
は、私がここにCでまたはVerilogのように/アンダーフローをオーバーフローするunsigned
を望むとの問題を私が思い付いたものです持っていた(result
とdelta
はunsigned
です):オーバーフロー'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が除去されます。アンダーフローと同じです。
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へのハットチップ。
- 1. 符号付き整数オーバーフローが定義されていませんが、なぜturbo c符号付き整数が毎回オーバーフローするのですか?
- 2. VHDLで符号なし
- 3. 符号なしIntのオーバーフロー
- 4. 裸の `char32_t`は符号付きか符号なしですか?
- 5. VHDLの符号付き信号の平均操作
- 6. 符号なしの符号付き変換をJavaで逆
- 7. 符号付きと符号なしの数字の解釈
- 8. 符号付きバイトを符号なしハーフバイトにする
- 9. 符号なしと符号付きバイナリ整数への追加
- 10. 符号なし文字と符号付き文字の比較
- 11. キャストと符号なしから符号付きへのキャスト
- 12. Goで符号付き整数のオーバーフローが検出されました
- 13. JNLP:符号付きコード内に符号なしコードをロード
- 14. vs2015警告C4018: '<=':符号付き/符号なし不一致
- 15. 符号付き16進数減算対符号なし
- 16. 符号付きビットシフト
- 17. 符号なしnビットと符号付きnビットの違いは?
- 18. 万一のCbCr値は、符号付きまたは符号なしこと
- 19. Androidで符号なしint型符号付き整数への変換
- 20. C符号付きを符号なしに維持する正確なビット
- 21. オーディオPCMサンプルの符号なしshortを符号付きshortに変換する
- 22. C++符号付き整数式と符号なし整数式の比較
- 23. 符号付きNaN値
- 24. 符号なし
- 25. VHDLの符号付きと符号なしの両方の数値をどのように扱うことができますか?
- 26. 8ビット符号なしPCMを8ビット符号付きPCMに変換
- 27. 6502メモリに格納されたバイトは符号付きか符号なしですか?
- 28. 32ビットプロセッサで符号付き整数と符号なし整数を使用して符号付き64ビット整数を作成する方法
- 29. 符号なしと符号付きの数値のnumpyの合計が浮動小数点になります
- 30. 符号付き2進数と符号付き2進数除算
正確には私が欲しかった参照の種類です。(キャリービットについての私の前のコメントを無視してください、私は機能を誤読しました!) – detly
@detly:あなたは歓迎です – wap26
この回答は、長さはMAX + 1です。MAXという名前を使用すると問題が発生します。サブタイプの指示(索引範囲)が31 downto 0で長さが32(somename'length)である符号なしとして宣言されているsomenameの場合、右インデックスが0の最大値は2 ** 32 -1です。 – user1155120