VHDL: एक INTEGER प्रकार से एक STD_LOGIC_VECTOR में परिवर्तित


28

मैंने एक मॉड -16 काउंटर बनाया है, और आउटपुट परिणाम एक INTEGER है (सभी उदाहरण जिन्हें मैंने INTEGER इस्तेमाल किया है)।

मैंने एक हेक्स-टू-7-सेगमेंट-डिस्प्ले डिकोडर बनाया है, और इसका इनपुट एक STD_LOGIC_VECTOR है (इसे इस तरह लिखा है क्योंकि सत्य तालिका को मैप करना आसान था)।

मैं काउंटर के आउटपुट को डिकोडर के इनपुट से कनेक्ट करना चाहता हूं, लेकिन मुझे क्वार्टार्टस में संकलन करने की कोशिश करते समय 'टाइप बेमेल' त्रुटियां मिलती हैं।

एक वीएचडीएल सूची में एक इंटीग्रियर प्रकार से एक STD_LOGIC_VECTOR प्रकार में बदलने का एक तरीका है?

जवाबों:


20

जैसा कि दूसरों ने कहा, उपयोग करें ieee.numeric_std, कभी नहीं ieee.std_logic_unsigned, जो वास्तव में IEEE पैकेज नहीं है।

हालाँकि, यदि आप VHDL 2008 समर्थन वाले टूल का उपयोग कर रहे हैं, तो आप नए पैकेज का उपयोग कर सकते हैं ieee.numeric_std_unsigned, जो अनिवार्य रूप से std_logic_vectorअहस्ताक्षरित की तरह व्यवहार करता है ।

इसके अलावा, जब से मैंने इसे स्पष्ट रूप से नहीं देखा था, एक (अहस्ताक्षरित) पूर्णांक से एक में बदलने के लिए यहां वास्तविक कोड उदाहरण है std_logic_vector:

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

16

जैसा कि लोनटेक कहता है, use ieee.numeric_stdक्या आपका दोस्त है। तुम एक में बदल सकते हैं std_logic_vectorएक करने के लिए integerहै, लेकिन आप के रूप में यह कास्ट करने के लिए होगा signedया unsignedपहले (संकलक के रूप में कोई जानकारी नहीं है जो आप का मतलब है)। VHDL एक जोरदार टाइप की गई भाषा है। मैंने अपने ब्लॉग पर इस विषय पर अधिक लिखा है

मौलिक रूप से, मैं आपके 7seg कनवर्टर को integer(या वास्तव में natural, यह देखते हुए कि यह केवल सकारात्मक संख्या से निपटने के लिए जा रहा है) लेने के लिए बदल देगा - रूपांतरण तब एक सरल सरणी लुकअप है। रूपांतरणों के साथ एक निरंतर सरणी सेट करें और इसे उस पूर्णांक के साथ अनुक्रमणित करें जिसे आप इनपुट के रूप में इकाई पर उपयोग करते हैं।


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

1
यह एक 'नैतिकता' के मुद्दे की तुलना में कम है क्योंकि यह स्थिरता की गारंटी है। Num_std lib एक वास्तविक मानक है जिसे IEEE द्वारा स्थापित किया गया है, जबकि std_logic_unsigned लाइब्रेरी एक विक्रेता द्वारा बनाई गई थी, और उद्योग में बिना किसी वास्तविक औपचारिक परिभाषा के अपनाई गई थी। गैर-मानक लिबास के साथ क्रॉस-वेंडर संगतता की कोई गारंटी नहीं है, हालांकि यह आमतौर पर ठीक काम करता है। हालांकि अभी मानक पर आगे बढ़ना अच्छा है।
मैट सेग

1

मान लें कि आपके 4-बिट काउंटर में एक INTEGER आउटपुट SOME_INTEGER था, और आप इसे 4-बिट STD_LOGIC_VECTOR में बदलना चाहते थे।

SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);

आप इसका उपयोग सार्थक संख्याओं के साथ वैक्टर को इनिशियलाइज़ करने के लिए भी कर सकते हैं

SOME_VECTOR <= conv_std_logic_vector(9, 4); -- instead of "1001"

मुझे लगता है कि आपको "IEEE.STD_LOGIC_ARITH.ALL का उपयोग करने" की आवश्यकता हो सकती है। और / या STD_LOGIC_UNSIGNED।

पूरक ऑपरेशन conv_integer (वेक्टर) है। जब मैं तुलना करता हूं तो मुझे इसका उपयोग करना पसंद है। इसलिए मैं घोषणा कर सकता हूं

constant SOME_CONSTANT : integer := 999;

और फिर, बाद में, मैं इसे एक बयान में उपयोग कर सकता हूं

if (conv_integer(SOME_VECTOR)=SOME_CONSTANT)
  then OTHER_VECTOR <= (others => '0');
end if;

संपादित करें: आपको चर को पूर्णांक के रूप में घोषित करने की आवश्यकता नहीं है। इसके बजाय std_logic_vector के लिए घोषणा को बदलने का प्रयास करें। + और - ऑपरेटर std_logic_vectors पर काम करते हैं।


3
कृपया यह मत करो! Num_std का उपयोग करें (लोनटेक और मेरे उत्तर देखें)
मार्टिन थॉम्पसन

यदि आपके पास इसे करने का एक बेहतर तरीका है, तो यह ठीक है, लेकिन मेरा सुझाव काम करता है इसलिए मुझे लगता है कि आपका डाउन वोट अनावश्यक था। मैंने सालों से std_logic_arith का उपयोग किया है और मुझे इससे कोई समस्या नहीं है। मुझे लगता है कि विक्रेताओं द्वारा अपने कार्यान्वयन को बदलने के बारे में आशंका निराधार है; उनके सही दिमाग में क्या विक्रेता अपने ग्राहकों के डिजाइन को तोड़ने का जोखिम उठाएगा?
ajs410

1
आपके पास पहले से ही एक उत्तर है कि क्या विक्रेता वसीयत से आईईईई के नाम स्थान पर विशिष्ट विशिष्ट सामान रखेगा। यह कच्चा रहता है, खासकर जब हस्ताक्षरित और अहस्ताक्षरित मूल्यों के साथ काम करते हैं।
यान वर्नियर

"+ और - ऑपरेटर std_logic_vectors पर काम करते हैं।" AFAIK, वे काम नहीं करते हैं, जब तक कि मैं आपके अर्थ को गलत नहीं समझता। यह आमतौर पर एक प्रकार पर हस्ताक्षर करने के लिए आवश्यक है जो पहले हस्ताक्षरित / अहस्ताक्षरित डेटा रखता है।
छंद्री

1

आप प्रकारों के उपयोग से unsignedऔर इसमें रुचि ले सकते हैं । वे संगत हैं , लेकिन उनकी एक संख्यात्मक व्याख्या (बाइनरी या 2-पूरक) है। इस तरह की व्याख्या को रखने का विकल्प भी है , लेकिन यह अनुशंसित नहीं हैsignedieee.numeric_stdstd_logic_vectorstd_logic_vector


0

जैसा कि मुख्य उत्तर कहता है, अनुशंसित विधि इस प्रकार है:

use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

हालाँकि, मैं इस बारे में विस्तार से बताना चाहूंगा कि यह क्यों अनुशंसित है, और क्यों VHDL में पूर्णांक को std_logic_vectors में परिवर्तित करने का ऐसा प्रतीत होता है।

यह नीचे आता है कि इन प्रकारों को उपकरण द्वारा कैसे देखा जाता है।

एक standard_logic_vector सचमुच 1s या 0s का एक गुच्छा है। मेरे पास 10001 है। यह कौन सी संख्या है? अच्छा वह निर्भर करता है। क्या यह हस्ताक्षरित या अहस्ताक्षरित है? Ths SLV को पता नहीं है या परवाह नहीं है। कितने बिट्स? खैर, आपका एसएलवी कब तक है?

एक पूर्णांक पर हस्ताक्षर किए जाते हैं, और आमतौर पर 32 बिट्स (यदि मुझे सही याद है)।

स्टेज 1: मेरे पूर्णांक को छोटा और अहस्ताक्षरित करें। यह हिस्सा है:

to_unsigned(my_int, my_slv'length));

"मेरे पास यह पूर्णांक है, मैं चाहता हूं कि यह अहस्ताक्षरित हो, और मैं चाहता हूं कि यह मेरे एसएलवी की लंबाई में फिट हो।"

स्टेज 2: फिर, उन बिट्स को ले जाएं और उन्हें my_slv ड्राइव करने के लिए उपयोग करें।

my_slv <= std_logic_vector(...)

"इन बिट्स को ले लो, और उन्हें मेरे एसएलवी को चलाने के लिए उपयोग करें"

(शब्दावली पर एक नोट। A <= Bवीएचडीएल में जोर से पढ़ा जाता है "ए बी द्वारा संचालित है")

संयुक्त, यह आपको मिलता है:

my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));

पारंपरिक प्रोग्रामिंग पृष्ठभूमि से आने के दौरान, प्रोग्रामिंग के तरीके में फंसना बहुत आसान है। लेकिन VHDL में आपके द्वारा लिखे गए कोड का हार्डवेयर में भौतिक प्रभाव है। यह जानने के लिए कि यह विधि क्यों काम करती है और इसकी सिफारिश की जाती है, यह सोचने के लिए एक कदम करीब है कि आप हार्डवेयर शब्दों में क्या लिख ​​रहे हैं।

बोनस टिप: to_ द्वारा उपसर्ग किए गए कार्य हैं जो ऑपरेंड को छोटा / परिवर्तित करते हैं। वे उन्हें अहस्ताक्षरित या एक निश्चित लंबाई या दोनों बनाते हैं। यही कारण है कि to_unsigned आपको लंबाई निर्दिष्ट करने की आवश्यकता है। इस प्रकार के बिना सीधे_ संगत होने पर, to_ (स्ट्रेट std_logic_vector (...) का उपयोग किया जाता है। "इन बिट्स को लें और उन्हें इस प्रकार से भर दें, कोई संशोधन आवश्यक नहीं है"। इनका एक लंबा तर्क नहीं है क्योंकि दोनों पक्ष पहले से ही समान हैं। इसलिए इस तरह की चीजों का निर्माण करते समय, मुझे इसे देखने की जरूरत नहीं है, मैं सिर्फ यह सोचता हूं कि मैं डेटा कैसे बदल रहा हूं।


0

पूर्णांक को std_logic_vector में बदलने के लिए आपके पास कई विकल्प हैं। Num_std का उपयोग करना:

vect <= std_logic_vector( to_unsigned( your_int, vect'length));

या

vect <= std_logic_vector( to_signed( your_int, vect'length));

Std_logic_arith का उपयोग करना:

vect <= conv_std_logic_vector( your_int, vect'length);

std_logic_arith एक आईईई मानक नहीं है, लेकिन अधिकांश उपकरण इसे IEEE लाइब्रेरी में संकलित करते हैं और इसका व्यापक रूप से उपयोग किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.