如果我有一個包含值2**MAX - 1
的unsigned(MAX downto 0)
,那麼VHDL(87 | 93 | 200X)標準是否定義了當我將其增加1時會發生什麼? (或類似地,當我遞減它由一個從零?)爲VHDL定義溢出numeric_std有符號/無符號
回答
簡短的回答:
沒有溢出處理,溢流進位簡單地丟失。因此,結果就是您的操作modulo 2^MAX的整數結果。
較長答案:
的numeric_std
包是一個標準的包裝,但它是不是核心的VHDL標準(87,93,200X)。 參考:numeric_std.vhd
的+
操作者到底調用ADD_UNSIGNED (L, R : unsigned; C : std_logic)
函數(C = '0'
)。請注意,任何整數/自然操作數首先轉換爲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;
正如你可以看到一個 「溢出」 的發生,如果CBIT='1'
(進位)爲i = L_left
。結果位RESULT(i)
正常計算,最後一個進位bot值被忽略。
我已經與希望的unsigned
溢出/下溢在C或Verilog和這裏的問題是什麼,我想出了(result
和delta
是unsigned
):
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
對於溢出'0' & result
使得unsigned
大1位,以能夠正確地適應加法的值。然後通過resize
命令刪除MSB,該命令產生正確的溢出值。下溢也一樣。
對於MAX值等於7加1到2 ** 7 - 1(127)將導致值2 ** 7(128)。
的最大無符號值由一個無符號陣列型的長度來確定:
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;
集合體(others => '1')
表示「1」,其中是一個無符號陣列類型和表示最大二進制的somename
每個元素價值可能。
這給出:
foo.vhdl:15:9:@ 0毫秒:(報告注):somename'length = 8
foo.vhdl:16:9:@ 0毫秒:(報告記):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. 從numeric_std無符號轉換爲std_logic_vector在vhdl
- 2. 無符號VHDL
- 3. 無符號long long溢出
- 4. 無符號整型溢出
- 5. 爲什麼turbo c環繞有符號整數溢出每次雖然有符號整數溢出未定義?
- 6. 無符號溢出模運算符C
- 7. 是否定義了C#/ .NET有符號整數溢出行爲?
- 8. RuntimeError(符號表溢出(符號_one_time_conditions)。)
- 9. VHDL std_logic_vector轉換爲帶符號和無符號numeric_std
- 10. 我想乘以有符號和無符號vhdl
- 11. 如何處理VHDL中的有符號和無符號數字?
- 12. 符號整數溢出行爲
- 13. 定義默認int爲無符號int
- 14. 未定義的符號...運算符new(無符號長整數)
- 15. VHDL中的無符號文字
- 16. strcmp()和有符號/無符號字符
- 17. 查詢SQLite返回有符號int16,但被定義爲無符號
- 18. 如何創建大於2³¹-1的numeric_std有符號值?
- 19. REE 187 RuntimeError(符號表溢出(符號_one_time_conditions)。):
- 20. €符號未定義
- 21. 未定義符號
- 22. 未定義符號
- 23. 如何預先確定無符號計算可能溢出?
- 24. RAND_MAX宏:有符號還是無符號?
- 25. 有符號和無符號整數?
- 26. Integer.parseInt() - 有符號和無符號數
- 27. C++有符號/無符號不匹配
- 28. C89:有符號/無符號不匹配
- 29. C++ 11類型(有符號+無符號)?
- 30. 如何檢查溢出轉換的char * []爲無符號短
正是我想要的那種引用,謝謝:)(請忽略我以前對於進位的評論,我誤讀了這個函數!) – detly 2012-08-02 12:41:20
@detly:不客氣 – wap26 2012-08-02 12:53:55
這個答案也是錯誤的, MAX + 1的長度。使用MAX名稱時出現問題。對於聲明爲無符號的某個名稱,其子類型指示(索引範圍)爲31 downto 0且長度爲32(somename'length),右邊索引爲0的最大值爲2 ** 32 -1。 – user1155120 2015-06-03 02:58:15