2012-08-02 34 views
5

के लिए अतिप्रवाह परिभाषित किया गया है यदि मेरे पास है जिसमें 2**MAX - 1 मान है, तो VHDL (87 | 93 | 200X) मानकों को परिभाषित करें कि जब मैं इसे एक से बढ़ाता हूं तो क्या होता है? (या, इसी तरह, जब मैं यह एक के बाद शून्य से घटती?)क्या VHDL numeric_std हस्ताक्षरित/हस्ताक्षरित

उत्तर

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; 

आप एक "अतिप्रवाह" देख सकते हैं तब होता है, CBIT='1' (बिट कैरी) i = L_left के लिए। परिणाम बिट RESULT(i) सामान्य रूप से गणना की जाती है और अंतिम वाहक बॉट मान को अनदेखा किया जाता है।

+0

बिल्कुल वांछित संदर्भ मैं चाहता था, धन्यवाद :) (कृपया ले जाने के बारे में मेरी पिछली टिप्पणी को अनदेखा करें, मैंने फ़ंक्शन को गलत तरीके से पढ़ा है!) – detly

+0

@detly: आपका स्वागत है – wap26

+0

यह उत्तर भी गलत है MAX + की लंबाई 1. यह MAX नाम का उपयोग करने में एक समस्या है। सोमनाम को 31 से 0 के उपप्रकार संकेत (इंडेक्स रेंज) के साथ हस्ताक्षर किए जाने के लिए घोषित किया गया है और 32 की लंबाई (somename'length) 0 की दायां इंडेक्स के साथ अधिकतम मान 2 ** 32 -1 है। – user1155120

1

मैं एक unsigned चाहने सी में या Verilog में के रूप में/अधःप्रवाह से ऊपर जाने का और यहाँ के साथ समस्या यह है कि मैं क्या के साथ आया है लिया है (result और deltaunsigned हैं):

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 कमांड द्वारा हटा दिया जाता है जो सही ओवरफ्लो मान उत्पन्न करता है। अंडरफ्लो के लिए वही।

1

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) का मान होता है। आपके गणित धर्म के आधार पर एक अंडरफ्लो या ओवरफ्लो।

लिंक किए गए नए प्रश्न में इसे इंगित करने के लिए जोनाथन डरोलेट को हैट टिप।