के लिए अतिप्रवाह परिभाषित किया गया है यदि मेरे पास है जिसमें 2**MAX - 1
मान है, तो VHDL (87 | 93 | 200X) मानकों को परिभाषित करें कि जब मैं इसे एक से बढ़ाता हूं तो क्या होता है? (या, इसी तरह, जब मैं यह एक के बाद शून्य से घटती?)क्या 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;
आप एक "अतिप्रवाह" देख सकते हैं तब होता है, CBIT='1'
(बिट कैरी) i = L_left
के लिए। परिणाम बिट RESULT(i)
सामान्य रूप से गणना की जाती है और अंतिम वाहक बॉट मान को अनदेखा किया जाता है।
मैं एक unsigned
चाहने सी में या 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
कमांड द्वारा हटा दिया जाता है जो सही ओवरफ्लो मान उत्पन्न करता है। अंडरफ्लो के लिए वही।
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: @ 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) का मान होता है। आपके गणित धर्म के आधार पर एक अंडरफ्लो या ओवरफ्लो।
लिंक किए गए नए प्रश्न में इसे इंगित करने के लिए जोनाथन डरोलेट को हैट टिप।
बिल्कुल वांछित संदर्भ मैं चाहता था, धन्यवाद :) (कृपया ले जाने के बारे में मेरी पिछली टिप्पणी को अनदेखा करें, मैंने फ़ंक्शन को गलत तरीके से पढ़ा है!) – detly
@detly: आपका स्वागत है – wap26
यह उत्तर भी गलत है MAX + की लंबाई 1. यह MAX नाम का उपयोग करने में एक समस्या है। सोमनाम को 31 से 0 के उपप्रकार संकेत (इंडेक्स रेंज) के साथ हस्ताक्षर किए जाने के लिए घोषित किया गया है और 32 की लंबाई (somename'length) 0 की दायां इंडेक्स के साथ अधिकतम मान 2 ** 32 -1 है। – user1155120