2011-05-27 15 views
13

मैं वीएचडीएल के लिए नया हूं और मुझे यह पता लगाने में परेशानी हो रही है कि किस डेटा प्रकार का उपयोग करने के लिए उपयुक्त हैं। अगर मैं सही ढंग से समझता हूं, संश्लेषण के लिए, सभी शीर्ष स्तरीय इकाई बंदरगाहों को या तो std_logic_vector या std_logic घोषित किया जाना चाहिए और कभी भी कोई अन्य प्रकार नहीं होना चाहिए।मुझे std_logic_vector का उपयोग कब करना चाहिए और मुझे अन्य डेटा प्रकारों का उपयोग कब करना चाहिए?

लेकिन std_logic_vector अंकगणित का समर्थन नहीं करता है तो मुझे इसे कैसे संभालना चाहिए?

मेरा अंतर्ज्ञान मुझे बताता है कि मुझे बस शीर्ष स्तर पर std_logic_vector का उपयोग करना चाहिए और फिर इसे अन्य संस्थाओं को पास करते समय अभिन्न डेटा प्रकारों में और उसके रूप में परिवर्तित करना चाहिए। क्या ये सही है?

और किस अभिन्न डेटा प्रकार (पूर्णांक, हस्ताक्षरित, हस्ताक्षरित) का उपयोग किया जाना चाहिए? मैं हस्ताक्षरित और हस्ताक्षरित के बीच का अंतर समझता हूं लेकिन मुझे पूर्णांक का उपयोग कब करना चाहिए?

उत्तर

16

बंदरगाहों सहित आपके मॉडलिंग उद्देश्यों के लिए सबसे उपयुक्त डेटा प्रकारों का उपयोग करें। यह सच नहीं है कि संश्लेषण की आवश्यकता है कि आपको केवल पोर्ट्स के लिए std_logic या std_logic_vector का उपयोग करना चाहिए। उन पर विश्वास न करें जो आपको अन्यथा बताते हैं।

यदि आपको अंकगणितीय समर्थन के साथ थोड़ा वैक्टर चाहिए, तो ieee.numeric_std से हस्ताक्षरित/हस्ताक्षरित पर विचार करें। (VHDL 2008 में, वहाँ एक मानक पैकेज कि std_logic_vector को गणित समर्थन जोड़ता है, लेकिन मुझे लगता है कि बुराई पर विचार करें।)

वहाँ केवल संश्लेषण के बाद बहुत शीर्ष स्तर के पर एक मुद्दा हो सकता है, जब आप अनुकरण करना चाहते हैं संश्लेषित नेट सूची। उस नेट सूची के पोर्ट प्रकार आपके शीर्ष-स्तर के आरटीएल इंटरफ़ेस से मेल नहीं खाते हैं। हालांकि, उस समय उचित रूपांतरण करके, आप गेट स्तर को तुरंत चालू करते समय आसानी से इसे ठीक कर सकते हैं। यह निम्न स्तर की चिंताओं के लिए उचित समय है - उन्हें आपकी आरटीएल मॉडलिंग शैली को प्रभावित नहीं करना चाहिए।

+0

तो फिर पूर्णांक का उपयोग करने में कुछ भी गलत नहीं है? –

+0

@Emil। यह सही है (कोर्स की पूर्णांक पूर्णांक उपप्रकार)। हालांकि, पूर्णांक में अभ्यास में 32-बिट सीमा (परेशान) होती है, जिसका अर्थ है कि आप हस्ताक्षरित/हस्ताक्षरित उदा। यदि आप parametrizability या स्थिरता के बारे में चिंतित हैं। –

+4

नाइटपिक (मुझे पता है कि जान यह जानता है, लेकिन मैं इसे पूर्णता के लिए इंगित करूंगा): मानक को "32-बिट्स नहीं" होने की गारंटी दी जाती है - वे (- 2 ** 31) -1) + ((2 ** 31) -1)। कई विक्रेता पूर्ण int32_t रेंज प्रदान करते हैं, लेकिन इसकी गारंटी नहीं है :( –

1

मैं सुझाव देता हूं कि आप std_logic और std_logic_vector का उपयोग न करें जब तक कि आप ट्रिस्टेट संकेतों को मॉडल करने का प्रयास न करें - जिसे मैं बुराई मानता हूं। इसके बजाय std_ulogic और std_ulogic_vector का उपयोग कर हल नहीं किया गया है। संकलन के दौरान अनसुलझे संकेतों के लिए एकाधिक असाइनमेंट का पता लगाने के लिए इसका लाभ है। हल संकेतों के साथ आप सिमुलेशन या संश्लेषण में देर से उस गलती का पता लगाएंगे।

दोष: यह सुझाव बहुत आम नहीं है और std_logic के साथ तृतीय-पक्ष तर्क का उपयोग करने के लिए कुछ टाइपकास्ट की आवश्यकता हो सकती है।

std_ulogic_vector के अंकगणित के लिए std_numeric का उपयोग करें। इसके बाद इसे ऑपरेशन से पहले हस्ताक्षरित या हस्ताक्षरित करने के लिए डालना आवश्यक है और परिणाम को वापस std_ulogic_vector पर डालना आवश्यक है। अनसुलझे सिग्नल के लिए मानक ieee.std_ulogic_unsigned लाइब्रेरी जैसी कोई चीज़ नहीं है।

adder_result <= std_ulogic_vector(unsigned(operant1) + unsigned(operant2)) ; 
increment <= std_ulogic_vector(unsigned(operant) + 1) ; 

एक तरफ पूर्णांक, प्राकृतिक, सकारात्मक और दूसरे पर हस्ताक्षर किए गए और हस्ताक्षरित के बीच का अंतर प्रतिनिधित्व है। हस्ताक्षरित और हस्ताक्षरित std_logic_vector के उप प्रकार हैं और std_logic तारों के बंडल (या अधिक सटीक सरणी) की तरह अधिक हैं।

पूर्णांक प्रकार एक संख्या का गणितीय प्रतिनिधित्व हैं। वे आम तौर पर जेनरिक, लूप और सरणी इंडेक्स जेनरेट के साथ अधिक उपयोग किए जाते हैं। लेकिन कभी-कभी संश्लेषण उन्हें अंकगणितीय इकाइयों के लिए भी संभाल सकता है।