2012-02-09 6 views
5

मैं एक साधारण 16 बिट प्रोसेसर मैं एक Altera DE1 बोर्ड पर लागू करने के लिए कर रहा हूँ VHDL कोड में एक परिमित राज्य मशीन लिखने की कोशिश कर रहा हूँ। फाइनेट स्टेट मशीन में, मेरे पास CASE कथन है जो विभिन्न 16-बिट निर्देशों को संभालता है, जिन्हें 16-बिट STD_LOGIC_VECTOR द्वारा FSM में लाया जाता है। हालांकि, मुझे डिकोड राज्य में थोड़ी सी परेशानी हो रही है जहां परिमित राज्य मशीन निर्देश को डीकोड करती है। निर्देशों में से एक एक एडीडी है जो दो रजिस्टरों को ऑपरेंड के रूप में लेता है और गंतव्य रजिस्टर के रूप में तीसरा होता है। हालांकि, मेरे पास एक एडीडी निर्देश भी है जो एक रजिस्टर और 5-बिट तत्काल मूल्य ऑपरेटरों के रूप में और गंतव्य के लिए दूसरा रजिस्टर लेता है। मेरी समस्या यह है कि CASE कथन में, मुझे दो अलग-अलग एडीडी निर्देशों के बीच अंतर करने में सक्षम होना चाहिए। इसलिए, मैंने सोचा कि अगर मैं CASE कथन में "-" या "एक्स" जैसे वाइल्डकार्ड मानों का उपयोग करता हूं, तो मैं संभवतः सभी संभावित रजिस्टर/तत्काल मूल्य संयोजनों को सूचीबद्ध करने के बजाय दोनों के बीच अंतर करने में सक्षम होगा। उदाहरण के लिए:VHDL STD_LOGIC_VECTOR वाइल्डकार्ड मान

CASE IR IS --(IR stands for "Instruction Register") 
     WHEN "0001------0-----" => (Go to 3-register add); 
     WHEN "0001------1-----" => (Go to 2-register/immediate value add); 
     WHEN OTHERS => (Do whatever); 
    END CASE; 

ये मेरे पास केवल दो निर्देश नहीं हैं, मैंने इन पोस्ट को थोड़ा छोटा बनाने के लिए इन दोनों को रखा है। जब मैं संकलित करता हूं और इस कोड को चलाता हूं, तो जब प्रोसेसर "डीकोड" स्थिति में जाता है तो प्रोसेसर निष्पादित करना बंद कर देता है। इसके अलावा, क्वार्टस कई चेतावनियां देता है जैसे "एलसी 3FSM.vhd (37) पर वीएचडीएल पसंद चेतावनी: मेटा-वैल्यू" 0001 ------ 0 ----- "" " इसे पूरा करने के तरीके के बारे में एक नुकसान के रूप में। मैं वास्तव में नहीं करता हूं और शायद हर 16-बिट संयोजन को परिभाषित करने की आवश्यकता नहीं है, और मुझे आशा है कि एसटीडी_LOGIC_VECTOR में वाइल्डकार्ड का उपयोग करने के लिए संयोजनों की संख्या को कम करने के लिए वाइल्डकार्ड का उपयोग करने का एक तरीका है।

क्या कोई यह जानता है कि इसे कैसे पूरा किया जाए?

धन्यवाद

उत्तर

1

मान लिया जाये कि आप शिक्षा में अन्य बिट्स की जरूरत नहीं है आप एक पूर्व जांच प्रक्रिया के साथ अन्य बिट्स मास्किंग द्वारा इस के आसपास अपना रास्ता हैक कर सकता है। (या बस यह सुनिश्चित करें कि जब आप निर्देश लिखते हैं तो अन्य बिट्स रीसेट हो जाते हैं?)

यह वास्तव में एक हैक का थोड़ा सा है।

संभालने आईआर के रूप में संग्रहीत किया जाता है एक चर

if IR(15 downto 12) == "0001" then 
    IR := IR_in(15 downto 12) & "0000000" & IR_in(5) & "00000"; 
else 
    IR := IR_in 
end if; 

CASE IR IS --(IR stands for "Instruction Register") 
    WHEN "0001000000000000" => (Go to 3-register add); 
    WHEN "0001000000100000" => (Go to 2-register/immediate value add); 
    WHEN OTHERS => (Do whatever); 
END CASE; 

वैकल्पिक रूप से यह मानते हुए अपने अनुदेश चतुराई से बाहर सोचा है (पहले चार बिट्स आदेश शब्द या उन पंक्तियों के साथ कुछ कर रहे हैं?) आप नेस्ट मामले बयान करते हैं और कर सकता है उन उप ब्लॉक में आवश्यक भिन्नता।

+0

आह, आपके सुझाव के लिए पॉल सिब बहुत बहुत धन्यवाद। कल मैंने सवाल पूछने के बाद, मैंने प्रत्येक ऑपरेशन कोड के लिए 'केस' कथन का उपयोग करने और फिर अन्य आवश्यक तुलना करने के लिए 'IF' कथन का उपयोग करने का विचार किया। आपकी पहली विधि, हालांकि कोड को थोड़ा छोटा बनाता है, इसलिए मैंने इसका इस्तेमाल किया। धन्यवाद, आपके सुझाव के लिए मार्क थॉम्पसन भी। –

5

दुर्भाग्य से ऐसा नहीं किया जा सकता है। इसके बजाय अधिकांश उपयोगकर्ताओं के लिए अप्रत्याशित रूप से, तुलना ऑपरेटर = और case तुलना एक शाब्दिक तुलना निष्पादित करती है। ऐसा इसलिए है क्योंकि std_logic प्रकार केवल वर्णों का एक सेट है, जो अन्य कार्यों (जैसे and और or) के कारण तर्क मानों जैसे प्रदर्शन करने के लिए होता है।

वीएचडीएल -2008 एक नया केस स्टेटमेंट case? प्रस्तुत करता है जो आप अपेक्षा करते हैं - आपको वीएचडीएल 2008 मोड में काम करने के लिए अपने कंपाइलर को बताना होगा। इसके अलावा, वीएचडीएल 2008 में ?= ऑपरेटर है जो - एस का खाता लेते हुए दो मानों की तुलना करता है।

यदि आप एक कंपाइलर के साथ लम्बे हुए हैं जो अभी भी वीएचडीएल 2008 का समर्थन नहीं करता है, तो सप्लायर को शिकायत करें। std_match फ़ंक्शन भी आपको पुराने वीएचडीएल संशोधन में तुलना करने की अनुमति देता है, लेकिन case कथन इस तरह से काम करने के लिए मुझे कुछ भी पता नहीं है।

+1

+1 "आपूर्तिकर्ता से शिकायत" के लिए +1! – Philippe

+0

उन लोगों के लिए एक एफवाईआई, जो मुझे पसंद करते हैं, जो Xilinx ISE के साथ एक ही समस्या पर ठोकर खाने के बाद यहां आए थे: नया "मामला?" कथन (अधिकांश वीएचडीएल -2008 फीचर्स की तरह) v14.4 में मौजूद नहीं है (इस लेखन के समय के रूप में वर्तमान रिलीज) और यह स्पष्ट नहीं है कि यह भविष्य में कब होगा या नहीं। – MartyMacGyver

+0

वीएचडीएल 2008 के मामले के लिए बीटा समर्थन? 'विवाडो2014.3 में है [एआर # 62005] (http://www.xilinx.com/support/answers/62005.html)। आप निश्चित रूप से यह नहीं मानना ​​चाहते कि यह काम करने जा रहा है (जैसा कि बीटा है)। –

संबंधित मुद्दे